xref: /dragonfly/stand/boot/pc32/libi386/libi386.h (revision 655933d6)
1 /*-
2  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/sys/boot/i386/libi386/libi386.h,v 1.16 2003/05/01 03:56:29 peter Exp $
27  */
28 
29 #include <machine/types.h>	/* XXX for vm_offset_t */
30 
31 /*
32  * i386 fully-qualified device descriptor.
33  * Note, this must match the 'struct devdesc' declaration
34  * in bootstrap.h.
35  */
36 struct i386_devdesc
37 {
38     struct devsw	*d_dev;
39     int			d_type;
40     union
41     {
42 	struct
43 	{
44 	    int		unit;
45 	    int		slice;
46 	    int		partition;
47 	    void	*data;
48 	} biosdisk;
49 	struct
50 	{
51 	    int		unit;
52 	    void	*data;
53 	} bioscd;
54 	struct
55 	{
56 	    int		unit;		/* XXX net layer lives over these? */
57 	} netif;
58     } d_kind;
59 };
60 
61 static __inline u_int
62 read_eflags(void)
63 {
64 	u_int	ef;
65 
66 	__asm __volatile("pushfl; popl %0" : "=r" (ef));
67 	return (ef);
68 }
69 
70 static __inline void
71 write_eflags(u_int ef)
72 {
73 	__asm __volatile("pushl %0; popfl" : : "r" (ef));
74 }
75 
76 /*
77  * Max number of sectors to bounce-buffer if the request crosses a 64k boundary
78  *
79  * Bounce buffers can no longer be malloc()'d because the malloc pool
80  * now uses high memory.  Declare statically.
81  */
82 #define BOUNCEBUF_SIZE  8192
83 #define BOUNCEBUF_SECTS (BOUNCEBUF_SIZE / BIOSDISK_SECSIZE)
84 
85 extern char	bounce_base[BOUNCEBUF_SIZE];
86 
87 int	i386_getdev(void **vdev, const char *devspec, const char **path);
88 char	*i386_fmtdev(void *vdev);
89 int	i386_setcurrdev(struct env_var *ev, int flags, const void *value);
90 
91 extern struct devdesc	currdev;	/* our current device */
92 
93 #define MAXDEV	31			/* maximum number of distinct devices */
94 
95 /* exported devices XXX rename? */
96 extern struct devsw bioscd;
97 extern struct devsw biosdisk;
98 extern struct devsw pxedisk;
99 extern struct fs_ops pxe_fsops;
100 
101 int	bc_add(int biosdev);		/* Register CD booted from. */
102 int	bc_getdev(struct i386_devdesc *dev);	/* return cdev_t for (dev) */
103 int	bc_bios2unit(int biosdev);	/* xlate BIOS device -> bioscd unit */
104 int	bc_unit2bios(int unit);		/* xlate bioscd unit -> BIOS device */
105 u_int32_t	bd_getbigeom(int bunit);	/* return geometry in bootinfo format */
106 int	bd_bios2unit(int biosdev);		/* xlate BIOS device -> biosdisk unit */
107 int	bd_unit2bios(int unit);			/* xlate biosdisk unit -> BIOS device */
108 int	bd_getdev(struct i386_devdesc *dev);	/* return cdev_t for (dev) */
109 
110 ssize_t	i386_copyin(const void *src, vm_offset_t dest, const size_t len);
111 ssize_t	i386_copyout(const vm_offset_t src, void *dest, const size_t len);
112 ssize_t	i386_readin(const int fd, vm_offset_t dest, const size_t len);
113 
114 struct preloaded_file;
115 void	bios_addsmapdata(struct preloaded_file *);
116 void	bios_getsmap(void);
117 
118 void	bios_getmem(void);
119 extern u_int32_t	bios_basemem;				/* base memory in bytes */
120 extern u_int32_t	bios_extmem;				/* extended memory in bytes */
121 extern vm_offset_t	memtop;
122 extern vm_offset_t	heapbase;
123 
124 void	biosacpi_detect(void);
125 
126 int	i386_autoload(void);
127 
128 int	bi_getboothowto(char *kargs);
129 vm_offset_t	bi_copyenv(vm_offset_t addr);
130 int	bi_load32(char *args, int *howtop, int *bootdevp, vm_offset_t *bip,
131 	    vm_offset_t *modulep, vm_offset_t *kernend);
132 int	bi_load64(char *args, vm_offset_t *modulep, vm_offset_t *kernend);
133 
134 void	pxe_enable(void *pxeinfo);
135