1 | /* boot.h - Info between different parts of boot. Author: Kees J. Bot
|
---|
2 | */
|
---|
3 |
|
---|
4 | #ifndef DEBUG
|
---|
5 | #define DEBUG 0
|
---|
6 | #endif
|
---|
7 |
|
---|
8 | /* Constants describing the metal: */
|
---|
9 |
|
---|
10 | #define SECTOR_SIZE 512
|
---|
11 | #define SECTOR_SHIFT 9
|
---|
12 | #define RATIO(b) ((b) / SECTOR_SIZE)
|
---|
13 |
|
---|
14 | #define PARAMSEC 1 /* Sector containing boot parameters. */
|
---|
15 |
|
---|
16 | #define DSKBASE 0x1E /* Floppy disk parameter vector. */
|
---|
17 | #define DSKPARSIZE 11 /* There are this many bytes of parameters. */
|
---|
18 |
|
---|
19 | #define ESC '\33' /* Escape key. */
|
---|
20 |
|
---|
21 | #define HEADERPOS 0x00600L /* Place for an array of struct exec's. */
|
---|
22 |
|
---|
23 | #define FREEPOS 0x08000L /* Memory from FREEPOS to caddr is free to
|
---|
24 | * play with.
|
---|
25 | */
|
---|
26 | #if BIOS
|
---|
27 | #define MSEC_PER_TICK 55 /* Clock does 18.2 ticks per second. */
|
---|
28 | #define TICKS_PER_DAY 0x1800B0L /* After 24 hours it wraps. */
|
---|
29 | #endif
|
---|
30 |
|
---|
31 | #if UNIX
|
---|
32 | #define MSEC_PER_TICK 1000 /* Clock does 18.2 ticks per second. */
|
---|
33 | #define TICKS_PER_DAY 86400L /* Doesn't wrap, but that doesn't matter. */
|
---|
34 | #endif
|
---|
35 |
|
---|
36 | #define BOOTPOS 0x07C00L /* Bootstraps are loaded here. */
|
---|
37 | #define SIGNATURE 0xAA55 /* Proper bootstraps have this signature. */
|
---|
38 | #define SIGNATOFF 510 /* Offset within bootblock. */
|
---|
39 |
|
---|
40 | /* BIOS video modes. */
|
---|
41 | #define MONO_MODE 0x07 /* 80x25 monochrome. */
|
---|
42 | #define COLOR_MODE 0x03 /* 80x25 color. */
|
---|
43 |
|
---|
44 |
|
---|
45 | /* Variables shared with boothead.s: */
|
---|
46 | #ifndef EXTERN
|
---|
47 | #define EXTERN extern
|
---|
48 | #endif
|
---|
49 |
|
---|
50 | typedef struct vector { /* 8086 vector */
|
---|
51 | u16_t offset;
|
---|
52 | u16_t segment;
|
---|
53 | } vector;
|
---|
54 |
|
---|
55 | EXTERN vector rem_part; /* Boot partition table entry. */
|
---|
56 |
|
---|
57 | EXTERN u32_t caddr, daddr; /* Code and data address of the boot program. */
|
---|
58 | EXTERN u32_t runsize; /* Size of this program. */
|
---|
59 |
|
---|
60 | EXTERN u16_t device; /* Drive being booted from. */
|
---|
61 |
|
---|
62 | typedef struct { /* One chunk of free memory. */
|
---|
63 | u32_t base; /* Start byte. */
|
---|
64 | u32_t size; /* Number of bytes. */
|
---|
65 | } memory;
|
---|
66 |
|
---|
67 | EXTERN memory mem[3]; /* List of available memory. */
|
---|
68 | EXTERN int mon_return; /* Monitor stays in memory? */
|
---|
69 |
|
---|
70 | typedef struct bios_env
|
---|
71 | {
|
---|
72 | u16_t ax;
|
---|
73 | u16_t bx;
|
---|
74 | u16_t cx;
|
---|
75 | u16_t flags;
|
---|
76 | } bios_env_t;
|
---|
77 |
|
---|
78 | #define FL_CARRY 0x0001 /* carry flag */
|
---|
79 |
|
---|
80 | /* Functions defined by boothead.s: */
|
---|
81 |
|
---|
82 | void exit(int code);
|
---|
83 | /* Exit the monitor. */
|
---|
84 | u32_t mon2abs(void *ptr);
|
---|
85 | /* Local monitor address to absolute address. */
|
---|
86 | u32_t vec2abs(vector *vec);
|
---|
87 | /* Vector to absolute address. */
|
---|
88 | void raw_copy(u32_t dstaddr, u32_t srcaddr, u32_t count);
|
---|
89 | /* Copy bytes from anywhere to anywhere. */
|
---|
90 | u16_t get_word(u32_t addr);
|
---|
91 | /* Get a word from anywhere. */
|
---|
92 | void put_word(u32_t addr, U16_t word);
|
---|
93 | /* Put a word anywhere. */
|
---|
94 | void relocate(void);
|
---|
95 | /* Switch to a copy of this program. */
|
---|
96 | int dev_open(void), dev_close(void);
|
---|
97 | /* Open device and determine params / close device. */
|
---|
98 | int dev_boundary(u32_t sector);
|
---|
99 | /* True if sector is on a track boundary. */
|
---|
100 | int readsectors(u32_t bufaddr, u32_t sector, U8_t count);
|
---|
101 | /* Read 1 or more sectors from "device". */
|
---|
102 | int writesectors(u32_t bufaddr, u32_t sector, U8_t count);
|
---|
103 | /* Write 1 or more sectors to "device". */
|
---|
104 | int getch(void);
|
---|
105 | /* Read a keypress. */
|
---|
106 | void scan_keyboard(void);
|
---|
107 | /* Read keypress directly from kb controller. */
|
---|
108 | void ungetch(int c);
|
---|
109 | /* Undo a keypress. */
|
---|
110 | int escape(void);
|
---|
111 | /* True if escape typed. */
|
---|
112 | void putch(int c);
|
---|
113 | /* Send a character to the screen. */
|
---|
114 | #if BIOS
|
---|
115 | void pause(void);
|
---|
116 | /* Wait for an interrupt. */
|
---|
117 | void serial_init(int line);
|
---|
118 | #endif /* Enable copying console I/O to a serial line. */
|
---|
119 |
|
---|
120 | void set_mode(unsigned mode);
|
---|
121 | void clear_screen(void);
|
---|
122 | /* Set video mode / clear the screen. */
|
---|
123 |
|
---|
124 | u16_t get_bus(void);
|
---|
125 | /* System bus type, XT, AT, or MCA. */
|
---|
126 | u16_t get_video(void);
|
---|
127 | /* Display type, MDA to VGA. */
|
---|
128 | u32_t get_tick(void);
|
---|
129 | /* Current value of the clock tick counter. */
|
---|
130 |
|
---|
131 | void bootstrap(int device, struct part_entry *entry);
|
---|
132 | /* Execute a bootstrap routine for a different O.S. */
|
---|
133 | void minix(u32_t koff, u32_t kcs, u32_t kds,
|
---|
134 | char *bootparams, size_t paramsize, u32_t aout);
|
---|
135 | /* Start Minix. */
|
---|
136 | void int15(bios_env_t *);
|
---|
137 |
|
---|
138 |
|
---|
139 | /* Shared between boot.c and bootimage.c: */
|
---|
140 |
|
---|
141 | /* Sticky attributes. */
|
---|
142 | #define E_SPECIAL 0x01 /* These are known to the program. */
|
---|
143 | #define E_DEV 0x02 /* The value is a device name. */
|
---|
144 | #define E_RESERVED 0x04 /* May not be set by user, e.g. 'boot' */
|
---|
145 | #define E_STICKY 0x07 /* Don't go once set. */
|
---|
146 |
|
---|
147 | /* Volatile attributes. */
|
---|
148 | #define E_VAR 0x08 /* Variable */
|
---|
149 | #define E_FUNCTION 0x10 /* Function definition. */
|
---|
150 |
|
---|
151 | /* Variables, functions, and commands. */
|
---|
152 | typedef struct environment {
|
---|
153 | struct environment *next;
|
---|
154 | char flags;
|
---|
155 | char *name; /* name = value */
|
---|
156 | char *arg; /* name(arg) {value} */
|
---|
157 | char *value;
|
---|
158 | char *defval; /* Safehouse for default values. */
|
---|
159 | } environment;
|
---|
160 |
|
---|
161 | EXTERN environment *env; /* Lists the environment. */
|
---|
162 |
|
---|
163 | char *b_value(char *name); /* Get/set the value of a variable. */
|
---|
164 | int b_setvar(int flags, char *name, char *value);
|
---|
165 |
|
---|
166 | void parse_code(char *code); /* Parse boot monitor commands. */
|
---|
167 |
|
---|
168 | extern int fsok; /* True if the boot device contains an FS. */
|
---|
169 | EXTERN u32_t lowsec; /* Offset to the file system on the boot device. */
|
---|
170 |
|
---|
171 | /* Called by boot.c: */
|
---|
172 |
|
---|
173 | void bootminix(void); /* Load and start a Minix image. */
|
---|
174 |
|
---|
175 |
|
---|
176 | /* Called by bootimage.c: */
|
---|
177 |
|
---|
178 | void readerr(off_t sec, int err);
|
---|
179 | /* Report a read error. */
|
---|
180 | char *ul2a(u32_t n, unsigned b), *ul2a10(u32_t n);
|
---|
181 | /* Transform u32_t to ASCII at base b or base 10. */
|
---|
182 | long a2l(char *a);
|
---|
183 | /* Cheap atol(). */
|
---|
184 | unsigned a2x(char *a);
|
---|
185 | /* ASCII to hex. */
|
---|
186 | dev_t name2dev(char *name);
|
---|
187 | /* Translate a device name to a device number. */
|
---|
188 | int numprefix(char *s, char **ps);
|
---|
189 | /* True for a numeric prefix. */
|
---|
190 | int numeric(char *s);
|
---|
191 | /* True for a numeric string. */
|
---|
192 | char *unix_err(int err);
|
---|
193 | /* Give a descriptive text for some UNIX errors. */
|
---|
194 | int run_trailer(void);
|
---|
195 | /* Run the trailer function. */
|
---|
196 |
|
---|
197 | #if DOS
|
---|
198 | /* The monitor runs under MS-DOS. */
|
---|
199 | extern char PSP[256]; /* Program Segment Prefix. */
|
---|
200 | EXTERN char *vdisk; /* Name of the virtual disk. */
|
---|
201 | EXTERN char *drun; /* Initial command from DOS command line. */
|
---|
202 | #else
|
---|
203 | /* The monitor uses only the BIOS. */
|
---|
204 | #define DOS 0
|
---|
205 | #endif
|
---|
206 |
|
---|
207 | void readblock(off_t, char *, int);
|
---|
208 | void delay(char *);
|
---|
209 |
|
---|
210 | /*
|
---|
211 | * $PchId: boot.h,v 1.12 2002/02/27 19:42:45 philip Exp $
|
---|
212 | */
|
---|