summaryrefslogtreecommitdiffstats
path: root/src/include/etherboot.h
diff options
context:
space:
mode:
authorMichael Brown2005-03-08 19:53:11 +0100
committerMichael Brown2005-03-08 19:53:11 +0100
commit3d6123e69ab879c72ff489afc5bf93ef0b7a94ce (patch)
tree9f3277569153a550fa8d81ebd61bd88f266eb8da /src/include/etherboot.h
downloadipxe-3d6123e69ab879c72ff489afc5bf93ef0b7a94ce.tar.gz
ipxe-3d6123e69ab879c72ff489afc5bf93ef0b7a94ce.tar.xz
ipxe-3d6123e69ab879c72ff489afc5bf93ef0b7a94ce.zip
Initial revision
Diffstat (limited to 'src/include/etherboot.h')
-rw-r--r--src/include/etherboot.h459
1 files changed, 459 insertions, 0 deletions
diff --git a/src/include/etherboot.h b/src/include/etherboot.h
new file mode 100644
index 00000000..3d01fb9e
--- /dev/null
+++ b/src/include/etherboot.h
@@ -0,0 +1,459 @@
+#ifndef ETHERBOOT_H
+#define ETHERBOOT_H
+
+#include <stdarg.h>
+#include "osdep.h"
+
+#ifndef BOOT_FIRST
+#define BOOT_FIRST BOOT_NIC
+#endif
+#ifndef BOOT_SECOND
+#define BOOT_SECOND BOOT_NOTHING
+#endif
+#ifndef BOOT_THIRD
+#define BOOT_THIRD BOOT_NOTHING
+#endif
+
+#define DEFAULT_BOOT_ORDER ( \
+ (BOOT_FIRST << (0*BOOT_BITS)) | \
+ (BOOT_SECOND << (1*BOOT_BITS)) | \
+ (BOOT_THIRD << (2*BOOT_BITS)) | \
+ (BOOT_NOTHING << (3*BOOT_BITS)) | \
+ 0)
+
+#ifdef BOOT_INDEX
+#define DEFAULT_BOOT_INDEX BOOT_INDEX
+#else
+#define DEFAULT_BOOT_INDEX 0
+#endif
+
+#if !defined(TAGGED_IMAGE) && !defined(AOUT_IMAGE) && !defined(ELF_IMAGE) && !defined(ELF64_IMAGE) && !defined(COFF_IMAGE) && !defined(RAW_IMAGE)
+#define TAGGED_IMAGE /* choose at least one */
+#endif
+
+#undef CODE16
+#if defined(PCBIOS)
+#define CODE16
+#endif
+
+#define K_ESC '\033'
+#define K_EOF '\04' /* Ctrl-D */
+#define K_INTR '\03' /* Ctrl-C */
+
+/* Edit this to change the path to hostspecific kernel image
+ kernel.<client_ip_address> in RARP boot */
+#ifndef DEFAULT_KERNELPATH
+#define DEFAULT_KERNELPATH "/tftpboot/kernel.%@"
+#endif
+
+#ifdef FREEBSD_PXEEMU
+#undef DEFAULT_BOOTFILE
+#ifndef PXENFSROOTPATH
+#define PXENFSROOTPATH ""
+#endif
+#define DEFAULT_BOOTFILE PXENFSROOTPATH "/boot/pxeboot"
+#endif
+
+/* Clean up console settings... mainly CONSOLE_FIRMWARE and CONSOLE_SERIAL are used
+ * in the sources (except start.S and serial.S which cannot include
+ * etherboot.h). At least one of the CONSOLE_xxx has to be set, and
+ * CONSOLE_DUAL sets both CONSOLE_CRT and CONSOLE_SERIAL. If none is set,
+ * CONSOLE_CRT is assumed. */
+#ifdef CONSOLE_CRT
+#define CONSOLE_FIRMWARE
+#endif
+#ifdef CONSOLE_DUAL
+#undef CONSOLE_FIRMWARE
+#define CONSOLE_FIRMWARE
+#undef CONSOLE_SERIAL
+#define CONSOLE_SERIAL
+#endif
+#if defined(CONSOLE_FIRMWARE) && defined(CONSOLE_SERIAL)
+#undef CONSOLE_DUAL
+#define CONSOLE_DUAL
+#endif
+#if !defined(CONSOLE_FIRMWARE) && !defined(CONSOLE_SERIAL)
+#define CONSOLE_FIRMWARE
+#endif
+
+#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)
+#error No download protocol defined!
+#endif
+
+#ifndef MAX_TFTP_RETRIES
+#define MAX_TFTP_RETRIES 20
+#endif
+
+#ifndef MAX_BOOTP_RETRIES
+#define MAX_BOOTP_RETRIES 20
+#endif
+
+#define MAX_BOOTP_EXTLEN (ETH_MAX_MTU-sizeof(struct bootpip_t))
+
+#ifndef MAX_ARP_RETRIES
+#define MAX_ARP_RETRIES 20
+#endif
+
+#ifndef MAX_RPC_RETRIES
+#define MAX_RPC_RETRIES 20
+#endif
+
+/* Link configuration time in tenths of a second */
+#ifndef VALID_LINK_TIMEOUT
+#define VALID_LINK_TIMEOUT 100 /* 10.0 seconds */
+#endif
+
+/* Inter-packet retry in ticks */
+#ifndef TIMEOUT
+#define TIMEOUT (10*TICKS_PER_SEC)
+#endif
+
+#ifndef BOOTP_TIMEOUT
+#define BOOTP_TIMEOUT (2*TICKS_PER_SEC)
+#endif
+
+/* Max interval between IGMP packets */
+#define IGMP_INTERVAL (10*TICKS_PER_SEC)
+#define IGMPv1_ROUTER_PRESENT_TIMEOUT (400*TICKS_PER_SEC)
+
+/* These settings have sense only if compiled with -DCONGESTED */
+/* total retransmission timeout in ticks */
+#define TFTP_TIMEOUT (30*TICKS_PER_SEC)
+/* packet retransmission timeout in ticks */
+#ifdef CONGESTED
+#define TFTP_REXMT (3*TICKS_PER_SEC)
+#else
+#define TFTP_REXMT TIMEOUT
+#endif
+
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+#include "if_ether.h"
+
+enum {
+ ARP_CLIENT, ARP_SERVER, ARP_GATEWAY,
+#ifdef DNS_RESOLVER
+ ARP_NAMESERVER,
+#endif
+#ifdef PXE_EXPORT
+ ARP_PROXYDHCP,
+#endif
+ MAX_ARP
+};
+
+#define IGMP_SERVER 0
+#define MAX_IGMP IGMP_SERVER+1
+
+#define RARP_REQUEST 3
+#define RARP_REPLY 4
+
+#include "in.h"
+
+#define MULTICAST_MASK 0xF0000000
+#define MULTICAST_NETWORK 0xE0000000
+
+/* Helper macros used to identify when DHCP options are valid/invalid in/outside of encapsulation */
+#define NON_ENCAP_OPT in_encapsulated_options == 0 &&
+#ifdef ALLOW_ONLY_ENCAPSULATED
+#define ENCAP_OPT in_encapsulated_options == 1 &&
+#else
+#define ENCAP_OPT
+#endif
+
+#include "if_arp.h"
+#include "ip.h"
+#include "udp.h"
+#include "tcp.h"
+#include "bootp.h"
+#include "tftp.h"
+#include "igmp.h"
+#include "nfs.h"
+
+struct arptable_t {
+ in_addr ipaddr;
+ uint8_t node[6];
+} PACKED;
+
+struct igmptable_t {
+ in_addr group;
+ unsigned long time;
+} PACKED;
+
+#define KERNEL_BUF (BOOTP_DATA_ADDR->bootp_reply.bp_file)
+
+#define FLOPPY_BOOT_LOCATION 0x7c00
+
+struct rom_info {
+ unsigned short rom_segment;
+ unsigned short rom_length;
+};
+
+extern inline int rom_address_ok(struct rom_info *rom, int assigned_rom_segment)
+{
+ return (assigned_rom_segment < 0xC000
+ || assigned_rom_segment == rom->rom_segment);
+}
+
+/* Define a type for passing info to a loaded program */
+struct ebinfo {
+ uint8_t major, minor; /* Version */
+ uint16_t flags; /* Bit flags */
+};
+
+/***************************************************************************
+External prototypes
+***************************************************************************/
+/* main.c */
+struct Elf_Bhdr;
+extern int in_call(in_call_data_t *data, uint32_t opcode, va_list params);
+extern void console_init(void);
+extern int main(in_call_data_t *data, va_list params);
+extern int loadkernel P((const char *fname));
+extern char as_main_program;
+/* nic.c */
+extern void rx_qdrain P((void));
+extern int tftp P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
+extern int tftp_block P((struct tftpreq_info_t *, struct tftpblk_info_t *));
+extern int ip_transmit P((int len, const void *buf));
+extern void build_ip_hdr P((unsigned long destip, int ttl, int protocol,
+ int option_len, int len, const void *buf));
+extern void build_udp_hdr P((unsigned long destip,
+ unsigned int srcsock, unsigned int destsock, int ttl,
+ int len, const void *buf));
+extern int udp_transmit P((unsigned long destip, unsigned int srcsock,
+ unsigned int destsock, int len, const void *buf));
+extern int tcp_transmit(unsigned long destip, unsigned int srcsock,
+ unsigned int destsock, long send_seq, long recv_seq,
+ int window, int flags, int len, const void *buf);
+int tcp_reset(struct iphdr *ip);
+typedef int (*reply_t)(int ival, void *ptr, unsigned short ptype, struct iphdr *ip, struct udphdr *udp, struct tcphdr *tcp);
+extern int await_reply P((reply_t reply, int ival, void *ptr, long timeout));
+extern int decode_rfc1533 P((unsigned char *, unsigned int, unsigned int, int));
+extern void join_group(int slot, unsigned long group);
+extern void leave_group(int slot);
+#define RAND_MAX 2147483647L
+extern uint16_t ipchksum P((const void *ip, unsigned long len));
+extern uint16_t add_ipchksums P((unsigned long offset, uint16_t sum, uint16_t new));
+extern int32_t random P((void));
+extern long rfc2131_sleep_interval P((long base, int exp));
+extern long rfc1112_sleep_interval P((long base, int exp));
+#ifndef DOWNLOAD_PROTO_TFTP
+#define tftp(fname, load_block) 0
+#endif
+extern void cleanup P((void));
+
+/* nfs.c */
+extern void rpc_init(void);
+extern int nfs P((const char *name, int (*)(unsigned char *, unsigned int, unsigned int, int)));
+extern void nfs_umountall P((int));
+
+/* proto_slam.c */
+extern int url_slam P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
+
+/* proto_tftm.c */
+extern int url_tftm P((const char *name, int (*fnc)(unsigned char *, unsigned int, unsigned int, int)));
+
+/* config.c */
+extern void print_config(void);
+
+/* isa_probe.c and pci_probe.c */
+struct dev;
+extern void isa_enumerate(void);
+extern int isa_probe(struct dev *, const char *);
+extern void pci_enumerate(void);
+extern int pci_probe(struct dev *, const char *);
+
+/* heap.c */
+extern void init_heap(void);
+extern void *allot(size_t size);
+void forget(void *ptr);
+extern void *allot2(size_t size, uint32_t mask);
+void forget2(void *ptr);
+/* Physical address of the heap */
+extern size_t heap_ptr, heap_top, heap_bot;
+
+/* osloader.c */
+/* Be careful with sector_t it is an unsigned long long on x86 */
+typedef uint64_t sector_t;
+typedef sector_t (*os_download_t)(unsigned char *data, unsigned int len, int eof);
+extern os_download_t probe_image(unsigned char *data, unsigned int len);
+extern int load_block P((unsigned char *, unsigned int, unsigned int, int ));
+
+/* misc.c */
+extern void twiddle P((void));
+extern void sleep P((int secs));
+extern void interruptible_sleep P((int secs));
+extern void poll_interruptions P((void));
+extern int strcasecmp P((const char *a, const char *b));
+extern char *substr P((const char *a, const char *b));
+extern unsigned long strtoul P((const char *p, const char **, int base));
+extern void printf P((const char *, ...));
+extern int sprintf P((char *, const char *, ...));
+extern int inet_aton P((const char *p, in_addr *i));
+#ifdef PCBIOS
+extern void gateA20_set P((void));
+#define gateA20_unset()
+#else
+#define gateA20_set()
+#define gateA20_unset()
+#endif
+extern void putchar P((int));
+extern int getchar P((void));
+extern int iskey P((void));
+
+/* pcbios.S */
+extern int console_getc P((void));
+extern void console_putc P((int));
+extern int console_ischar P((void));
+extern int getshift P((void));
+extern int int15 P((int));
+#ifdef POWERSAVE
+extern void cpu_nap P((void));
+#endif /* POWERSAVE */
+
+/* basemem.c */
+extern uint32_t get_free_base_memory ( void );
+extern void allot_real_mode_stack ( void );
+extern void forget_real_mode_stack ( void );
+extern void * allot_base_memory ( size_t );
+extern void forget_base_memory ( void*, size_t );
+extern void free_unused_base_memory ( void );
+extern void forget_prefix_base_memory ( void );
+extern void forget_runtime_base_memory ( uint32_t old_addr );
+
+struct e820entry {
+ uint64_t addr;
+ uint64_t size;
+ uint32_t type;
+#define E820_RAM 1
+#define E820_RESERVED 2
+#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
+#define E820_NVS 4
+} PACKED;
+#define E820ENTRY_SIZE 20
+#define E820MAX 32
+struct meminfo {
+ uint16_t basememsize;
+ uint16_t pad;
+ uint32_t memsize;
+ uint32_t map_count;
+ struct e820entry map[E820MAX];
+} PACKED;
+extern struct meminfo meminfo;
+extern void get_memsizes(void);
+extern unsigned long get_boot_order(unsigned long order, unsigned *index);
+#ifndef NORELOCATE
+extern void relocate(void);
+extern void relocate_to(unsigned long phys_dest);
+#else
+#define relocate() do {} while(0)
+#endif
+extern void disk_init P((void));
+extern unsigned int pcbios_disk_read P((int drv,int c,int h,int s,char *buf));
+
+/* start32.S */
+struct os_entry_regs {
+ /* Be careful changing this structure
+ * as it is used by assembly language code.
+ */
+ uint32_t edi; /* 0 */
+ uint32_t esi; /* 4 */
+ uint32_t ebp; /* 8 */
+ uint32_t esp; /* 12 */
+ uint32_t ebx; /* 16 */
+ uint32_t edx; /* 20 */
+ uint32_t ecx; /* 24 */
+ uint32_t eax; /* 28 */
+
+ uint32_t saved_ebp; /* 32 */
+ uint32_t saved_esi; /* 36 */
+ uint32_t saved_edi; /* 40 */
+ uint32_t saved_ebx; /* 44 */
+ uint32_t saved_eip; /* 48 */
+ uint32_t saved_esp; /* 52 */
+};
+struct regs {
+ /* Be careful changing this structure
+ * as it is used by assembly language code.
+ */
+ uint32_t edi; /* 0 */
+ uint32_t esi; /* 4 */
+ uint32_t ebp; /* 8 */
+ uint32_t esp; /* 12 */
+ uint32_t ebx; /* 16 */
+ uint32_t edx; /* 20 */
+ uint32_t ecx; /* 24 */
+ uint32_t eax; /* 28 */
+};
+extern struct os_entry_regs os_regs;
+extern struct regs initial_regs;
+extern int xstart32(unsigned long entry_point, ...);
+extern int xstart_lm(unsigned long entry_point, unsigned long params);
+extern void xend32 P((void));
+struct Elf_Bhdr *prepare_boot_params(void *header);
+extern int elf_start(unsigned long machine, unsigned long entry, unsigned long params);
+extern unsigned long currticks P((void));
+extern void exit P((int status));
+extern void _stack;
+extern char _prefix_copy[512];
+extern uint32_t image_basemem;
+
+/* serial.c */
+extern int serial_getc P((void));
+extern void serial_putc P((int));
+extern int serial_ischar P((void));
+extern int serial_init P((void));
+extern void serial_fini P((void));
+
+/* floppy.c */
+extern int bootdisk P((int dev,int part));
+
+/* pxe_callbacks.c */
+extern int pxe_in_call ( in_call_data_t *in_call_data, va_list params );
+
+/***************************************************************************
+External variables
+***************************************************************************/
+/* main.c */
+extern struct rom_info rom;
+extern char *hostname;
+extern int hostnamelen;
+extern jmp_buf restart_etherboot;
+extern int url_port;
+extern struct arptable_t arptable[MAX_ARP];
+extern struct igmptable_t igmptable[MAX_IGMP];
+#ifdef IMAGE_MENU
+extern int menutmo,menudefault;
+extern unsigned char *defparams;
+extern int defparams_max;
+#endif
+#ifdef MOTD
+extern unsigned char *motd[RFC1533_VENDOR_NUMOFMOTD];
+#endif
+extern struct bootpd_t bootp_data;
+#define BOOTP_DATA_ADDR (&bootp_data)
+extern unsigned char *end_of_rfc1533;
+#ifdef IMAGE_FREEBSD
+extern int freebsd_howto;
+#define FREEBSD_KERNEL_ENV_SIZE 256
+extern char freebsd_kernel_env[FREEBSD_KERNEL_ENV_SIZE];
+#endif
+
+/* bootmenu.c */
+
+/* osloader.c */
+
+/* created by linker */
+extern char _virt_start[], _text[], _etext[], _text16[], _etext16[];
+extern char _data[], _edata[], _bss[], _ebss[], _end[];
+
+
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
+
+#endif /* ETHERBOOT_H */