Merged mcb30-realmode-redesign back to HEAD
[people/xl0/gpxe.git] / src / include / etherboot.h
1 #ifndef ETHERBOOT_H
2 #define ETHERBOOT_H
3
4 #include <stdarg.h>
5 #include "osdep.h"
6
7 #ifndef BOOT_FIRST
8 #define BOOT_FIRST      BOOT_NIC
9 #endif
10 #ifndef BOOT_SECOND
11 #define BOOT_SECOND     BOOT_NOTHING
12 #endif
13 #ifndef BOOT_THIRD
14 #define BOOT_THIRD      BOOT_NOTHING
15 #endif
16
17 #define DEFAULT_BOOT_ORDER ( \
18         (BOOT_FIRST   << (0*BOOT_BITS)) | \
19         (BOOT_SECOND  << (1*BOOT_BITS)) | \
20         (BOOT_THIRD   << (2*BOOT_BITS)) | \
21         (BOOT_NOTHING << (3*BOOT_BITS)) | \
22         0)
23
24 #ifdef BOOT_INDEX
25 #define DEFAULT_BOOT_INDEX BOOT_INDEX
26 #else
27 #define DEFAULT_BOOT_INDEX 0
28 #endif
29
30 #if     !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE) && !defined(ELF64_IMAGE) && !defined(COFF_IMAGE) && !defined(RAW_IMAGE)
31 #define TAGGED_IMAGE            /* choose at least one */
32 #endif
33
34 #define K_ESC           '\033'
35 #define K_EOF           '\04'  /* Ctrl-D */
36 #define K_INTR          '\03'  /* Ctrl-C */
37
38 /*  Edit this to change the path to hostspecific kernel image
39     kernel.<client_ip_address> in RARP boot */
40 #ifndef DEFAULT_KERNELPATH
41 #define DEFAULT_KERNELPATH      "/tftpboot/kernel.%@"
42 #endif
43
44 #ifdef FREEBSD_PXEEMU
45 #undef DEFAULT_BOOTFILE
46 #ifndef PXENFSROOTPATH
47 #define PXENFSROOTPATH ""
48 #endif
49 #define DEFAULT_BOOTFILE        PXENFSROOTPATH "/boot/pxeboot"
50 #endif
51
52 #if     !defined(DOWNLOAD_PROTO_TFTP) && !defined(DOWNLOAD_PROTO_NFS) && !defined(DOWNLOAD_PROTO_SLAM) && !defined(DOWNLOAD_PROTO_TFTM) && !defined(DOWNLOAD_PROTO_DISK) && !defined(DOWNLOAD_PROTO_HTTP)
53 #error No download protocol defined!
54 #endif
55
56 #ifndef MAX_TFTP_RETRIES
57 #define MAX_TFTP_RETRIES        20
58 #endif
59
60 #ifndef MAX_BOOTP_RETRIES
61 #define MAX_BOOTP_RETRIES       20
62 #endif
63
64 #define MAX_BOOTP_EXTLEN        (ETH_MAX_MTU-sizeof(struct bootpip_t))
65
66 #ifndef MAX_ARP_RETRIES
67 #define MAX_ARP_RETRIES         20
68 #endif
69
70 #ifndef MAX_RPC_RETRIES
71 #define MAX_RPC_RETRIES         20
72 #endif
73
74 /* Link configuration time in tenths of a second */
75 #ifndef VALID_LINK_TIMEOUT
76 #define VALID_LINK_TIMEOUT      100 /* 10.0 seconds */
77 #endif
78
79 /* Inter-packet retry in ticks */
80 #ifndef TIMEOUT
81 #define TIMEOUT                 (10*TICKS_PER_SEC)
82 #endif
83
84 #ifndef BOOTP_TIMEOUT
85 #define BOOTP_TIMEOUT           (2*TICKS_PER_SEC)
86 #endif
87
88 /* Max interval between IGMP packets */
89 #define IGMP_INTERVAL                   (10*TICKS_PER_SEC)
90 #define IGMPv1_ROUTER_PRESENT_TIMEOUT   (400*TICKS_PER_SEC)
91
92 /* These settings have sense only if compiled with -DCONGESTED */
93 /* total retransmission timeout in ticks */
94 #define TFTP_TIMEOUT            (30*TICKS_PER_SEC)
95 /* packet retransmission timeout in ticks */
96 #ifdef CONGESTED
97 #define TFTP_REXMT              (3*TICKS_PER_SEC)
98 #else
99 #define TFTP_REXMT              TIMEOUT
100 #endif
101
102 #ifndef NULL
103 #define NULL    ((void *)0)
104 #endif
105
106 #include        "if_ether.h"
107
108 enum {
109         ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
110 #ifdef DNS_RESOLVER
111         ARP_NAMESERVER,
112 #endif
113 #ifdef PXE_EXPORT
114         ARP_PROXYDHCP,
115 #endif
116         MAX_ARP
117 };
118
119 #define IGMP_SERVER     0
120 #define MAX_IGMP        IGMP_SERVER+1
121
122 #define RARP_REQUEST    3
123 #define RARP_REPLY      4
124
125 #include        "in.h"
126
127 #define MULTICAST_MASK    0xF0000000
128 #define MULTICAST_NETWORK 0xE0000000
129
130 /* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
131 #define NON_ENCAP_OPT in_encapsulated_options == 0 &&
132 #ifdef ALLOW_ONLY_ENCAPSULATED
133 #define ENCAP_OPT in_encapsulated_options == 1 &&
134 #else
135 #define ENCAP_OPT
136 #endif
137
138 #include        "if_arp.h"
139 #include        "ip.h"
140 #include        "udp.h"
141 #include        "tcp.h"
142 #include        "bootp.h"
143 #include        "tftp.h"
144 #include        "igmp.h"
145 #include        "nfs.h"
146
147 struct arptable_t {
148         in_addr ipaddr;
149         uint8_t node[6];
150 } PACKED;
151
152 struct igmptable_t {
153         in_addr group;
154         unsigned long time;
155 } PACKED;
156
157 #define KERNEL_BUF      (BOOTP_DATA_ADDR->bootp_reply.bp_file)
158
159 #define FLOPPY_BOOT_LOCATION    0x7c00
160
161 struct rom_info {
162         unsigned short  rom_segment;
163         unsigned short  rom_length;
164 };
165
166 extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
167 {
168         return (assigned_rom_segment < 0xC000
169                 || assigned_rom_segment == rom->rom_segment);
170 }
171
172 /* Define a type for passing info to a loaded program */
173 struct ebinfo {
174         uint8_t  major, minor;  /* Version */
175         uint16_t flags;         /* Bit flags */
176 };
177
178 /***************************************************************************
179 External prototypes
180 ***************************************************************************/
181 /* main.c */
182 struct Elf_Bhdr;
183 extern int in_call(in_call_data_t *data, uint32_t opcode, va_list params);
184 extern void console_init(void); 
185 extern int main();
186 extern int loadkernel P((const char *fname));
187 extern char as_main_program;
188 /* nic.c */
189 extern void rx_qdrain P((void));
190 extern int tftp P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
191 extern int tftp_block P((struct tftpreq_info_t *, struct tftpblk_info_t *));
192 extern int ip_transmit P((int len, const void *buf));
193 extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol, 
194         int option_len, int len, const void *buf));
195 extern void build_udp_hdr P((unsigned long destip, 
196         unsigned int srcsock, unsigned int destsock, int ttl,
197         int len, const void *buf));
198 extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
199         unsigned int destsock, int len, const void *buf));
200 extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
201                        unsigned int destsock, long send_seq, long recv_seq,
202                        int window, int flags, int len, const void *buf);
203 int tcp_reset(struct iphdr *ip);
204 typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
205 extern int await_reply P((reply_t reply,        int ival, void *ptr, long timeout));
206 extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
207 extern void join_group(int slot, unsigned long group);
208 extern void leave_group(int slot);
209 #define RAND_MAX 2147483647L
210 extern uint16_t ipchksum P((const void *ip, unsigned long len));
211 extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
212 extern int32_t random P((void));
213 extern long rfc2131_sleep_interval P((long base, int exp));
214 extern long rfc1112_sleep_interval P((long base, int exp));
215 #ifndef DOWNLOAD_PROTO_TFTP
216 #define tftp(fname, load_block) 0
217 #endif
218 extern void cleanup P((void));
219
220 /* nfs.c */
221 extern void rpc_init(void);
222 extern int nfs P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
223 extern void nfs_umountall P((int));
224
225 /* proto_slam.c */
226 extern int url_slam P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
227
228 /* proto_tftm.c */
229 extern int url_tftm P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
230
231 /* config.c */
232 extern void print_config(void);
233
234 /* isa_probe.c and pci_probe.c */
235 struct dev;
236 extern void isa_enumerate(void);
237 extern int isa_probe(struct dev *, const char *);
238 extern void pci_enumerate(void);
239 extern int pci_probe(struct dev *, const char *);
240
241 /* heap.c */
242 extern void init_heap(void);
243 extern void *allot(size_t size);
244 void forget(void *ptr);
245 extern void *allot2(size_t size, uint32_t mask);
246 void forget2(void *ptr);
247 /* Physical address of the heap */
248 extern size_t heap_ptr, heap_top, heap_bot;
249
250 /* osloader.c */
251 /* Be careful with sector_t it is an unsigned long long on x86 */
252 typedef uint64_t sector_t;
253 typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
254 extern os_download_t probe_image(unsigned char *data, unsigned int len);
255 extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
256
257 /* misc.c */
258 extern void twiddle P((void));
259 extern void sleep P((int secs));
260 extern void interruptible_sleep P((int secs));
261 extern void poll_interruptions P((void));
262 extern int strcasecmp P((const char *a, const char *b));
263 extern char *substr P((const char *a, const char *b));
264 extern unsigned long strtoul P((const char *p, const char **, int base));
265 extern void printf P((const char *, ...));
266 extern int sprintf P((char *, const char *, ...));
267 extern int inet_aton P((const char *p, in_addr *i));
268
269 /* basemem.c */
270 extern uint32_t get_free_base_memory ( void );
271 extern void allot_real_mode_stack ( void );
272 extern void forget_real_mode_stack ( void );
273 extern void * allot_base_memory ( size_t );
274 extern void forget_base_memory ( void*, size_t );
275 extern void free_unused_base_memory ( void );
276 extern void forget_prefix_base_memory ( void );
277 extern void forget_runtime_base_memory ( uint32_t old_addr );
278
279 extern unsigned long get_boot_order(unsigned long order, unsigned *index);
280 #ifndef NORELOCATE
281 extern void relocate(void);
282 extern void relocate_to(unsigned long phys_dest);
283 #else
284 #define relocate() do {} while(0)
285 #endif
286 extern void disk_init P((void));
287 extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
288
289 /* start32.S */
290 struct os_entry_regs {
291         /* Be careful changing this structure
292          * as it is used by assembly language code.
293          */
294         uint32_t  edi; /*  0 */
295         uint32_t  esi; /*  4 */
296         uint32_t  ebp; /*  8 */
297         uint32_t  esp; /* 12 */
298         uint32_t  ebx; /* 16 */
299         uint32_t  edx; /* 20 */
300         uint32_t  ecx; /* 24 */
301         uint32_t  eax; /* 28 */
302         
303         uint32_t saved_ebp; /* 32 */
304         uint32_t saved_esi; /* 36 */
305         uint32_t saved_edi; /* 40 */
306         uint32_t saved_ebx; /* 44 */
307         uint32_t saved_eip; /* 48 */
308         uint32_t saved_esp; /* 52 */
309 };
310 struct regs {
311         /* Be careful changing this structure
312          * as it is used by assembly language code.
313          */
314         uint32_t  edi; /*  0 */
315         uint32_t  esi; /*  4 */
316         uint32_t  ebp; /*  8 */
317         uint32_t  esp; /* 12 */
318         uint32_t  ebx; /* 16 */
319         uint32_t  edx; /* 20 */
320         uint32_t  ecx; /* 24 */
321         uint32_t  eax; /* 28 */
322 };
323 extern struct os_entry_regs os_regs;
324 extern struct regs initial_regs;
325 extern int xstart32(unsigned long entry_point, ...);
326 extern int xstart_lm(unsigned long entry_point, unsigned long params);
327 extern void xend32 P((void));
328 struct Elf_Bhdr *prepare_boot_params(void *header);
329 extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
330 extern unsigned long currticks P((void));
331 extern void exit P((int status));
332 extern void _stack;
333 extern char _prefix_copy[512];
334 extern uint32_t image_basemem;
335
336 /* serial.c */
337 extern int serial_getc P((void));
338 extern void serial_putc P((int));
339 extern int serial_ischar P((void));
340 extern int serial_init P((void));
341 extern void serial_fini P((void));
342
343 /* floppy.c */
344 extern int bootdisk P((int dev,int part));
345
346 /* pxe_callbacks.c */
347 extern int pxe_in_call ( in_call_data_t *in_call_data, va_list params );
348
349 /***************************************************************************
350 External variables
351 ***************************************************************************/
352 /* main.c */
353 extern struct rom_info rom;
354 extern char *hostname;
355 extern int hostnamelen;
356 extern jmp_buf restart_etherboot;
357 extern int url_port;
358 extern struct arptable_t arptable[MAX_ARP];
359 extern struct igmptable_t igmptable[MAX_IGMP];
360 #ifdef  IMAGE_MENU
361 extern int menutmo,menudefault;
362 extern unsigned char *defparams;
363 extern int defparams_max;
364 #endif
365 #ifdef  MOTD
366 extern unsigned char *motd[RFC1533_VENDOR_NUMOFMOTD];
367 #endif
368 extern struct bootpd_t bootp_data;
369 #define BOOTP_DATA_ADDR (&bootp_data)
370 extern unsigned char *end_of_rfc1533;
371 #ifdef  IMAGE_FREEBSD
372 extern int freebsd_howto;
373 #define FREEBSD_KERNEL_ENV_SIZE 256
374 extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
375 #endif
376
377 /* bootmenu.c */
378
379 /* osloader.c */
380
381 /* created by linker */
382 extern char _virt_start[], _text[], _etext[], _text16[], _etext16[];
383 extern char _data[], _edata[], _bss[], _ebss[], _end[];
384
385
386 /*
387  * Local variables:
388  *  c-basic-offset: 8
389  * End:
390  */
391
392 #endif /* ETHERBOOT_H */