Adjust memory layout for 2.6.22+ kernels with 32KB setup code
[mknbi.git] / etherboot.h
1 /*
2  *      Info we need to know from Etherboot
3  */
4
5 #define MKNBI_VERSION           "mknbi-" VERSION
6
7 #define ESC                     '\033'
8
9 #define TICKS_PER_SEC           18
10
11 #define ETH_ALEN                6       /* Size of Ethernet address */
12 #define ETH_HLEN                14      /* Size of ethernet header */
13 #define ETH_ZLEN                60      /* Minimum packet */
14 #define ETH_FRAME_LEN           1514    /* Maximum packet */
15 #ifndef ETH_MAX_MTU
16 #define ETH_MAX_MTU             (ETH_FRAME_LEN-ETH_HLEN)
17 #endif
18
19 typedef struct {
20         unsigned long   s_addr;
21 } in_addr;
22
23 #define DHCP_OPT_LEN            312
24
25 /* Vendor magic cookies in host order */
26 #define RFC_1048        0x63538263
27 #define VEND_CMU        0x00554D43
28 #define VEND_STAN       0x4E415453
29 #define VEND_EB         0x687445E4      /* √§Eth */
30
31 #define TAG_LEN(p)              (*((p)+1))
32 #define RFC1533_PAD             0       /* tag for NO-OP */
33 #define RFC1533_NETMASK         1       /* tag for netmask */
34 #define RFC1533_GATEWAY         3       /* tag for gateway */
35 #define RFC1533_HOSTNAME        12      /* tag for host name */
36 #define RFC1533_ROOTPATH        17      /* tag for root directory */
37
38 #define RFC1533_VENDOR_MAJOR    0
39 #define RFC1533_VENDOR_MINOR    0
40
41 #define RFC1533_VENDOR_MAGIC    128     /* Etherboot identification */
42 #define RFC1533_VENDOR_ADDPARM  129     /* Addition to kernel command line */
43 #define RFC1533_VENDOR_ETHDEV   130     /* Device by which to find root FS */
44 #define RFC1533_VENDOR_ETHERBOOT_ENCAP  150
45 #define RFC1533_VENDOR_MENUOPTS 160
46 #define RFC1533_VENDOR_SELECTION        176     /* index to user selected image */
47 #define RFC1533_VENDOR_MOTD     184
48 #define RFC1533_VENDOR_NUMOFMOTD        8
49 #define RFC1533_VENDOR_IMG      192
50 #define RFC1533_VENDOR_NUMOFIMG 16
51 #define RFC1533_END             255     /* tag for end of record */
52
53 #define MAX_BOOTP_EXTLEN        (ETH_MAX_MTU-sizeof(struct bootpip_t))
54
55 struct iphdr {
56         char verhdrlen;
57         char service;
58         unsigned short len;
59         unsigned short ident;
60         unsigned short frags;
61         char ttl;
62         char protocol;
63         unsigned short chksum;
64         in_addr src;
65         in_addr dest;
66 };
67
68 struct udphdr {
69         unsigned short src;
70         unsigned short dest;
71         unsigned short len;
72         unsigned short chksum;
73 };
74
75 #define BOOTP_REPLY     2
76
77 struct bootp_t {
78         char bp_op;
79         char bp_htype;
80         char bp_hlen;
81         char bp_hops;
82         unsigned long bp_xid;
83         unsigned short bp_secs;
84         unsigned short unused;
85         in_addr bp_ciaddr;
86         in_addr bp_yiaddr;
87         in_addr bp_siaddr;
88         in_addr bp_giaddr;
89         char bp_hwaddr[16];
90         char bp_sname[64];
91         char bp_file[128];
92         char bp_vend[DHCP_OPT_LEN];
93 };
94
95 /* Format of a bootp IP packet */
96 struct bootpip_t
97 {
98         struct iphdr ip;
99         struct udphdr udp;
100         struct bootp_t bp;
101 };
102
103 /* Format of bootp packet with extensions */
104 struct bootpd_t {
105         struct bootp_t bootp_reply;
106         unsigned char  bootp_extension[MAX_BOOTP_EXTLEN];
107 };
108
109 struct segoff
110 {
111         unsigned short  offset, segment;
112 };
113
114 struct imgheader
115 {
116         unsigned long   magic;
117         unsigned long   length;
118         struct segoff   location;
119         struct segoff   execaddr;
120 };
121
122 #define TAG_MAGIC       0x1B031336      /* Little endian */
123
124 /* ELF */
125 #define EI_NIDENT       16      /* Size of e_ident array. */
126
127 /* Values for e_type. */
128 #define ET_NONE         0       /* No file type */
129 #define ET_REL          1       /* Relocatable file */
130 #define ET_EXEC         2       /* Executable file */
131 #define ET_DYN          3       /* Shared object file */
132 #define ET_CORE         4       /* Core file */
133
134 /* Values for e_machine (incomplete). */
135 #define EM_386          3       /* Intel 80386 */
136 #define EM_486          6       /* Intel i486 */
137
138 /* Values for p_type. */
139 #define PT_NULL         0       /* Unused entry. */
140 #define PT_LOAD         1       /* Loadable segment. */
141 #define PT_DYNAMIC      2       /* Dynamic linking information segment. */
142 #define PT_INTERP       3       /* Pathname of interpreter. */
143 #define PT_NOTE         4       /* Auxiliary information. */
144 #define PT_SHLIB        5       /* Reserved (not used). */
145 #define PT_PHDR         6       /* Location of program header itself. */
146
147 /* Values for p_flags. */
148 #define PF_X            0x1     /* Executable. */
149 #define PF_W            0x2     /* Writable. */
150 #define PF_R            0x4     /* Readable. */
151
152 /*
153  * ELF definitions common to all 32-bit architectures.
154  */
155
156 typedef unsigned int    Elf32_Addr;
157 typedef unsigned short  Elf32_Half;
158 typedef unsigned int    Elf32_Off;
159 typedef int             Elf32_Sword;
160 typedef unsigned int    Elf32_Word;
161 typedef unsigned int    Elf32_Size;
162
163 /*
164  * ELF header.
165  */
166 typedef struct {
167         unsigned char   e_ident[EI_NIDENT];     /* File identification. */
168         Elf32_Half      e_type;         /* File type. */
169         Elf32_Half      e_machine;      /* Machine architecture. */
170         Elf32_Word      e_version;      /* ELF format version. */
171         Elf32_Addr      e_entry;        /* Entry point. */
172         Elf32_Off       e_phoff;        /* Program header file offset. */
173         Elf32_Off       e_shoff;        /* Section header file offset. */
174         Elf32_Word      e_flags;        /* Architecture-specific flags. */
175         Elf32_Half      e_ehsize;       /* Size of ELF header in bytes. */
176         Elf32_Half      e_phentsize;    /* Size of program header entry. */
177         Elf32_Half      e_phnum;        /* Number of program header entries. */
178         Elf32_Half      e_shentsize;    /* Size of section header entry. */
179         Elf32_Half      e_shnum;        /* Number of section header entries. */
180         Elf32_Half      e_shstrndx;     /* Section name strings section. */
181 } Elf32_Ehdr;
182
183 #define ELF_MAGIC       0x464C457FL     /* e_ident[0:3], little-endian */
184
185 union infoblock
186 {
187         unsigned char           c[512];
188         struct imgheader        img;
189         Elf32_Ehdr              ehdr;
190 };
191
192 /* We use ELF names for some members to reduce ifdefs in first32.c */
193 struct segment
194 {
195         unsigned char   lengths;
196         unsigned char   tagnum;
197         unsigned char   mbz;
198         unsigned char   flags;
199         unsigned long   p_paddr;
200         unsigned long   seglength;
201         unsigned long   p_filesz;
202 };
203
204 enum segflags { F_ABS = 0, F_INCR = 1, F_EOM = 2, F_DECR = 3, F_FINAL = 4 };
205
206 /*
207  * ELF Program header.
208  */
209 typedef struct {
210         Elf32_Word      p_type;         /* Entry type. */
211         Elf32_Off       p_offset;       /* File offset of contents. */
212         Elf32_Addr      p_vaddr;        /* Virtual address (not used). */
213         Elf32_Addr      p_paddr;        /* Physical address. */
214         Elf32_Size      p_filesz;       /* Size of contents in file. */
215         Elf32_Size      p_memsz;        /* Size of contents in memory. */
216         Elf32_Word      p_flags;        /* Access permission flags. */
217         Elf32_Size      p_align;        /* Alignment in memory and file. */
218 } Elf32_Phdr;
219
220 /* These are determined by mknbi.pl. If that changes, so must this. */
221 enum linuxsegments { S_FIRST = 0, S_PARAMS, S_BOOT, S_SETUP, S_KERNEL,
222         S_RAMDISK, S_NOTE, S_END };
223
224 struct bootblock
225 {
226         unsigned char   fill1[0x20];
227         unsigned short  cl_magic;       /* command line magic number */
228         unsigned short  cl_offset;      /* command line offset */
229         unsigned char   fill2[0x1FA-0x24];
230         short           vgamode;
231 };
232
233 #define CL_MAGIC        0xA33F          /* very unusual command sequence */
234
235 struct setupblock
236 {
237         unsigned char   jump[2];        /* jump instruction */
238         unsigned char   su_magic[4];    /* HdrS */
239         unsigned short  su_version;     /* >= 0x0201 */
240         unsigned char   fill[8];        /* realmode_switch, start_sys_seg
241                                            kernel_version */
242         unsigned char   su_type;        /* type of loader */
243         unsigned char   su_load_flags;
244         unsigned short  su_move_size;
245         unsigned long   su_32_start;
246         unsigned long   su_ramdisk_start;
247         unsigned long   su_ramdisk_size;
248         unsigned short  su_bootsect_kludge[2];
249         unsigned short  su_heap_end_ptr;
250         unsigned short  su_pad;
251         unsigned char   *su_cmd_line_ptr;/* new cmd line protocol used when
252                                            su_version >= 0x202 */
253         unsigned long   ramdisk_max;    /* highest safe address for the
254                                            contents of an initrd
255                                            su_version >= 0x203 */
256 };
257
258 #define SU_MY_LOADER_TYPE       0x41
259
260 struct ebinfo {
261         unsigned char   major, minor;
262         unsigned short  flags;
263 };
264
265 struct e820entry {
266         unsigned long long addr;
267         unsigned long long size;
268         unsigned long type;
269 #define E820_RAM        1
270 #define E820_RESERVED   2
271 #define E820_ACPI       3 /* usable as RAM once ACPI tables have been read */
272 #define E820_NVS        4
273 };
274 #define E820MAX 32
275 struct meminfo {
276         unsigned short basememsize;
277         unsigned int memsize;
278         int map_count;
279         struct e820entry map[E820MAX];
280 };
281 extern struct meminfo meminfo;
282 extern void get_memsizes(void);