Updates from vmm-akaros
[akaros.git] / user / vmm / include / linux_bootparam.h
1 /* Copyright (C) 1991-2016, the Linux Kernel authors
2  *
3  * This source code is licensed under the GNU General Public License
4  * Version 2. See the file COPYING for more details.
5  *
6  * Part of this code originates from Linux kernel files:
7  *
8  * linux/arch/x86/include/uapi/asm/bootparam.h
9  * linux/arch/x86/include/uapi/asm/e820.h
10  *
11  * These files are missing copyright headers, but are supposed to be
12  * governed by the overall Linux copyright.
13  */
14
15 #pragma once
16
17 #define E820MAX (128)
18 /* From Linux e820.h */
19 #define E820NR  0x1e8       /* # entries in E820MAP */
20
21 #define E820_RAM    1
22 #define E820_RESERVED   2
23 #define E820_ACPI   3
24 #define E820_NVS    4
25 #define E820_UNUSABLE   5
26
27 struct e820entry {
28     uint64_t addr;  /* start of memory segment */
29     uint64_t size;  /* size of memory segment */
30     uint32_t type;  /* type of memory segment */
31 } __attribute__((packed));
32
33 struct e820map {
34     uint32_t nr_map;
35     struct e820entry map[E820MAX];
36 };
37
38 /* from linux bootparam.h */
39
40 /* setup_data types */
41 #define SETUP_NONE          0
42 #define SETUP_E820_EXT          1
43 #define SETUP_DTB           2
44 #define SETUP_PCI           3
45 #define SETUP_EFI           4
46
47 /* ram_size flags */
48 #define RAMDISK_IMAGE_START_MASK    0x07FF
49 #define RAMDISK_PROMPT_FLAG     0x8000
50 #define RAMDISK_LOAD_FLAG       0x4000
51
52 /* loadflags */
53 #define LOADED_HIGH (1<<0)
54 #define KASLR_FLAG  (1<<1)
55 #define QUIET_FLAG  (1<<5)
56 #define KEEP_SEGMENTS   (1<<6)
57 #define CAN_USE_HEAP    (1<<7)
58
59 /* xloadflags */
60 #define XLF_KERNEL_64           (1<<0)
61 #define XLF_CAN_BE_LOADED_ABOVE_4G  (1<<1)
62 #define XLF_EFI_HANDOVER_32     (1<<2)
63 #define XLF_EFI_HANDOVER_64     (1<<3)
64 #define XLF_EFI_KEXEC           (1<<4)
65
66 //#include <linux/types.h>
67 //#include <linux/screen_info.h>
68 //#include <linux/apm_bios.h>
69 //#include <linux/edd.h>
70 //#include <asm/e820.h>
71 //#include <asm/ist.h>
72 //#include <video/edid.h>
73
74 /* extensible setup data list node */
75 struct setup_data {
76     uint64_t next;
77     uint32_t type;
78     uint32_t len;
79     uint8_t data[0];
80 };
81
82 struct setup_header {
83     uint8_t setup_sects;
84     uint16_t    root_flags;
85     uint32_t    syssize;
86     uint16_t    ram_size;
87     uint16_t    vid_mode;
88     uint16_t    root_dev;
89     uint16_t    boot_flag;
90     uint16_t    jump;
91     uint32_t    header;
92     uint16_t    version;
93     uint32_t    realmode_swtch;
94     uint16_t    start_sys;
95     uint16_t    kernel_version;
96     uint8_t type_of_loader;
97     uint8_t loadflags;
98     uint16_t    setup_move_size;
99     uint32_t    code32_start;
100     uint32_t    ramdisk_image;
101     uint32_t    ramdisk_size;
102     uint32_t    bootsect_kludge;
103     uint16_t    heap_end_ptr;
104     uint8_t ext_loader_ver;
105     uint8_t ext_loader_type;
106     uint32_t    cmd_line_ptr;
107     uint32_t    initrd_addr_max;
108     uint32_t    kernel_alignment;
109     uint8_t relocatable_kernel;
110     uint8_t min_alignment;
111     uint16_t    xloadflags;
112     uint32_t    cmdline_size;
113     uint32_t    hardware_subarch;
114     uint64_t    hardware_subarch_data;
115     uint32_t    payload_offset;
116     uint32_t    payload_length;
117     uint64_t    setup_data;
118     uint64_t    pref_address;
119     uint32_t    init_size;
120     uint32_t    handover_offset;
121 } __attribute__((packed));
122
123 struct sys_desc_table {
124     uint16_t length;
125     uint8_t  table[14];
126 };
127
128 /* Gleaned from OFW's set-parameters in cpu/x86/pc/linux.fth */
129 struct olpc_ofw_header {
130     uint32_t ofw_magic; /* OFW signature */
131     uint32_t ofw_version;
132     uint32_t cif_handler;   /* callback into OFW */
133     uint32_t irq_desc_table;
134 } __attribute__((packed));
135
136 struct efi_info {
137     uint32_t efi_loader_signature;
138     uint32_t efi_systab;
139     uint32_t efi_memdesc_size;
140     uint32_t efi_memdesc_version;
141     uint32_t efi_memmap;
142     uint32_t efi_memmap_size;
143     uint32_t efi_systab_hi;
144     uint32_t efi_memmap_hi;
145 };
146
147 /* The so-called "zeropage" */
148 struct boot_params {
149     //struct screen_info screen_info;           /* 0x000 */
150     uint8_t screen_info[0x40];
151     //struct apm_bios_info apm_bios_info;       /* 0x040 */
152     uint8_t apm_bios_info[0x14];
153     uint8_t  _pad2[4];                  /* 0x054 */
154     uint64_t  tboot_addr;               /* 0x058 */
155     //struct ist_info ist_info;         /* 0x060 */
156     uint8_t ist_info[0x10];
157     uint8_t  _pad3[16];             /* 0x070 */
158     uint8_t  hd0_info[16];  /* obsolete! */     /* 0x080 */
159     uint8_t  hd1_info[16];  /* obsolete! */     /* 0x090 */
160     //struct sys_desc_table sys_desc_table;     /* 0x0a0 */
161     uint8_t sys_desc_table[0x10];
162     //struct olpc_ofw_header olpc_ofw_header;       /* 0x0b0 */
163     uint8_t olpc_ofs_header[0x10];
164     uint32_t ext_ramdisk_image;         /* 0x0c0 */
165     uint32_t ext_ramdisk_size;              /* 0x0c4 */
166     uint32_t ext_cmd_line_ptr;              /* 0x0c8 */
167     uint8_t  _pad4[116];                /* 0x0cc */
168     //struct edid_info edid_info;           /* 0x140 */
169     uint8_t edid_info[0x1c0-0x140];
170     //struct efi_info efi_info;         /* 0x1c0 */
171     uint8_t efi_info[0x20];
172     uint32_t alt_mem_k;             /* 0x1e0 */
173     uint32_t scratch;       /* Scratch field! */    /* 0x1e4 */
174     uint8_t  e820_entries;              /* 0x1e8 */
175     uint8_t  eddbuf_entries;                /* 0x1e9 */
176     uint8_t  edd_mbr_sig_buf_entries;           /* 0x1ea */
177     uint8_t  kbd_status;                /* 0x1eb */
178     uint8_t  _pad5[3];                  /* 0x1ec */
179     /*
180      * The sentinel is set to a nonzero value (0xff) in header.S.
181      *
182      * A bootloader is supposed to only take setup_header and put
183      * it into a clean boot_params buffer. If it turns out that
184      * it is clumsy or too generous with the buffer, it most
185      * probably will pick up the sentinel variable too. The fact
186      * that this variable then is still 0xff will let kernel
187      * know that some variables in boot_params are invalid and
188      * kernel should zero out certain portions of boot_params.
189      */
190     uint8_t  sentinel;                  /* 0x1ef */
191     uint8_t  _pad6[1];                  /* 0x1f0 */
192     struct setup_header hdr;    /* setup header */  /* 0x1f1 */
193     uint8_t  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
194     uint32_t edd_mbr_sig_buffer[/*EDD_MBR_SIG_MAX*/ (0x2d0-0x290)/sizeof(uint32_t)];    /* 0x290 */
195     struct e820entry e820_map[E820MAX];     /* 0x2d0 */
196     uint8_t  _pad8[48];             /* 0xcd0 */
197     //struct edd_info eddbuf[EDDMAXNR];     /* 0xd00 */
198     uint8_t eddbuf[0xeec-0xd00];
199     uint8_t  _pad9[276];                /* 0xeec */
200 } __attribute__((packed));
201
202 enum {
203     X86_SUBARCH_PC = 0,
204     X86_SUBARCH_LGUEST,
205     X86_SUBARCH_XEN,
206     X86_SUBARCH_INTEL_MID,
207     X86_SUBARCH_CE4100,
208     X86_NR_SUBARCHS,
209 };
210
211 #include <parlib/assert.h>
212
213 /* sorry, need this here. */
214 static void do_not_call_bootparam_asserts(void)
215 {
216     parlib_static_assert(offsetof(struct boot_params, e820_map) == 0x2d0);
217 }