/* * Info we need to know from Etherboot */ #define MKNBI_VERSION "mknbi-" VERSION #define ESC '\033' #define TICKS_PER_SEC 18 #define ETH_ALEN 6 /* Size of Ethernet address */ #define ETH_HLEN 14 /* Size of ethernet header */ #define ETH_ZLEN 60 /* Minimum packet */ #define ETH_FRAME_LEN 1514 /* Maximum packet */ #ifndef ETH_MAX_MTU #define ETH_MAX_MTU (ETH_FRAME_LEN-ETH_HLEN) #endif typedef struct { unsigned long s_addr; } in_addr; #define DHCP_OPT_LEN 312 /* Vendor magic cookies in host order */ #define RFC_1048 0x63538263 #define VEND_CMU 0x00554D43 #define VEND_STAN 0x4E415453 #define VEND_EB 0x687445E4 /* äEth */ #define TAG_LEN(p) (*((p)+1)) #define RFC1533_PAD 0 /* tag for NO-OP */ #define RFC1533_NETMASK 1 /* tag for netmask */ #define RFC1533_GATEWAY 3 /* tag for gateway */ #define RFC1533_HOSTNAME 12 /* tag for host name */ #define RFC1533_ROOTPATH 17 /* tag for root directory */ #define RFC1533_VENDOR_MAJOR 0 #define RFC1533_VENDOR_MINOR 0 #define RFC1533_VENDOR_MAGIC 128 /* Etherboot identification */ #define RFC1533_VENDOR_ADDPARM 129 /* Addition to kernel command line */ #define RFC1533_VENDOR_ETHDEV 130 /* Device by which to find root FS */ #define RFC1533_VENDOR_ETHERBOOT_ENCAP 150 #define RFC1533_VENDOR_MENUOPTS 160 #define RFC1533_VENDOR_SELECTION 176 /* index to user selected image */ #define RFC1533_VENDOR_MOTD 184 #define RFC1533_VENDOR_NUMOFMOTD 8 #define RFC1533_VENDOR_IMG 192 #define RFC1533_VENDOR_NUMOFIMG 16 #define RFC1533_END 255 /* tag for end of record */ #define MAX_BOOTP_EXTLEN (ETH_MAX_MTU-sizeof(struct bootpip_t)) struct iphdr { char verhdrlen; char service; unsigned short len; unsigned short ident; unsigned short frags; char ttl; char protocol; unsigned short chksum; in_addr src; in_addr dest; }; struct udphdr { unsigned short src; unsigned short dest; unsigned short len; unsigned short chksum; }; #define BOOTP_REPLY 2 struct bootp_t { char bp_op; char bp_htype; char bp_hlen; char bp_hops; unsigned long bp_xid; unsigned short bp_secs; unsigned short unused; in_addr bp_ciaddr; in_addr bp_yiaddr; in_addr bp_siaddr; in_addr bp_giaddr; char bp_hwaddr[16]; char bp_sname[64]; char bp_file[128]; char bp_vend[DHCP_OPT_LEN]; }; /* Format of a bootp IP packet */ struct bootpip_t { struct iphdr ip; struct udphdr udp; struct bootp_t bp; }; /* Format of bootp packet with extensions */ struct bootpd_t { struct bootp_t bootp_reply; unsigned char bootp_extension[MAX_BOOTP_EXTLEN]; }; struct segoff { unsigned short offset, segment; }; struct imgheader { unsigned long magic; unsigned long length; struct segoff location; struct segoff execaddr; }; #define TAG_MAGIC 0x1B031336 /* Little endian */ /* ELF */ #define EI_NIDENT 16 /* Size of e_ident array. */ /* Values for e_type. */ #define ET_NONE 0 /* No file type */ #define ET_REL 1 /* Relocatable file */ #define ET_EXEC 2 /* Executable file */ #define ET_DYN 3 /* Shared object file */ #define ET_CORE 4 /* Core file */ /* Values for e_machine (incomplete). */ #define EM_386 3 /* Intel 80386 */ #define EM_486 6 /* Intel i486 */ /* Values for p_type. */ #define PT_NULL 0 /* Unused entry. */ #define PT_LOAD 1 /* Loadable segment. */ #define PT_DYNAMIC 2 /* Dynamic linking information segment. */ #define PT_INTERP 3 /* Pathname of interpreter. */ #define PT_NOTE 4 /* Auxiliary information. */ #define PT_SHLIB 5 /* Reserved (not used). */ #define PT_PHDR 6 /* Location of program header itself. */ /* Values for p_flags. */ #define PF_X 0x1 /* Executable. */ #define PF_W 0x2 /* Writable. */ #define PF_R 0x4 /* Readable. */ /* * ELF definitions common to all 32-bit architectures. */ typedef unsigned int Elf32_Addr; typedef unsigned short Elf32_Half; typedef unsigned int Elf32_Off; typedef int Elf32_Sword; typedef unsigned int Elf32_Word; typedef unsigned int Elf32_Size; /* * ELF header. */ typedef struct { unsigned char e_ident[EI_NIDENT]; /* File identification. */ Elf32_Half e_type; /* File type. */ Elf32_Half e_machine; /* Machine architecture. */ Elf32_Word e_version; /* ELF format version. */ Elf32_Addr e_entry; /* Entry point. */ Elf32_Off e_phoff; /* Program header file offset. */ Elf32_Off e_shoff; /* Section header file offset. */ Elf32_Word e_flags; /* Architecture-specific flags. */ Elf32_Half e_ehsize; /* Size of ELF header in bytes. */ Elf32_Half e_phentsize; /* Size of program header entry. */ Elf32_Half e_phnum; /* Number of program header entries. */ Elf32_Half e_shentsize; /* Size of section header entry. */ Elf32_Half e_shnum; /* Number of section header entries. */ Elf32_Half e_shstrndx; /* Section name strings section. */ } Elf32_Ehdr; #define ELF_MAGIC 0x464C457FL /* e_ident[0:3], little-endian */ union infoblock { unsigned char c[512]; struct imgheader img; Elf32_Ehdr ehdr; }; /* We use ELF names for some members to reduce ifdefs in first32.c */ struct segment { unsigned char lengths; unsigned char tagnum; unsigned char mbz; unsigned char flags; unsigned long p_paddr; unsigned long seglength; unsigned long p_filesz; }; enum segflags { F_ABS = 0, F_INCR = 1, F_EOM = 2, F_DECR = 3, F_FINAL = 4 }; /* * ELF Program header. */ typedef struct { Elf32_Word p_type; /* Entry type. */ Elf32_Off p_offset; /* File offset of contents. */ Elf32_Addr p_vaddr; /* Virtual address (not used). */ Elf32_Addr p_paddr; /* Physical address. */ Elf32_Size p_filesz; /* Size of contents in file. */ Elf32_Size p_memsz; /* Size of contents in memory. */ Elf32_Word p_flags; /* Access permission flags. */ Elf32_Size p_align; /* Alignment in memory and file. */ } Elf32_Phdr; /* These are determined by mknbi.pl. If that changes, so must this. */ enum linuxsegments { S_FIRST = 0, S_PARAMS, S_BOOT, S_SETUP, S_KERNEL, S_RAMDISK, S_NOTE, S_END }; struct bootblock { unsigned char fill1[0x20]; unsigned short cl_magic; /* command line magic number */ unsigned short cl_offset; /* command line offset */ unsigned char fill2[0x1FA-0x24]; short vgamode; }; #define CL_MAGIC 0xA33F /* very unusual command sequence */ struct setupblock { unsigned char jump[2]; /* jump instruction */ unsigned char su_magic[4]; /* HdrS */ unsigned short su_version; /* >= 0x0201 */ unsigned char fill[8]; /* realmode_switch, start_sys_seg kernel_version */ unsigned char su_type; /* type of loader */ unsigned char su_load_flags; unsigned short su_move_size; unsigned long su_32_start; unsigned long su_ramdisk_start; unsigned long su_ramdisk_size; unsigned short su_bootsect_kludge[2]; unsigned short su_heap_end_ptr; unsigned short su_pad; unsigned char *su_cmd_line_ptr;/* new cmd line protocol used when su_version >= 0x202 */ unsigned long ramdisk_max; /* highest safe address for the contents of an initrd su_version >= 0x203 */ }; #define SU_MY_LOADER_TYPE 0x41 struct ebinfo { unsigned char major, minor; unsigned short flags; }; struct e820entry { unsigned long long addr; unsigned long long size; unsigned long 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 }; #define E820MAX 32 struct meminfo { unsigned short basememsize; unsigned int memsize; int map_count; struct e820entry map[E820MAX]; }; extern struct meminfo meminfo; extern void get_memsizes(void);