You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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