summaryrefslogtreecommitdiffstats
path: root/include/grub/i386
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 10:54:16 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 10:54:16 +0000
commit485f6ecd453d8a2fd8b9b9fadea03159d8b50797 (patch)
tree32451fa3cdd9321fb2591fada9891b2cb70a9cd1 /include/grub/i386
parentInitial commit. (diff)
downloadgrub2-upstream.tar.xz
grub2-upstream.zip
Adding upstream version 2.06.upstream/2.06upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/grub/i386')
-rw-r--r--include/grub/i386/at_keyboard.h25
-rw-r--r--include/grub/i386/bsd.h128
-rw-r--r--include/grub/i386/cmos.h30
-rw-r--r--include/grub/i386/coreboot/boot.h1
-rw-r--r--include/grub/i386/coreboot/console.h32
-rw-r--r--include/grub/i386/coreboot/kernel.h0
-rw-r--r--include/grub/i386/coreboot/memory.h54
-rw-r--r--include/grub/i386/coreboot/serial.h24
-rw-r--r--include/grub/i386/coreboot/time.h1
-rw-r--r--include/grub/i386/cpuid.h85
-rw-r--r--include/grub/i386/efi/kernel.h0
-rw-r--r--include/grub/i386/efi/memory.h6
-rw-r--r--include/grub/i386/efi/serial.h1
-rw-r--r--include/grub/i386/efiemu.h33
-rw-r--r--include/grub/i386/floppy.h36
-rw-r--r--include/grub/i386/freebsd_linker.h74
-rw-r--r--include/grub/i386/freebsd_reboot.h77
-rw-r--r--include/grub/i386/gdb.h78
-rw-r--r--include/grub/i386/ieee1275/ieee1275.h1
-rw-r--r--include/grub/i386/ieee1275/kernel.h0
-rw-r--r--include/grub/i386/ieee1275/memory.h1
-rw-r--r--include/grub/i386/ieee1275/serial.h1
-rw-r--r--include/grub/i386/io.h72
-rw-r--r--include/grub/i386/linux.h336
-rw-r--r--include/grub/i386/macho.h32
-rw-r--r--include/grub/i386/memory.h80
-rw-r--r--include/grub/i386/memory_raw.h58
-rw-r--r--include/grub/i386/multiboot.h58
-rw-r--r--include/grub/i386/multiboot/boot.h1
-rw-r--r--include/grub/i386/multiboot/console.h1
-rw-r--r--include/grub/i386/multiboot/kernel.h1
-rw-r--r--include/grub/i386/multiboot/memory.h1
-rw-r--r--include/grub/i386/multiboot/serial.h1
-rw-r--r--include/grub/i386/multiboot/time.h1
-rw-r--r--include/grub/i386/netbsd_bootinfo.h156
-rw-r--r--include/grub/i386/netbsd_reboot.h81
-rw-r--r--include/grub/i386/openbsd_bootarg.h93
-rw-r--r--include/grub/i386/openbsd_reboot.h79
-rw-r--r--include/grub/i386/pc/apm.h48
-rw-r--r--include/grub/i386/pc/biosdisk.h109
-rw-r--r--include/grub/i386/pc/biosnum.h6
-rw-r--r--include/grub/i386/pc/boot.h73
-rw-r--r--include/grub/i386/pc/chainloader.h27
-rw-r--r--include/grub/i386/pc/console.h36
-rw-r--r--include/grub/i386/pc/int.h33
-rw-r--r--include/grub/i386/pc/int_types.h59
-rw-r--r--include/grub/i386/pc/kernel.h41
-rw-r--r--include/grub/i386/pc/memory.h63
-rw-r--r--include/grub/i386/pc/pxe.h292
-rw-r--r--include/grub/i386/pc/time.h24
-rw-r--r--include/grub/i386/pc/vbe.h232
-rw-r--r--include/grub/i386/pc/vesa_modes_table.h19
-rw-r--r--include/grub/i386/pci.h105
-rw-r--r--include/grub/i386/pit.h103
-rw-r--r--include/grub/i386/pmtimer.h37
-rw-r--r--include/grub/i386/qemu/boot.h25
-rw-r--r--include/grub/i386/qemu/console.h1
-rw-r--r--include/grub/i386/qemu/kernel.h35
-rw-r--r--include/grub/i386/qemu/memory.h1
-rw-r--r--include/grub/i386/qemu/serial.h1
-rw-r--r--include/grub/i386/qemu/time.h1
-rw-r--r--include/grub/i386/rdmsr.h37
-rw-r--r--include/grub/i386/reboot.h28
-rw-r--r--include/grub/i386/relocator.h100
-rw-r--r--include/grub/i386/relocator_private.h1
-rw-r--r--include/grub/i386/setjmp.h29
-rw-r--r--include/grub/i386/time.h29
-rw-r--r--include/grub/i386/tsc.h70
-rw-r--r--include/grub/i386/types.h33
-rw-r--r--include/grub/i386/wrmsr.h35
-rw-r--r--include/grub/i386/xen/hypercall.h88
-rw-r--r--include/grub/i386/xen/kernel.h0
-rw-r--r--include/grub/i386/xen/memory.h0
-rw-r--r--include/grub/i386/xen_pvh/boot.h1
-rw-r--r--include/grub/i386/xen_pvh/console.h1
-rw-r--r--include/grub/i386/xen_pvh/int.h1
-rw-r--r--include/grub/i386/xen_pvh/kernel.h30
-rw-r--r--include/grub/i386/xen_pvh/memory.h1
-rw-r--r--include/grub/i386/xen_pvh/time.h1
-rw-r--r--include/grub/i386/xnu.h149
80 files changed, 3744 insertions, 0 deletions
diff --git a/include/grub/i386/at_keyboard.h b/include/grub/i386/at_keyboard.h
new file mode 100644
index 0000000..da4e806
--- /dev/null
+++ b/include/grub/i386/at_keyboard.h
@@ -0,0 +1,25 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_AT_KEYBOARD_HEADER
+#define GRUB_CPU_AT_KEYBOARD_HEADER 1
+
+#define KEYBOARD_REG_DATA 0x60
+#define KEYBOARD_REG_STATUS 0x64
+
+#endif
diff --git a/include/grub/i386/bsd.h b/include/grub/i386/bsd.h
new file mode 100644
index 0000000..524d47a
--- /dev/null
+++ b/include/grub/i386/bsd.h
@@ -0,0 +1,128 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_BSD_CPU_HEADER
+#define GRUB_BSD_CPU_HEADER 1
+
+#include <grub/types.h>
+#include <grub/relocator.h>
+
+#include <grub/i386/freebsd_reboot.h>
+#include <grub/i386/netbsd_reboot.h>
+#include <grub/i386/openbsd_reboot.h>
+#include <grub/i386/freebsd_linker.h>
+#include <grub/i386/netbsd_bootinfo.h>
+#include <grub/i386/openbsd_bootarg.h>
+
+enum bsd_kernel_types
+ {
+ KERNEL_TYPE_NONE,
+ KERNEL_TYPE_FREEBSD,
+ KERNEL_TYPE_OPENBSD,
+ KERNEL_TYPE_NETBSD,
+ };
+
+#define GRUB_BSD_TEMP_BUFFER 0x80000
+
+#define FREEBSD_B_DEVMAGIC OPENBSD_B_DEVMAGIC
+#define FREEBSD_B_SLICESHIFT OPENBSD_B_CTRLSHIFT
+#define FREEBSD_B_UNITSHIFT OPENBSD_B_UNITSHIFT
+#define FREEBSD_B_PARTSHIFT OPENBSD_B_PARTSHIFT
+#define FREEBSD_B_TYPESHIFT OPENBSD_B_TYPESHIFT
+
+#define FREEBSD_MODTYPE_KERNEL "elf kernel"
+#define FREEBSD_MODTYPE_KERNEL64 "elf64 kernel"
+#define FREEBSD_MODTYPE_ELF_MODULE "elf module"
+#define FREEBSD_MODTYPE_ELF_MODULE_OBJ "elf obj module"
+#define FREEBSD_MODTYPE_RAW "raw"
+
+#define FREEBSD_BOOTINFO_VERSION 1
+
+struct grub_freebsd_bootinfo
+{
+ grub_uint32_t version;
+ grub_uint8_t unused1[44];
+ grub_uint32_t length;
+ grub_uint8_t unused2;
+ grub_uint8_t boot_device;
+ grub_uint8_t unused3[18];
+ grub_uint32_t kern_end;
+ grub_uint32_t environment;
+ grub_uint32_t tags;
+} GRUB_PACKED;
+
+struct freebsd_tag_header
+{
+ grub_uint32_t type;
+ grub_uint32_t len;
+};
+
+grub_err_t grub_freebsd_load_elfmodule32 (struct grub_relocator *relocator,
+ grub_file_t file, int argc,
+ char *argv[], grub_addr_t *kern_end);
+grub_err_t grub_freebsd_load_elfmodule_obj64 (struct grub_relocator *relocator,
+ grub_file_t file, int argc,
+ char *argv[],
+ grub_addr_t *kern_end);
+grub_err_t grub_freebsd_load_elf_meta32 (struct grub_relocator *relocator,
+ grub_file_t file,
+ const char *filename,
+ grub_addr_t *kern_end);
+grub_err_t grub_freebsd_load_elf_meta64 (struct grub_relocator *relocator,
+ grub_file_t file,
+ const char *filename,
+ grub_addr_t *kern_end);
+
+grub_err_t grub_netbsd_load_elf_meta32 (struct grub_relocator *relocator,
+ grub_file_t file,
+ const char *filename,
+ grub_addr_t *kern_end);
+grub_err_t grub_netbsd_load_elf_meta64 (struct grub_relocator *relocator,
+ grub_file_t file,
+ const char *filename,
+ grub_addr_t *kern_end);
+
+grub_err_t grub_bsd_add_meta (grub_uint32_t type,
+ const void *data, grub_uint32_t len);
+grub_err_t grub_freebsd_add_meta_module (const char *filename, const char *type,
+ int argc, char **argv,
+ grub_addr_t addr, grub_uint32_t size);
+
+struct grub_openbsd_ramdisk_descriptor
+{
+ grub_size_t max_size;
+ grub_uint8_t *target;
+ grub_uint32_t *size;
+};
+
+grub_err_t grub_openbsd_find_ramdisk32 (grub_file_t file,
+ const char *filename,
+ grub_addr_t kern_start,
+ void *kern_chunk_src,
+ struct grub_openbsd_ramdisk_descriptor *desc);
+grub_err_t grub_openbsd_find_ramdisk64 (grub_file_t file,
+ const char *filename,
+ grub_addr_t kern_start,
+ void *kern_chunk_src,
+ struct grub_openbsd_ramdisk_descriptor *desc);
+
+extern grub_uint8_t grub_bsd64_trampoline_start, grub_bsd64_trampoline_end;
+extern grub_uint32_t grub_bsd64_trampoline_selfjump;
+extern grub_uint32_t grub_bsd64_trampoline_gdt;
+
+#endif /* ! GRUB_BSD_CPU_HEADER */
diff --git a/include/grub/i386/cmos.h b/include/grub/i386/cmos.h
new file mode 100644
index 0000000..27a2b21
--- /dev/null
+++ b/include/grub/i386/cmos.h
@@ -0,0 +1,30 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_CMOS_H
+#define GRUB_CPU_CMOS_H 1
+
+#include <grub/types.h>
+#include <grub/cpu/io.h>
+
+#define GRUB_CMOS_ADDR_REG 0x70
+#define GRUB_CMOS_DATA_REG 0x71
+#define GRUB_CMOS_ADDR_REG_HI 0x72
+#define GRUB_CMOS_DATA_REG_HI 0x73
+
+#endif /* GRUB_CPU_CMOS_H */
diff --git a/include/grub/i386/coreboot/boot.h b/include/grub/i386/coreboot/boot.h
new file mode 100644
index 0000000..6cd23aa
--- /dev/null
+++ b/include/grub/i386/coreboot/boot.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/boot.h>
diff --git a/include/grub/i386/coreboot/console.h b/include/grub/i386/coreboot/console.h
new file mode 100644
index 0000000..9cfa247
--- /dev/null
+++ b/include/grub/i386/coreboot/console.h
@@ -0,0 +1,32 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MACHINE_CONSOLE_HEADER
+#define GRUB_MACHINE_CONSOLE_HEADER 1
+
+void grub_vga_text_init (void);
+void grub_vga_text_fini (void);
+
+void grub_video_coreboot_fb_init (void);
+void grub_video_coreboot_fb_early_init (void);
+void grub_video_coreboot_fb_late_init (void);
+void grub_video_coreboot_fb_fini (void);
+
+extern struct grub_linuxbios_table_framebuffer *grub_video_coreboot_fbtable;
+
+#endif /* ! GRUB_MACHINE_CONSOLE_HEADER */
diff --git a/include/grub/i386/coreboot/kernel.h b/include/grub/i386/coreboot/kernel.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/grub/i386/coreboot/kernel.h
diff --git a/include/grub/i386/coreboot/memory.h b/include/grub/i386/coreboot/memory.h
new file mode 100644
index 0000000..1501772
--- /dev/null
+++ b/include/grub/i386/coreboot/memory.h
@@ -0,0 +1,54 @@
+/* memory.h - describe the memory map */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GRUB_MEMORY_MACHINE_LB_HEADER
+#define _GRUB_MEMORY_MACHINE_LB_HEADER 1
+
+#include <grub/symbol.h>
+
+#ifndef ASM_FILE
+#include <grub/err.h>
+#include <grub/types.h>
+#include <grub/memory.h>
+#endif
+
+#include <grub/i386/memory.h>
+#include <grub/i386/memory_raw.h>
+
+#ifndef ASM_FILE
+
+void grub_machine_mmap_init (void);
+
+static inline grub_err_t
+grub_machine_mmap_register (grub_uint64_t start __attribute__ ((unused)),
+ grub_uint64_t size __attribute__ ((unused)),
+ int type __attribute__ ((unused)),
+ int handle __attribute__ ((unused)))
+{
+ return GRUB_ERR_NONE;
+}
+static inline grub_err_t
+grub_machine_mmap_unregister (int handle __attribute__ ((unused)))
+{
+ return GRUB_ERR_NONE;
+}
+
+#endif
+
+#endif /* ! _GRUB_MEMORY_MACHINE_HEADER */
diff --git a/include/grub/i386/coreboot/serial.h b/include/grub/i386/coreboot/serial.h
new file mode 100644
index 0000000..b6819d5
--- /dev/null
+++ b/include/grub/i386/coreboot/serial.h
@@ -0,0 +1,24 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MACHINE_SERIAL_HEADER
+#define GRUB_MACHINE_SERIAL_HEADER 1
+
+#define GRUB_MACHINE_SERIAL_PORTS { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }
+
+#endif
diff --git a/include/grub/i386/coreboot/time.h b/include/grub/i386/coreboot/time.h
new file mode 100644
index 0000000..2298ee8
--- /dev/null
+++ b/include/grub/i386/coreboot/time.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/time.h>
diff --git a/include/grub/i386/cpuid.h b/include/grub/i386/cpuid.h
new file mode 100644
index 0000000..f7ae4b0
--- /dev/null
+++ b/include/grub/i386/cpuid.h
@@ -0,0 +1,85 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_CPUID_HEADER
+#define GRUB_CPU_CPUID_HEADER 1
+
+extern unsigned char grub_cpuid_has_longmode;
+extern unsigned char grub_cpuid_has_pae;
+
+#ifdef __x86_64__
+
+static __inline int
+grub_cpu_is_cpuid_supported (void)
+{
+ grub_uint64_t id_supported;
+
+ __asm__ ("pushfq\n\t"
+ "popq %%rax /* Get EFLAGS into EAX */\n\t"
+ "movq %%rax, %%rcx /* Save original flags in ECX */\n\t"
+ "xorq $0x200000, %%rax /* Flip ID bit in EFLAGS */\n\t"
+ "pushq %%rax /* Store modified EFLAGS on stack */\n\t"
+ "popfq /* Replace current EFLAGS */\n\t"
+ "pushfq /* Read back the EFLAGS */\n\t"
+ "popq %%rax /* Get EFLAGS into EAX */\n\t"
+ "xorq %%rcx, %%rax /* Check if flag could be modified */\n\t"
+ : "=a" (id_supported)
+ : /* No inputs. */
+ : /* Clobbered: */ "%rcx");
+
+ return id_supported != 0;
+}
+
+#else
+
+static __inline int
+grub_cpu_is_cpuid_supported (void)
+{
+ grub_uint32_t id_supported;
+
+ __asm__ ("pushfl\n\t"
+ "popl %%eax /* Get EFLAGS into EAX */\n\t"
+ "movl %%eax, %%ecx /* Save original flags in ECX */\n\t"
+ "xorl $0x200000, %%eax /* Flip ID bit in EFLAGS */\n\t"
+ "pushl %%eax /* Store modified EFLAGS on stack */\n\t"
+ "popfl /* Replace current EFLAGS */\n\t"
+ "pushfl /* Read back the EFLAGS */\n\t"
+ "popl %%eax /* Get EFLAGS into EAX */\n\t"
+ "xorl %%ecx, %%eax /* Check if flag could be modified */\n\t"
+ : "=a" (id_supported)
+ : /* No inputs. */
+ : /* Clobbered: */ "%rcx");
+
+ return id_supported != 0;
+}
+
+#endif
+
+#ifdef __PIC__
+#define grub_cpuid(num,a,b,c,d) \
+ asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (num))
+#else
+#define grub_cpuid(num,a,b,c,d) \
+ asm volatile ("cpuid" \
+ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
+ : "0" (num))
+#endif
+
+#endif
diff --git a/include/grub/i386/efi/kernel.h b/include/grub/i386/efi/kernel.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/grub/i386/efi/kernel.h
diff --git a/include/grub/i386/efi/memory.h b/include/grub/i386/efi/memory.h
new file mode 100644
index 0000000..2c64918
--- /dev/null
+++ b/include/grub/i386/efi/memory.h
@@ -0,0 +1,6 @@
+#ifndef GRUB_MEMORY_CPU_HEADER
+#include <grub/efi/memory.h>
+
+#define GRUB_EFI_MAX_USABLE_ADDRESS 0xffffffff
+
+#endif /* ! GRUB_MEMORY_CPU_HEADER */
diff --git a/include/grub/i386/efi/serial.h b/include/grub/i386/efi/serial.h
new file mode 100644
index 0000000..2d85634
--- /dev/null
+++ b/include/grub/i386/efi/serial.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/serial.h>
diff --git a/include/grub/i386/efiemu.h b/include/grub/i386/efiemu.h
new file mode 100644
index 0000000..edb13ff
--- /dev/null
+++ b/include/grub/i386/efiemu.h
@@ -0,0 +1,33 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_ARCH_EFI_EMU_HEADER
+#define GRUB_ARCH_EFI_EMU_HEADER 1
+
+grub_err_t
+grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
+ struct grub_efiemu_elf_sym *elfsyms,
+ void *ehdr);
+grub_err_t
+grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
+ struct grub_efiemu_elf_sym *elfsyms,
+ void *ehdr);
+
+int grub_arch_efiemu_check_header32 (void *ehdr);
+int grub_arch_efiemu_check_header64 (void *ehdr);
+#endif
diff --git a/include/grub/i386/floppy.h b/include/grub/i386/floppy.h
new file mode 100644
index 0000000..0e36905
--- /dev/null
+++ b/include/grub/i386/floppy.h
@@ -0,0 +1,36 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_FLOPPY_CPU_HEADER
+#define GRUB_FLOPPY_CPU_HEADER 1
+
+#define GRUB_FLOPPY_REG_DIGITAL_OUTPUT 0x3f2
+
+#ifndef ASM_FILE
+#include <grub/cpu/io.h>
+
+/* Stop the floppy drive from spinning, so that other software is
+ jumped to with a known state. */
+static inline void
+grub_stop_floppy (void)
+{
+ grub_outb (0, GRUB_FLOPPY_REG_DIGITAL_OUTPUT);
+}
+#endif
+
+#endif
diff --git a/include/grub/i386/freebsd_linker.h b/include/grub/i386/freebsd_linker.h
new file mode 100644
index 0000000..3c1eb64
--- /dev/null
+++ b/include/grub/i386/freebsd_linker.h
@@ -0,0 +1,74 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*-
+ * Copyright (c) 1997-2000 Doug Rabson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: stable/8/sys/sys/linker.h 199583 2009-11-20 15:27:52Z jhb $
+ */
+
+#ifndef GRUB_FREEBSD_LINKER_CPU_HEADER
+#define GRUB_FREEBSD_LINKER_CPU_HEADER 1
+
+#define FREEBSD_MODINFO_END 0x0000 /* End of list */
+#define FREEBSD_MODINFO_NAME 0x0001 /* Name of module (string) */
+#define FREEBSD_MODINFO_TYPE 0x0002 /* Type of module (string) */
+#define FREEBSD_MODINFO_ADDR 0x0003 /* Loaded address */
+#define FREEBSD_MODINFO_SIZE 0x0004 /* Size of module */
+#define FREEBSD_MODINFO_EMPTY 0x0005 /* Has been deleted */
+#define FREEBSD_MODINFO_ARGS 0x0006 /* Parameters string */
+#define FREEBSD_MODINFO_METADATA 0x8000 /* Module-specfic */
+
+#define FREEBSD_MODINFOMD_AOUTEXEC 0x0001 /* a.out exec header */
+#define FREEBSD_MODINFOMD_ELFHDR 0x0002 /* ELF header */
+#define FREEBSD_MODINFOMD_SSYM 0x0003 /* start of symbols */
+#define FREEBSD_MODINFOMD_ESYM 0x0004 /* end of symbols */
+#define FREEBSD_MODINFOMD_DYNAMIC 0x0005 /* _DYNAMIC pointer */
+#define FREEBSD_MODINFOMD_ENVP 0x0006 /* envp[] */
+#define FREEBSD_MODINFOMD_HOWTO 0x0007 /* boothowto */
+#define FREEBSD_MODINFOMD_KERNEND 0x0008 /* kernend */
+#define FREEBSD_MODINFOMD_SHDR 0x0009 /* section header table */
+#define FREEBSD_MODINFOMD_NOCOPY 0x8000 /* don't copy this metadata to the kernel */
+
+#define FREEBSD_MODINFOMD_SMAP 0x1001
+
+#define FREEBSD_MODINFOMD_DEPLIST (0x4001 | FREEBSD_MODINFOMD_NOCOPY) /* depends on */
+
+#endif
diff --git a/include/grub/i386/freebsd_reboot.h b/include/grub/i386/freebsd_reboot.h
new file mode 100644
index 0000000..9c17f6e
--- /dev/null
+++ b/include/grub/i386/freebsd_reboot.h
@@ -0,0 +1,77 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*-
+ * Copyright (c) 1982, 1986, 1988, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)reboot.h 8.3 (Berkeley) 12/13/94
+ * $FreeBSD: stable/8/sys/sys/reboot.h 199583 2009-11-20 15:27:52Z jhb $
+ */
+
+#ifndef GRUB_FREEBSD_REBOOT_CPU_HEADER
+#define GRUB_FREEBSD_REBOOT_CPU_HEADER 1
+
+#define FREEBSD_RB_ASKNAME (1 << 0) /* ask for file name to reboot from */
+#define FREEBSD_RB_SINGLE (1 << 1) /* reboot to single user only */
+#define FREEBSD_RB_NOSYNC (1 << 2) /* dont sync before reboot */
+#define FREEBSD_RB_HALT (1 << 3) /* don't reboot, just halt */
+#define FREEBSD_RB_INITNAME (1 << 4) /* name given for /etc/init (unused) */
+#define FREEBSD_RB_DFLTROOT (1 << 5) /* use compiled-in rootdev */
+#define FREEBSD_RB_KDB (1 << 6) /* give control to kernel debugger */
+#define FREEBSD_RB_RDONLY (1 << 7) /* mount root fs read-only */
+#define FREEBSD_RB_DUMP (1 << 8) /* dump kernel memory before reboot */
+#define FREEBSD_RB_MINIROOT (1 << 9) /* mini-root present in memory at boot time */
+#define FREEBSD_RB_CONFIG (1 << 10) /* invoke user configuration routing */
+#define FREEBSD_RB_VERBOSE (1 << 11) /* print all potentially useful info */
+#define FREEBSD_RB_SERIAL (1 << 12) /* user serial port as console */
+#define FREEBSD_RB_CDROM (1 << 13) /* use cdrom as root */
+#define FREEBSD_RB_GDB (1 << 15) /* use GDB remote debugger instead of DDB */
+#define FREEBSD_RB_MUTE (1 << 16) /* Come up with the console muted */
+#define FREEBSD_RB_PAUSE (1 << 20)
+#define FREEBSD_RB_QUIET (1 << 21)
+#define FREEBSD_RB_NOINTR (1 << 28)
+#define FREENSD_RB_MULTIPLE (1 << 29) /* Use multiple consoles */
+#define FREEBSD_RB_DUAL FREENSD_RB_MULTIPLE
+#define FREEBSD_RB_BOOTINFO (1 << 31) /* have `struct bootinfo *' arg */
+
+#endif
diff --git a/include/grub/i386/gdb.h b/include/grub/i386/gdb.h
new file mode 100644
index 0000000..92d2dac
--- /dev/null
+++ b/include/grub/i386/gdb.h
@@ -0,0 +1,78 @@
+/* i386/gdb.h - i386 specific definitions for the remote GDB stub */
+/*
+ * Copyright (C) 2006 Lubomir Kundrak
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef GRUB_GDB_CPU_HEADER
+#define GRUB_GDB_CPU_HEADER 1
+
+#define GRUB_GDB_LAST_TRAP 31
+/* You may have to edit the bottom of machdep.S when adjusting
+ GRUB_GDB_LAST_TRAP. */
+#define GRUB_MACHINE_NR_REGS 16
+
+#define EAX 0
+#define ECX 1
+#define EDX 2
+#define EBX 3
+#define ESP 4
+#define EBP 5
+#define ESI 6
+#define EDI 7
+#define EIP 8
+#define EFLAGS 9
+#define CS 10
+#define SS 11
+#define DS 12
+#define ES 13
+#define FS 14
+#define GS 15
+
+#define PC EIP
+#define FP EBP
+#define SP ESP
+#define PS EFLAGS
+
+#ifndef ASM_FILE
+
+#include <grub/gdb.h>
+
+#define GRUB_CPU_TRAP_GATE 15
+
+struct grub_cpu_interrupt_gate
+{
+ grub_uint16_t offset_lo;
+ grub_uint16_t selector;
+ grub_uint8_t unused;
+ grub_uint8_t gate;
+ grub_uint16_t offset_hi;
+} GRUB_PACKED;
+
+struct grub_cpu_idt_descriptor
+{
+ grub_uint16_t limit;
+ grub_uint32_t base;
+} GRUB_PACKED;
+
+extern void (*grub_gdb_trapvec[]) (void);
+void grub_gdb_idtinit (void);
+void grub_gdb_idtrestore (void);
+void grub_gdb_trap (int trap_no) __attribute__ ((regparm(3)));
+
+#endif /* ! ASM */
+#endif /* ! GRUB_GDB_CPU_HEADER */
+
diff --git a/include/grub/i386/ieee1275/ieee1275.h b/include/grub/i386/ieee1275/ieee1275.h
new file mode 100644
index 0000000..2625f02
--- /dev/null
+++ b/include/grub/i386/ieee1275/ieee1275.h
@@ -0,0 +1 @@
+#include <grub/powerpc/ieee1275/ieee1275.h>
diff --git a/include/grub/i386/ieee1275/kernel.h b/include/grub/i386/ieee1275/kernel.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/grub/i386/ieee1275/kernel.h
diff --git a/include/grub/i386/ieee1275/memory.h b/include/grub/i386/ieee1275/memory.h
new file mode 100644
index 0000000..8dd6f7c
--- /dev/null
+++ b/include/grub/i386/ieee1275/memory.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/memory.h>
diff --git a/include/grub/i386/ieee1275/serial.h b/include/grub/i386/ieee1275/serial.h
new file mode 100644
index 0000000..2d85634
--- /dev/null
+++ b/include/grub/i386/ieee1275/serial.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/serial.h>
diff --git a/include/grub/i386/io.h b/include/grub/i386/io.h
new file mode 100644
index 0000000..e9cd809
--- /dev/null
+++ b/include/grub/i386/io.h
@@ -0,0 +1,72 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 1996,2000,2002,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Based on sys/io.h from GNU libc. */
+
+#ifndef GRUB_IO_H
+#define GRUB_IO_H 1
+
+typedef unsigned short int grub_port_t;
+
+static __inline unsigned char
+grub_inb (unsigned short int port)
+{
+ unsigned char _v;
+
+ asm volatile ("inb %w1,%0":"=a" (_v):"Nd" (port));
+ return _v;
+}
+
+static __inline unsigned short int
+grub_inw (unsigned short int port)
+{
+ unsigned short _v;
+
+ asm volatile ("inw %w1,%0":"=a" (_v):"Nd" (port));
+ return _v;
+}
+
+static __inline unsigned int
+grub_inl (unsigned short int port)
+{
+ unsigned int _v;
+
+ asm volatile ("inl %w1,%0":"=a" (_v):"Nd" (port));
+ return _v;
+}
+
+static __inline void
+grub_outb (unsigned char value, unsigned short int port)
+{
+ asm volatile ("outb %b0,%w1": :"a" (value), "Nd" (port));
+}
+
+static __inline void
+grub_outw (unsigned short int value, unsigned short int port)
+{
+ asm volatile ("outw %w0,%w1": :"a" (value), "Nd" (port));
+
+}
+
+static __inline void
+grub_outl (unsigned int value, unsigned short int port)
+{
+ asm volatile ("outl %0,%w1": :"a" (value), "Nd" (port));
+}
+
+#endif /* _SYS_IO_H */
diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h
new file mode 100644
index 0000000..eddf925
--- /dev/null
+++ b/include/grub/i386/linux.h
@@ -0,0 +1,336 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 1999,2000,2001,2002,2003,2004,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_I386_LINUX_HEADER
+#define GRUB_I386_LINUX_HEADER 1
+
+#include <grub/types.h>
+
+#define GRUB_LINUX_I386_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */
+#define GRUB_LINUX_DEFAULT_SETUP_SECTS 4
+#define GRUB_LINUX_INITRD_MAX_ADDRESS 0x37FFFFFF
+#define GRUB_LINUX_MAX_SETUP_SECTS 64
+#define GRUB_LINUX_BOOT_LOADER_TYPE 0x72
+#define GRUB_LINUX_HEAP_END_OFFSET (0x9000 - 0x200)
+
+#define GRUB_LINUX_BZIMAGE_ADDR 0x100000
+#define GRUB_LINUX_ZIMAGE_ADDR 0x10000
+#define GRUB_LINUX_OLD_REAL_MODE_ADDR 0x90000
+#define GRUB_LINUX_SETUP_STACK 0x9000
+
+#define GRUB_LINUX_FLAG_BIG_KERNEL 0x1
+#define GRUB_LINUX_FLAG_QUIET 0x20
+#define GRUB_LINUX_FLAG_CAN_USE_HEAP 0x80
+
+/* Linux's video mode selection support. Actually I hate it! */
+#define GRUB_LINUX_VID_MODE_NORMAL 0xFFFF
+#define GRUB_LINUX_VID_MODE_EXTENDED 0xFFFE
+#define GRUB_LINUX_VID_MODE_ASK 0xFFFD
+#define GRUB_LINUX_VID_MODE_VESA_START 0x0300
+
+#define GRUB_LINUX_CL_MAGIC 0xA33F
+
+#define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0)
+#define VIDEO_CAPABILITY_64BIT_BASE (1 << 1) /* Frame buffer base is 64-bit. */
+
+/* Maximum number of MBR signatures to store. */
+#define EDD_MBR_SIG_MAX 16
+
+#ifdef __x86_64__
+
+#define GRUB_LINUX_EFI_SIGNATURE \
+ ('4' << 24 | '6' << 16 | 'L' << 8 | 'E')
+
+#else
+
+#define GRUB_LINUX_EFI_SIGNATURE \
+ ('2' << 24 | '3' << 16 | 'L' << 8 | 'E')
+
+#endif
+
+#define GRUB_LINUX_EFI_SIGNATURE_0204 \
+ ('L' << 24 | 'I' << 16 | 'F' << 8 | 'E')
+
+#define GRUB_LINUX_OFW_SIGNATURE \
+ (' ' << 24 | 'W' << 16 | 'F' << 8 | 'O')
+
+#ifndef ASM_FILE
+
+#define GRUB_E820_RAM 1
+#define GRUB_E820_RESERVED 2
+#define GRUB_E820_ACPI 3
+#define GRUB_E820_NVS 4
+#define GRUB_E820_BADRAM 5
+
+struct grub_e820_mmap
+{
+ grub_uint64_t addr;
+ grub_uint64_t size;
+ grub_uint32_t type;
+} GRUB_PACKED;
+
+enum
+ {
+ GRUB_VIDEO_LINUX_TYPE_TEXT = 0x01,
+ GRUB_VIDEO_LINUX_TYPE_VESA = 0x23, /* VESA VGA in graphic mode. */
+ GRUB_VIDEO_LINUX_TYPE_EFIFB = 0x70, /* EFI Framebuffer. */
+ GRUB_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */
+ };
+
+/* For the Linux/i386 boot protocol version 2.10. */
+struct linux_i386_kernel_header
+{
+ grub_uint8_t code1[0x0020];
+ grub_uint16_t cl_magic; /* Magic number 0xA33F */
+ grub_uint16_t cl_offset; /* The offset of command line */
+ grub_uint8_t code2[0x01F1 - 0x0020 - 2 - 2];
+ grub_uint8_t setup_sects; /* The size of the setup in sectors */
+ grub_uint16_t root_flags; /* If the root is mounted readonly */
+ grub_uint16_t syssize; /* obsolete */
+ grub_uint16_t swap_dev; /* obsolete */
+ grub_uint16_t ram_size; /* obsolete */
+ grub_uint16_t vid_mode; /* Video mode control */
+ grub_uint16_t root_dev; /* Default root device number */
+ grub_uint16_t boot_flag; /* 0xAA55 magic number */
+ grub_uint16_t jump; /* Jump instruction */
+ grub_uint32_t header; /* Magic signature "HdrS" */
+ grub_uint16_t version; /* Boot protocol version supported */
+ grub_uint32_t realmode_swtch; /* Boot loader hook */
+ grub_uint16_t start_sys; /* The load-low segment (obsolete) */
+ grub_uint16_t kernel_version; /* Points to kernel version string */
+ grub_uint8_t type_of_loader; /* Boot loader identifier */
+#define LINUX_LOADER_ID_LILO 0x0
+#define LINUX_LOADER_ID_LOADLIN 0x1
+#define LINUX_LOADER_ID_BOOTSECT 0x2
+#define LINUX_LOADER_ID_SYSLINUX 0x3
+#define LINUX_LOADER_ID_ETHERBOOT 0x4
+#define LINUX_LOADER_ID_ELILO 0x5
+#define LINUX_LOADER_ID_GRUB 0x7
+#define LINUX_LOADER_ID_UBOOT 0x8
+#define LINUX_LOADER_ID_XEN 0x9
+#define LINUX_LOADER_ID_GUJIN 0xa
+#define LINUX_LOADER_ID_QEMU 0xb
+ grub_uint8_t loadflags; /* Boot protocol option flags */
+ grub_uint16_t setup_move_size; /* Move to high memory size */
+ grub_uint32_t code32_start; /* Boot loader hook */
+ grub_uint32_t ramdisk_image; /* initrd load address */
+ grub_uint32_t ramdisk_size; /* initrd size */
+ grub_uint32_t bootsect_kludge; /* obsolete */
+ grub_uint16_t heap_end_ptr; /* Free memory after setup end */
+ grub_uint16_t pad1; /* Unused */
+ grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */
+ grub_uint32_t initrd_addr_max; /* Highest address for initrd */
+ grub_uint32_t kernel_alignment;
+ grub_uint8_t relocatable;
+ grub_uint8_t min_alignment;
+ grub_uint8_t pad[2];
+ grub_uint32_t cmdline_size;
+ grub_uint32_t hardware_subarch;
+ grub_uint64_t hardware_subarch_data;
+ grub_uint32_t payload_offset;
+ grub_uint32_t payload_length;
+ grub_uint64_t setup_data;
+ grub_uint64_t pref_address;
+ grub_uint32_t init_size;
+ grub_uint32_t handover_offset;
+} GRUB_PACKED;
+
+/* Boot parameters for Linux based on 2.6.12. This is used by the setup
+ sectors of Linux, and must be simulated by GRUB on EFI, because
+ the setup sectors depend on BIOS. */
+struct linux_kernel_params
+{
+ grub_uint8_t video_cursor_x; /* 0 */
+ grub_uint8_t video_cursor_y;
+
+ grub_uint16_t ext_mem; /* 2 */
+
+ grub_uint16_t video_page; /* 4 */
+ grub_uint8_t video_mode; /* 6 */
+ grub_uint8_t video_width; /* 7 */
+
+ grub_uint8_t padding1[0xa - 0x8];
+
+ grub_uint16_t video_ega_bx; /* a */
+
+ grub_uint8_t padding2[0xe - 0xc];
+
+ grub_uint8_t video_height; /* e */
+ grub_uint8_t have_vga; /* f */
+ grub_uint16_t font_size; /* 10 */
+
+ grub_uint16_t lfb_width; /* 12 */
+ grub_uint16_t lfb_height; /* 14 */
+ grub_uint16_t lfb_depth; /* 16 */
+ grub_uint32_t lfb_base; /* 18 */
+ grub_uint32_t lfb_size; /* 1c */
+
+ grub_uint16_t cl_magic; /* 20 */
+ grub_uint16_t cl_offset;
+
+ grub_uint16_t lfb_line_len; /* 24 */
+ grub_uint8_t red_mask_size; /* 26 */
+ grub_uint8_t red_field_pos;
+ grub_uint8_t green_mask_size;
+ grub_uint8_t green_field_pos;
+ grub_uint8_t blue_mask_size;
+ grub_uint8_t blue_field_pos;
+ grub_uint8_t reserved_mask_size;
+ grub_uint8_t reserved_field_pos;
+ grub_uint16_t vesapm_segment; /* 2e */
+ grub_uint16_t vesapm_offset; /* 30 */
+ grub_uint16_t lfb_pages; /* 32 */
+ grub_uint16_t vesa_attrib; /* 34 */
+ grub_uint32_t capabilities; /* 36 */
+ grub_uint32_t ext_lfb_base; /* 3a */
+
+ grub_uint8_t padding3[0x40 - 0x3e];
+
+ grub_uint16_t apm_version; /* 40 */
+ grub_uint16_t apm_code_segment; /* 42 */
+ grub_uint32_t apm_entry; /* 44 */
+ grub_uint16_t apm_16bit_code_segment; /* 48 */
+ grub_uint16_t apm_data_segment; /* 4a */
+ grub_uint16_t apm_flags; /* 4c */
+ grub_uint32_t apm_code_len; /* 4e */
+ grub_uint16_t apm_data_len; /* 52 */
+
+ grub_uint8_t padding4[0x60 - 0x54];
+
+ grub_uint32_t ist_signature; /* 60 */
+ grub_uint32_t ist_command; /* 64 */
+ grub_uint32_t ist_event; /* 68 */
+ grub_uint32_t ist_perf_level; /* 6c */
+ grub_uint64_t acpi_rsdp_addr; /* 70 */
+
+ grub_uint8_t padding5[0x80 - 0x78];
+
+ grub_uint8_t hd0_drive_info[0x10]; /* 80 */
+ grub_uint8_t hd1_drive_info[0x10]; /* 90 */
+ grub_uint16_t rom_config_len; /* a0 */
+
+ grub_uint8_t padding6[0xb0 - 0xa2];
+
+ grub_uint32_t ofw_signature; /* b0 */
+ grub_uint32_t ofw_num_items; /* b4 */
+ grub_uint32_t ofw_cif_handler; /* b8 */
+ grub_uint32_t ofw_idt; /* bc */
+
+ grub_uint8_t padding7[0x1b8 - 0xc0];
+
+ union
+ {
+ struct
+ {
+ grub_uint32_t efi_system_table; /* 1b8 */
+ grub_uint32_t padding7_1; /* 1bc */
+ grub_uint32_t efi_signature; /* 1c0 */
+ grub_uint32_t efi_mem_desc_size; /* 1c4 */
+ grub_uint32_t efi_mem_desc_version; /* 1c8 */
+ grub_uint32_t efi_mmap_size; /* 1cc */
+ grub_uint32_t efi_mmap; /* 1d0 */
+ } v0204;
+ struct
+ {
+ grub_uint32_t padding7_1; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_signature; /* 1c0 */
+ grub_uint32_t efi_system_table; /* 1c4 */
+ grub_uint32_t efi_mem_desc_size; /* 1c8 */
+ grub_uint32_t efi_mem_desc_version; /* 1cc */
+ grub_uint32_t efi_mmap; /* 1d0 */
+ grub_uint32_t efi_mmap_size; /* 1d4 */
+ } v0206;
+ struct
+ {
+ grub_uint32_t padding7_1; /* 1b8 */
+ grub_uint32_t padding7_2; /* 1bc */
+ grub_uint32_t efi_signature; /* 1c0 */
+ grub_uint32_t efi_system_table; /* 1c4 */
+ grub_uint32_t efi_mem_desc_size; /* 1c8 */
+ grub_uint32_t efi_mem_desc_version; /* 1cc */
+ grub_uint32_t efi_mmap; /* 1d0 */
+ grub_uint32_t efi_mmap_size; /* 1d4 */
+ grub_uint32_t efi_system_table_hi; /* 1d8 */
+ grub_uint32_t efi_mmap_hi; /* 1dc */
+ } v0208;
+ };
+
+ grub_uint32_t alt_mem; /* 1e0 */
+
+ grub_uint8_t padding8[0x1e8 - 0x1e4];
+
+ grub_uint8_t mmap_size; /* 1e8 */
+
+ grub_uint8_t padding9[0x1ec - 0x1e9];
+
+ grub_uint8_t secure_boot; /* 1ec */
+
+ grub_uint8_t padding10[0x1f1 - 0x1ed];
+
+ /* Linux setup header copy - BEGIN. */
+ grub_uint8_t setup_sects; /* The size of the setup in sectors */
+ grub_uint16_t root_flags; /* If the root is mounted readonly */
+ grub_uint16_t syssize; /* obsolete */
+ grub_uint16_t swap_dev; /* obsolete */
+ grub_uint16_t ram_size; /* obsolete */
+ grub_uint16_t vid_mode; /* Video mode control */
+ grub_uint16_t root_dev; /* Default root device number */
+
+ grub_uint8_t padding11; /* 1fe */
+ grub_uint8_t ps_mouse; /* 1ff */
+
+ grub_uint16_t jump; /* Jump instruction */
+ grub_uint32_t header; /* Magic signature "HdrS" */
+ grub_uint16_t version; /* Boot protocol version supported */
+ grub_uint32_t realmode_swtch; /* Boot loader hook */
+ grub_uint16_t start_sys; /* The load-low segment (obsolete) */
+ grub_uint16_t kernel_version; /* Points to kernel version string */
+ grub_uint8_t type_of_loader; /* Boot loader identifier */
+ grub_uint8_t loadflags; /* Boot protocol option flags */
+ grub_uint16_t setup_move_size; /* Move to high memory size */
+ grub_uint32_t code32_start; /* Boot loader hook */
+ grub_uint32_t ramdisk_image; /* initrd load address */
+ grub_uint32_t ramdisk_size; /* initrd size */
+ grub_uint32_t bootsect_kludge; /* obsolete */
+ grub_uint16_t heap_end_ptr; /* Free memory after setup end */
+ grub_uint8_t ext_loader_ver; /* Extended loader version */
+ grub_uint8_t ext_loader_type; /* Extended loader type */
+ grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */
+ grub_uint32_t initrd_addr_max; /* Maximum initrd address */
+ grub_uint32_t kernel_alignment; /* Alignment of the kernel */
+ grub_uint8_t relocatable_kernel; /* Is the kernel relocatable */
+ grub_uint8_t pad1[3];
+ grub_uint32_t cmdline_size; /* Size of the kernel command line */
+ grub_uint32_t hardware_subarch;
+ grub_uint64_t hardware_subarch_data;
+ grub_uint32_t payload_offset;
+ grub_uint32_t payload_length;
+ grub_uint64_t setup_data;
+ grub_uint64_t pref_address;
+ grub_uint32_t init_size;
+ grub_uint32_t handover_offset;
+ /* Linux setup header copy - END. */
+
+ grub_uint8_t _pad7[40];
+ grub_uint32_t edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 290 */
+ struct grub_e820_mmap e820_map[(0x400 - 0x2d0) / 20]; /* 2d0 */
+} GRUB_PACKED;
+#endif /* ! ASM_FILE */
+
+#endif /* ! GRUB_I386_LINUX_HEADER */
diff --git a/include/grub/i386/macho.h b/include/grub/i386/macho.h
new file mode 100644
index 0000000..e15167a
--- /dev/null
+++ b/include/grub/i386/macho.h
@@ -0,0 +1,32 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_MACHO_H
+#define GRUB_CPU_MACHO_H 1
+
+#include <grub/macho.h>
+
+#define GRUB_MACHO_CPUTYPE_IS_HOST32(x) ((x) == GRUB_MACHO_CPUTYPE_IA32)
+#define GRUB_MACHO_CPUTYPE_IS_HOST64(x) ((x) == GRUB_MACHO_CPUTYPE_AMD64)
+#ifdef __x86_64__
+#define GRUB_MACHO_CPUTYPE_IS_HOST_CURRENT(x) ((x) == GRUB_MACHO_CPUTYPE_AMD64)
+#else
+#define GRUB_MACHO_CPUTYPE_IS_HOST_CURRENT(x) ((x) == GRUB_MACHO_CPUTYPE_IA32)
+#endif
+
+#endif
diff --git a/include/grub/i386/memory.h b/include/grub/i386/memory.h
new file mode 100644
index 0000000..5cb607f
--- /dev/null
+++ b/include/grub/i386/memory.h
@@ -0,0 +1,80 @@
+/* memory.h - describe the memory map */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_CPU_HEADER
+#define GRUB_MEMORY_CPU_HEADER 1
+
+#define PAGE_SHIFT 12
+
+/* The flag for protected mode. */
+#define GRUB_MEMORY_CPU_CR0_PE_ON 0x1
+#define GRUB_MEMORY_CPU_CR4_PAE_ON 0x00000020
+#define GRUB_MEMORY_CPU_CR4_PSE_ON 0x00000010
+#define GRUB_MEMORY_CPU_CR0_PAGING_ON 0x80000000
+#define GRUB_MEMORY_CPU_AMD64_MSR 0xc0000080
+#define GRUB_MEMORY_CPU_AMD64_MSR_ON 0x00000100
+
+#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
+#define GRUB_MEMORY_MACHINE_LOWER_SIZE GRUB_MEMORY_MACHINE_UPPER_START
+
+/* Some PTE definitions. */
+#define GRUB_PAGE_PRESENT 0x00000001
+#define GRUB_PAGE_RW 0x00000002
+#define GRUB_PAGE_USER 0x00000004
+
+#ifndef ASM_FILE
+
+#define GRUB_MMAP_MALLOC_LOW 1
+
+#include <grub/types.h>
+
+struct grub_e820_mmap_entry
+{
+ grub_uint64_t addr;
+ grub_uint64_t len;
+ grub_uint32_t type;
+} GRUB_PACKED;
+
+grub_uint64_t grub_mmap_get_upper (void);
+grub_uint64_t grub_mmap_get_lower (void);
+grub_uint64_t grub_mmap_get_post64 (void);
+
+typedef grub_addr_t grub_phys_addr_t;
+
+static inline grub_phys_addr_t
+grub_vtop (void *a)
+{
+ return (grub_phys_addr_t) a;
+}
+
+static inline void *
+grub_map_memory (grub_phys_addr_t a, grub_size_t size __attribute__ ((unused)))
+{
+ return (void *) a;
+}
+
+static inline void
+grub_unmap_memory (void *a __attribute__ ((unused)),
+ grub_size_t size __attribute__ ((unused)))
+{
+}
+
+#endif
+
+#endif /* ! GRUB_MEMORY_CPU_HEADER */
diff --git a/include/grub/i386/memory_raw.h b/include/grub/i386/memory_raw.h
new file mode 100644
index 0000000..1292ba7
--- /dev/null
+++ b/include/grub/i386/memory_raw.h
@@ -0,0 +1,58 @@
+/* memory_raw.h - describe the memory map on qemu/coreboot/multiboot/pc */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2007,2008,2009,2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_CPU_RAW_HEADER
+#define GRUB_MEMORY_CPU_RAW_HEADER 1
+
+/* The scratch buffer used in real mode code. */
+#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000
+#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
+#define GRUB_MEMORY_MACHINE_SCRATCH_SIZE 0x9000
+
+/* The real mode stack. */
+#define GRUB_MEMORY_MACHINE_REAL_STACK (0x2000 - 0x10)
+
+/* The size of the protect mode stack. */
+#define GRUB_MEMORY_MACHINE_PROT_STACK_SIZE 0xf000
+
+/* The protected mode stack. */
+#define GRUB_MEMORY_MACHINE_PROT_STACK \
+ (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + GRUB_MEMORY_MACHINE_SCRATCH_SIZE \
+ + GRUB_MEMORY_MACHINE_PROT_STACK_SIZE - 0x10)
+
+/* The memory area where GRUB uses its own purpose. This part is not added
+ into free memory for dynamic allocations. */
+#define GRUB_MEMORY_MACHINE_RESERVED_START \
+ GRUB_MEMORY_MACHINE_SCRATCH_ADDR
+#define GRUB_MEMORY_MACHINE_RESERVED_END \
+ (GRUB_MEMORY_MACHINE_PROT_STACK + 0x10)
+
+/* The code segment of the protected mode. */
+#define GRUB_MEMORY_MACHINE_PROT_MODE_CSEG 0x8
+
+/* The data segment of the protected mode. */
+#define GRUB_MEMORY_MACHINE_PROT_MODE_DSEG 0x10
+
+/* The code segment of the pseudo real mode. */
+#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_CSEG 0x18
+
+/* The data segment of the pseudo real mode. */
+#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_DSEG 0x20
+
+#endif
diff --git a/include/grub/i386/multiboot.h b/include/grub/i386/multiboot.h
new file mode 100644
index 0000000..0b596fc
--- /dev/null
+++ b/include/grub/i386/multiboot.h
@@ -0,0 +1,58 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2003,2004,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MULTIBOOT_CPU_HEADER
+#define GRUB_MULTIBOOT_CPU_HEADER 1
+
+#define MULTIBOOT2_INITIAL_STATE { .eax = MULTIBOOT2_BOOTLOADER_MAGIC, \
+ .ecx = 0, \
+ .edx = 0, \
+ /* Set esp to some random location in low memory to avoid breaking */ \
+ /* non-compliant kernels. */ \
+ .esp = 0x7ff00 \
+ }
+#define MULTIBOOT_INITIAL_STATE { .eax = MULTIBOOT_BOOTLOADER_MAGIC, \
+ .ecx = 0, \
+ .edx = 0, \
+ /* Set esp to some random location in low memory to avoid breaking */ \
+ /* non-compliant kernels. */ \
+ .esp = 0x7ff00 \
+ }
+#define MULTIBOOT_ENTRY_REGISTER eip
+#define MULTIBOOT_MBI_REGISTER ebx
+#define MULTIBOOT2_ARCHITECTURE_CURRENT MULTIBOOT2_ARCHITECTURE_I386
+
+#ifdef GRUB_MACHINE_EFI
+#ifdef __x86_64__
+#define MULTIBOOT_EFI_INITIAL_STATE { .rax = MULTIBOOT_BOOTLOADER_MAGIC, \
+ .rcx = 0, \
+ .rdx = 0, \
+ }
+#define MULTIBOOT2_EFI_INITIAL_STATE { .rax = MULTIBOOT2_BOOTLOADER_MAGIC, \
+ .rcx = 0, \
+ .rdx = 0, \
+ }
+#define MULTIBOOT_EFI_ENTRY_REGISTER rip
+#define MULTIBOOT_EFI_MBI_REGISTER rbx
+#endif
+#endif
+
+#define MULTIBOOT_ELF32_MACHINE EM_386
+#define MULTIBOOT_ELF64_MACHINE EM_X86_64
+
+#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
diff --git a/include/grub/i386/multiboot/boot.h b/include/grub/i386/multiboot/boot.h
new file mode 100644
index 0000000..c33f9ba
--- /dev/null
+++ b/include/grub/i386/multiboot/boot.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/boot.h>
diff --git a/include/grub/i386/multiboot/console.h b/include/grub/i386/multiboot/console.h
new file mode 100644
index 0000000..774399a
--- /dev/null
+++ b/include/grub/i386/multiboot/console.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/console.h>
diff --git a/include/grub/i386/multiboot/kernel.h b/include/grub/i386/multiboot/kernel.h
new file mode 100644
index 0000000..b41e86e
--- /dev/null
+++ b/include/grub/i386/multiboot/kernel.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/kernel.h>
diff --git a/include/grub/i386/multiboot/memory.h b/include/grub/i386/multiboot/memory.h
new file mode 100644
index 0000000..8dd6f7c
--- /dev/null
+++ b/include/grub/i386/multiboot/memory.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/memory.h>
diff --git a/include/grub/i386/multiboot/serial.h b/include/grub/i386/multiboot/serial.h
new file mode 100644
index 0000000..2d85634
--- /dev/null
+++ b/include/grub/i386/multiboot/serial.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/serial.h>
diff --git a/include/grub/i386/multiboot/time.h b/include/grub/i386/multiboot/time.h
new file mode 100644
index 0000000..7177c74
--- /dev/null
+++ b/include/grub/i386/multiboot/time.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/time.h>
diff --git a/include/grub/i386/netbsd_bootinfo.h b/include/grub/i386/netbsd_bootinfo.h
new file mode 100644
index 0000000..9b4f460
--- /dev/null
+++ b/include/grub/i386/netbsd_bootinfo.h
@@ -0,0 +1,156 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* $NetBSD: bootinfo.h,v 1.16 2009/08/24 02:15:46 jmcneill Exp $ */
+
+/*
+ * Copyright (c) 1997
+ * Matthias Drochner. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GRUB_NETBSD_BOOTINFO_CPU_HEADER
+#define GRUB_NETBSD_BOOTINFO_CPU_HEADER 1
+
+#include <grub/types.h>
+
+#define NETBSD_BTINFO_BOOTPATH 0
+#define NETBSD_BTINFO_ROOTDEVICE 1
+#define NETBSD_BTINFO_BOOTDISK 3
+#define NETBSD_BTINFO_CONSOLE 6
+#define NETBSD_BTINFO_SYMTAB 8
+#define NETBSD_BTINFO_MEMMAP 9
+#define NETBSD_BTINFO_BOOTWEDGE 10
+#define NETBSD_BTINFO_MODULES 11
+#define NETBSD_BTINFO_FRAMEBUF 12
+#define NETBSD_BTINFO_USERCONFCOMMANDS 13
+#define NETBSD_BTINFO_EFI 14
+
+struct grub_netbsd_bootinfo
+{
+ grub_uint32_t bi_count;
+ grub_uint32_t bi_data[0];
+};
+
+struct grub_netbsd_btinfo_common
+{
+ grub_uint32_t len;
+ grub_uint32_t type;
+};
+
+#define GRUB_NETBSD_MAX_BOOTPATH_LEN 80
+
+struct grub_netbsd_btinfo_bootdisk
+{
+ grub_uint32_t labelsector; /* label valid if != 0xffffffff */
+ struct
+ {
+ grub_uint16_t type, checksum;
+ char packname[16];
+ } label;
+ grub_uint32_t biosdev;
+ grub_uint32_t partition;
+};
+
+struct grub_netbsd_btinfo_bootwedge {
+ grub_uint32_t biosdev;
+ grub_disk_addr_t startblk;
+ grub_uint64_t nblks;
+ grub_disk_addr_t matchblk;
+ grub_uint64_t matchnblks;
+ grub_uint8_t matchhash[16]; /* MD5 hash */
+} GRUB_PACKED;
+
+struct grub_netbsd_btinfo_symtab
+{
+ grub_uint32_t nsyms;
+ grub_uint32_t ssyms;
+ grub_uint32_t esyms;
+};
+
+
+struct grub_netbsd_btinfo_serial
+{
+ char devname[16];
+ grub_uint32_t addr;
+ grub_uint32_t speed;
+};
+
+struct grub_netbsd_btinfo_modules
+{
+ grub_uint32_t num;
+ grub_uint32_t last_addr;
+ struct grub_netbsd_btinfo_module
+ {
+ char name[80];
+#define GRUB_NETBSD_MODULE_RAW 0
+#define GRUB_NETBSD_MODULE_ELF 1
+ grub_uint32_t type;
+ grub_uint32_t size;
+ grub_uint32_t addr;
+ } mods[0];
+};
+
+struct grub_netbsd_btinfo_framebuf
+{
+ grub_uint64_t fbaddr;
+ grub_uint32_t flags;
+ grub_uint32_t width;
+ grub_uint32_t height;
+ grub_uint16_t pitch;
+ grub_uint8_t bpp;
+
+ grub_uint8_t red_mask_size;
+ grub_uint8_t green_mask_size;
+ grub_uint8_t blue_mask_size;
+
+ grub_uint8_t red_field_pos;
+ grub_uint8_t green_field_pos;
+ grub_uint8_t blue_field_pos;
+
+ grub_uint8_t reserved[16];
+};
+
+#define GRUB_NETBSD_MAX_ROOTDEVICE_LEN 16
+
+struct grub_netbsd_btinfo_efi
+{
+ void *pa_systbl; /* Physical address of the EFI System Table */
+};
+
+#endif
diff --git a/include/grub/i386/netbsd_reboot.h b/include/grub/i386/netbsd_reboot.h
new file mode 100644
index 0000000..ee82455
--- /dev/null
+++ b/include/grub/i386/netbsd_reboot.h
@@ -0,0 +1,81 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* $NetBSD: reboot.h,v 1.25 2007/12/25 18:33:48 perry Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)reboot.h 8.3 (Berkeley) 12/13/94
+ */
+
+#ifndef GRUB_NETBSD_REBOOT_CPU_HEADER
+#define GRUB_NETBSD_REBOOT_CPU_HEADER 1
+
+#define NETBSD_RB_AUTOBOOT 0 /* flags for system auto-booting itself */
+
+#define NETBSD_RB_ASKNAME (1 << 0) /* ask for file name to reboot from */
+#define NETBSD_RB_SINGLE (1 << 1) /* reboot to single user only */
+#define NETBSD_RB_NOSYNC (1 << 2) /* dont sync before reboot */
+#define NETBSD_RB_HALT (1 << 3) /* don't reboot, just halt */
+#define NETBSD_RB_INITNAME (1 << 4) /* name given for /etc/init (unused) */
+#define NETBSD_RB_UNUSED1 (1 << 5) /* was RB_DFLTROOT, obsolete */
+#define NETBSD_RB_KDB (1 << 6) /* give control to kernel debugger */
+#define NETBSD_RB_RDONLY (1 << 7) /* mount root fs read-only */
+#define NETBSD_RB_DUMP (1 << 8) /* dump kernel memory before reboot */
+#define NETBSD_RB_MINIROOT (1 << 9) /* mini-root present in memory at boot time */
+#define NETBSD_RB_STRING (1 << 10) /* use provided bootstr */
+#define NETBSD_RB_POWERDOWN ((1 << 11) | RB_HALT) /* turn power off (or at least halt) */
+#define NETBSD_RB_USERCONFIG (1 << 12) /* change configured devices */
+
+#define NETBSD_AB_NORMAL 0 /* boot normally (default) */
+
+#define NETBSD_AB_QUIET (1 << 16) /* boot quietly */
+#define NETBSD_AB_VERBOSE (1 << 17) /* boot verbosely */
+#define NETBSD_AB_SILENT (1 << 18) /* boot silently */
+#define NETBSD_AB_DEBUG (1 << 19) /* boot with debug messages */
+#define NETBSD_AB_NOSMP (1 << 28) /* Boot without SMP support. */
+#define NETBSD_AB_NOACPI (1 << 29) /* Boot without ACPI support. */
+
+
+#endif
diff --git a/include/grub/i386/openbsd_bootarg.h b/include/grub/i386/openbsd_bootarg.h
new file mode 100644
index 0000000..9ebe6b4
--- /dev/null
+++ b/include/grub/i386/openbsd_bootarg.h
@@ -0,0 +1,93 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* $OpenBSD: bootarg.h,v 1.11 2003/06/02 20:20:54 mickey Exp $ */
+
+/*
+ * Copyright (c) 1996-1999 Michael Shalayeff
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GRUB_OPENBSD_BOOTARG_CPU_HEADER
+#define GRUB_OPENBSD_BOOTARG_CPU_HEADER 1
+
+#define OPENBSD_BOOTARG_APIVER (OPENBSD_BAPIV_VECTOR | \
+ OPENBSD_BAPIV_ENV | \
+ OPENBSD_BAPIV_BMEMMAP)
+
+#define OPENBSD_BAPIV_ANCIENT 0x0 /* MD old i386 bootblocks */
+#define OPENBSD_BAPIV_VARS 0x1 /* MD structure w/ add info passed */
+#define OPENBSD_BAPIV_VECTOR 0x2 /* MI vector of MD structures passed */
+#define OPENBSD_BAPIV_ENV 0x4 /* MI environment vars vector */
+#define OPENBSD_BAPIV_BMEMMAP 0x8 /* MI memory map passed is in bytes */
+
+#define OPENBSD_BOOTARG_ENV 0x1000
+#define OPENBSD_BOOTARG_END -1
+
+#define OPENBSD_BOOTARG_MMAP 0
+#define OPENBSD_BOOTARG_PCIBIOS 4
+#define OPENBSD_BOOTARG_CONSOLE 5
+
+struct grub_openbsd_bootargs
+{
+ grub_uint32_t ba_type;
+ grub_uint32_t ba_size;
+ grub_uint32_t ba_next;
+} GRUB_PACKED;
+
+struct grub_openbsd_bootarg_console
+{
+ grub_uint32_t device;
+ grub_uint32_t speed;
+ grub_uint32_t addr;
+ grub_uint32_t frequency;
+};
+
+struct grub_openbsd_bootarg_pcibios
+{
+ grub_uint32_t characteristics;
+ grub_uint32_t revision;
+ grub_uint32_t pm_entry;
+ grub_uint32_t last_bus;
+};
+
+#define GRUB_OPENBSD_COM_MAJOR 8
+#define GRUB_OPENBSD_VGA_MAJOR 12
+
+#endif
diff --git a/include/grub/i386/openbsd_reboot.h b/include/grub/i386/openbsd_reboot.h
new file mode 100644
index 0000000..3f6571a
--- /dev/null
+++ b/include/grub/i386/openbsd_reboot.h
@@ -0,0 +1,79 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* $OpenBSD: reboot.h,v 1.13 2004/03/10 23:02:53 tom Exp $ */
+/* $NetBSD: reboot.h,v 1.9 1996/04/22 01:23:25 christos Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)reboot.h 8.2 (Berkeley) 7/10/94
+ */
+
+#ifndef GRUB_OPENBSD_REBOOT_CPU_HEADER
+#define GRUB_OPENBSD_REBOOT_CPU_HEADER 1
+
+#define OPENBSD_RB_ASKNAME (1 << 0) /* ask for file name to reboot from */
+#define OPENBSD_RB_SINGLE (1 << 1) /* reboot to single user only */
+#define OPENBSD_RB_NOSYNC (1 << 2) /* dont sync before reboot */
+#define OPENBSD_RB_HALT (1 << 3) /* don't reboot, just halt */
+#define OPENBSD_RB_INITNAME (1 << 4) /* name given for /etc/init (unused) */
+#define OPENBSD_RB_DFLTROOT (1 << 5) /* use compiled-in rootdev */
+#define OPENBSD_RB_KDB (1 << 6) /* give control to kernel debugger */
+#define OPENBSD_RB_RDONLY (1 << 7) /* mount root fs read-only */
+#define OPENBSD_RB_DUMP (1 << 8) /* dump kernel memory before reboot */
+#define OPENBSD_RB_MINIROOT (1 << 9) /* mini-root present in memory at boot time */
+#define OPENBSD_RB_CONFIG (1 << 10) /* change configured devices */
+#define OPENBSD_RB_TIMEBAD (1 << 11) /* don't call resettodr() in boot() */
+#define OPENBSD_RB_POWERDOWN (1 << 12) /* attempt to power down machine */
+#define OPENBSD_RB_SERCONS (1 << 13) /* use serial console if available */
+#define OPENBSD_RB_USERREQ (1 << 14) /* boot() called at user request (e.g. ddb) */
+
+#define OPENBSD_B_DEVMAGIC 0xa0000000
+#define OPENBSD_B_ADAPTORSHIFT 24
+#define OPENBSD_B_CTRLSHIFT 20
+#define OPENBSD_B_UNITSHIFT 16
+#define OPENBSD_B_PARTSHIFT 8
+#define OPENBSD_B_TYPESHIFT 0
+
+#endif
diff --git a/include/grub/i386/pc/apm.h b/include/grub/i386/pc/apm.h
new file mode 100644
index 0000000..6d9e8c6
--- /dev/null
+++ b/include/grub/i386/pc/apm.h
@@ -0,0 +1,48 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_APM_MACHINE_HEADER
+#define GRUB_APM_MACHINE_HEADER 1
+
+#include <grub/types.h>
+
+struct grub_apm_info
+{
+ grub_uint16_t cseg;
+ grub_uint32_t offset;
+ grub_uint16_t cseg_16;
+ grub_uint16_t dseg;
+ grub_uint16_t flags;
+ grub_uint16_t cseg_len;
+ grub_uint16_t cseg_16_len;
+ grub_uint16_t dseg_len;
+ grub_uint16_t version;
+};
+
+enum
+ {
+ GRUB_APM_FLAGS_16BITPROTECTED_SUPPORTED = 1,
+ GRUB_APM_FLAGS_32BITPROTECTED_SUPPORTED = 2,
+ GRUB_APM_FLAGS_CPUIDLE_SLOWS_DOWN = 4,
+ GRUB_APM_FLAGS_DISABLED = 8,
+ GRUB_APM_FLAGS_DISENGAGED = 16,
+ };
+
+int grub_apm_get_info (struct grub_apm_info *info);
+
+#endif
diff --git a/include/grub/i386/pc/biosdisk.h b/include/grub/i386/pc/biosdisk.h
new file mode 100644
index 0000000..3d80716
--- /dev/null
+++ b/include/grub/i386/pc/biosdisk.h
@@ -0,0 +1,109 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2005,2007,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_BIOSDISK_MACHINE_HEADER
+#define GRUB_BIOSDISK_MACHINE_HEADER 1
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+#define GRUB_BIOSDISK_FLAG_LBA 1
+#define GRUB_BIOSDISK_FLAG_CDROM 2
+
+#define GRUB_BIOSDISK_CDTYPE_NO_EMUL 0
+#define GRUB_BIOSDISK_CDTYPE_1_2_M 1
+#define GRUB_BIOSDISK_CDTYPE_1_44_M 2
+#define GRUB_BIOSDISK_CDTYPE_2_88_M 3
+#define GRUB_BIOSDISK_CDTYPE_HARDDISK 4
+
+#define GRUB_BIOSDISK_CDTYPE_MASK 0xF
+
+struct grub_biosdisk_data
+{
+ int drive;
+ unsigned long cylinders;
+ unsigned long heads;
+ unsigned long sectors;
+ unsigned long flags;
+};
+
+/* Drive Parameters. */
+struct grub_biosdisk_drp
+{
+ grub_uint16_t size;
+ grub_uint16_t flags;
+ grub_uint32_t cylinders;
+ grub_uint32_t heads;
+ grub_uint32_t sectors;
+ grub_uint64_t total_sectors;
+ grub_uint16_t bytes_per_sector;
+ /* ver 2.0 or higher */
+
+ union
+ {
+ grub_uint32_t EDD_configuration_parameters;
+
+ /* Pointer to the Device Parameter Table Extension (ver 3.0+). */
+ grub_uint32_t dpte_pointer;
+ };
+
+ /* ver 3.0 or higher */
+ grub_uint16_t signature_dpi;
+ grub_uint8_t length_dpi;
+ grub_uint8_t reserved[3];
+ grub_uint8_t name_of_host_bus[4];
+ grub_uint8_t name_of_interface_type[8];
+ grub_uint8_t interface_path[8];
+ grub_uint8_t device_path[16];
+ grub_uint8_t reserved2;
+ grub_uint8_t checksum;
+
+ /* XXX: This is necessary, because the BIOS of Thinkpad X20
+ writes a garbage to the tail of drive parameters,
+ regardless of a size specified in a caller. */
+ grub_uint8_t dummy[16];
+} GRUB_PACKED;
+
+struct grub_biosdisk_cdrp
+{
+ grub_uint8_t size;
+ grub_uint8_t media_type;
+ grub_uint8_t drive_no;
+ grub_uint8_t controller_no;
+ grub_uint32_t image_lba;
+ grub_uint16_t device_spec;
+ grub_uint16_t cache_seg;
+ grub_uint16_t load_seg;
+ grub_uint16_t length_sec512;
+ grub_uint8_t cylinders;
+ grub_uint8_t sectors;
+ grub_uint8_t heads;
+ grub_uint8_t dummy[16];
+} GRUB_PACKED;
+
+/* Disk Address Packet. */
+struct grub_biosdisk_dap
+{
+ grub_uint8_t length;
+ grub_uint8_t reserved;
+ grub_uint16_t blocks;
+ grub_uint32_t buffer;
+ grub_uint64_t block;
+} GRUB_PACKED;
+
+#endif /* ! GRUB_BIOSDISK_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/biosnum.h b/include/grub/i386/pc/biosnum.h
new file mode 100644
index 0000000..29c8ecc
--- /dev/null
+++ b/include/grub/i386/pc/biosnum.h
@@ -0,0 +1,6 @@
+#ifndef GRUB_BIOSNUM_MACHINE_HEADER
+#define GRUB_BIOSNUM_MACHINE_HEADER 1
+
+extern int (*grub_get_root_biosnumber) (void);
+
+#endif
diff --git a/include/grub/i386/pc/boot.h b/include/grub/i386/pc/boot.h
new file mode 100644
index 0000000..a4d42ff
--- /dev/null
+++ b/include/grub/i386/pc/boot.h
@@ -0,0 +1,73 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 1999,2000,2002,2005,2006,2007,2008,2010 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_BOOT_MACHINE_HEADER
+#define GRUB_BOOT_MACHINE_HEADER 1
+
+#include <grub/offsets.h>
+
+/* The signature for bootloader. */
+#define GRUB_BOOT_MACHINE_SIGNATURE 0xaa55
+
+/* The offset of the start of BPB (BIOS Parameter Block). */
+#define GRUB_BOOT_MACHINE_BPB_START 0x3
+
+/* The offset of the end of BPB (BIOS Parameter Block). */
+#define GRUB_BOOT_MACHINE_BPB_END 0x5a
+
+/* The offset of KERNEL_SECTOR. */
+#define GRUB_BOOT_MACHINE_KERNEL_SECTOR 0x5c
+
+/* The offset of BOOT_DRIVE. */
+#define GRUB_BOOT_MACHINE_BOOT_DRIVE 0x64
+
+/* The offset of BOOT_DRIVE_CHECK. */
+#define GRUB_BOOT_MACHINE_DRIVE_CHECK 0x66
+
+/* The offset of a magic number used by Windows NT. */
+#define GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC 0x1b8
+
+/* The offset of the start of the partition table. */
+#define GRUB_BOOT_MACHINE_PART_START 0x1be
+
+/* The offset of the end of the partition table. */
+#define GRUB_BOOT_MACHINE_PART_END 0x1fe
+
+/* The stack segment. */
+#define GRUB_BOOT_MACHINE_STACK_SEG 0x2000
+
+/* The segment of disk buffer. The disk buffer MUST be 32K long and
+ cannot straddle a 64K boundary. */
+#define GRUB_BOOT_MACHINE_BUFFER_SEG 0x7000
+
+/* The flag for BIOS drive number to designate a hard disk vs. a
+ floppy. */
+#define GRUB_BOOT_MACHINE_BIOS_HD_FLAG 0x80
+
+/* The address where the kernel is loaded. */
+#define GRUB_BOOT_MACHINE_KERNEL_ADDR (GRUB_BOOT_MACHINE_KERNEL_SEG << 4)
+
+/* The size of a block list used in the kernel startup code. */
+#define GRUB_BOOT_MACHINE_LIST_SIZE 12
+
+#define GRUB_BOOT_MACHINE_PXE_DL 0x7f
+
+/* This is the blocklist used in the diskboot image. */
+#define grub_boot_blocklist grub_pc_bios_boot_blocklist
+
+#endif /* ! BOOT_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/chainloader.h b/include/grub/i386/pc/chainloader.h
new file mode 100644
index 0000000..4776b18
--- /dev/null
+++ b/include/grub/i386/pc/chainloader.h
@@ -0,0 +1,27 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CHAINLOADER_MACHINE_HEADER
+#define GRUB_CHAINLOADER_MACHINE_HEADER 1
+
+#include <grub/dl.h>
+
+void
+grub_chainloader_patch_bpb (void *bs, grub_device_t dev, grub_uint8_t dl);
+
+#endif /* GRUB_CHAINLOADER_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/console.h b/include/grub/i386/pc/console.h
new file mode 100644
index 0000000..191964f
--- /dev/null
+++ b/include/grub/i386/pc/console.h
@@ -0,0 +1,36 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2005,2007,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CONSOLE_MACHINE_HEADER
+#define GRUB_CONSOLE_MACHINE_HEADER 1
+
+#ifndef ASM_FILE
+
+#include <grub/types.h>
+#include <grub/symbol.h>
+#include <grub/term.h>
+
+/* Initialize the console system. */
+void grub_console_init (void);
+
+/* Finish the console system. */
+void grub_console_fini (void);
+
+#endif
+
+#endif /* ! GRUB_CONSOLE_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/int.h b/include/grub/i386/pc/int.h
new file mode 100644
index 0000000..a601040
--- /dev/null
+++ b/include/grub/i386/pc/int.h
@@ -0,0 +1,33 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_INTERRUPT_MACHINE_HEADER
+#define GRUB_INTERRUPT_MACHINE_HEADER 1
+
+#include <grub/symbol.h>
+#include <grub/i386/pc/int_types.h>
+
+void EXPORT_FUNC (grub_bios_interrupt) (grub_uint8_t intno,
+ struct grub_bios_int_registers *regs)
+ __attribute__ ((regparm(3)));
+
+#ifdef GRUB_MACHINE_PCBIOS
+extern struct grub_i386_idt *EXPORT_VAR(grub_realidt);
+#endif
+
+#endif
diff --git a/include/grub/i386/pc/int_types.h b/include/grub/i386/pc/int_types.h
new file mode 100644
index 0000000..2c5a69b
--- /dev/null
+++ b/include/grub/i386/pc/int_types.h
@@ -0,0 +1,59 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2018 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_INTERRUPT_TYPES_MACHINE_HEADER
+#define GRUB_INTERRUPT_TYPES_MACHINE_HEADER 1
+
+#include <grub/types.h>
+
+#define GRUB_CPU_INT_FLAGS_CARRY 0x1
+#define GRUB_CPU_INT_FLAGS_PARITY 0x4
+#define GRUB_CPU_INT_FLAGS_ADJUST 0x10
+#define GRUB_CPU_INT_FLAGS_ZERO 0x40
+#define GRUB_CPU_INT_FLAGS_SIGN 0x80
+#define GRUB_CPU_INT_FLAGS_TRAP 0x100
+#define GRUB_CPU_INT_FLAGS_INTERRUPT 0x200
+#define GRUB_CPU_INT_FLAGS_DIRECTION 0x400
+#define GRUB_CPU_INT_FLAGS_OVERFLOW 0x800
+#ifdef GRUB_MACHINE_PCBIOS
+#define GRUB_CPU_INT_FLAGS_DEFAULT GRUB_CPU_INT_FLAGS_INTERRUPT
+#else
+#define GRUB_CPU_INT_FLAGS_DEFAULT 0
+#endif
+
+struct grub_bios_int_registers
+{
+ grub_uint32_t eax;
+ grub_uint16_t es;
+ grub_uint16_t ds;
+ grub_uint16_t flags;
+ grub_uint16_t dummy;
+ grub_uint32_t ebx;
+ grub_uint32_t ecx;
+ grub_uint32_t edi;
+ grub_uint32_t esi;
+ grub_uint32_t edx;
+};
+
+struct grub_i386_idt
+{
+ grub_uint16_t limit;
+ grub_uint32_t base;
+} GRUB_PACKED;
+
+#endif
diff --git a/include/grub/i386/pc/kernel.h b/include/grub/i386/pc/kernel.h
new file mode 100644
index 0000000..4f05b74
--- /dev/null
+++ b/include/grub/i386/pc/kernel.h
@@ -0,0 +1,41 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2003,2007,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_MACHINE_HEADER
+#define KERNEL_MACHINE_HEADER 1
+
+#include <grub/offsets.h>
+
+/* Enable LZMA compression */
+#define ENABLE_LZMA 1
+
+#ifndef ASM_FILE
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+/* The total size of module images following the kernel. */
+extern grub_int32_t grub_total_module_size;
+
+extern grub_uint32_t EXPORT_VAR(grub_boot_device);
+
+extern void (*EXPORT_VAR(grub_pc_net_config)) (char **device, char **path);
+
+#endif /* ! ASM_FILE */
+
+#endif /* ! KERNEL_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/memory.h b/include/grub/i386/pc/memory.h
new file mode 100644
index 0000000..d0c5c20
--- /dev/null
+++ b/include/grub/i386/pc/memory.h
@@ -0,0 +1,63 @@
+/* memory.h - describe the memory map */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_MACHINE_HEADER
+#define GRUB_MEMORY_MACHINE_HEADER 1
+
+#include <grub/symbol.h>
+#ifndef ASM_FILE
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/memory.h>
+#endif
+
+#include <grub/i386/memory.h>
+#include <grub/i386/memory_raw.h>
+
+#include <grub/offsets.h>
+
+/* The area where GRUB is decompressed at early startup. */
+#define GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR 0x100000
+
+/* The address of a partition table passed to another boot loader. */
+#define GRUB_MEMORY_MACHINE_PART_TABLE_ADDR 0x7be
+
+/* The address where another boot loader is loaded. */
+#define GRUB_MEMORY_MACHINE_BOOT_LOADER_ADDR 0x7c00
+
+#define GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR 0x400
+
+#ifndef ASM_FILE
+
+/* See http://heim.ifi.uio.no/~stanisls/helppc/bios_data_area.html for a
+ description of the BIOS Data Area layout. */
+struct grub_machine_bios_data_area
+{
+ grub_uint8_t unused1[0x17];
+ grub_uint8_t keyboard_flag_lower; /* 0x17 */
+ grub_uint8_t unused2[0xf0 - 0x18];
+};
+
+grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size,
+ int type, int handle);
+grub_err_t grub_machine_mmap_unregister (int handle);
+
+#endif
+
+#endif /* ! GRUB_MEMORY_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/pxe.h b/include/grub/i386/pc/pxe.h
new file mode 100644
index 0000000..66002bc
--- /dev/null
+++ b/include/grub/i386/pc/pxe.h
@@ -0,0 +1,292 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_PXE_H
+#define GRUB_CPU_PXE_H
+
+#include <grub/types.h>
+
+#define GRUB_PXENV_TFTP_OPEN 0x0020
+#define GRUB_PXENV_TFTP_CLOSE 0x0021
+#define GRUB_PXENV_TFTP_READ 0x0022
+#define GRUB_PXENV_TFTP_READ_FILE 0x0023
+#define GRUB_PXENV_TFTP_READ_FILE_PMODE 0x0024
+#define GRUB_PXENV_TFTP_GET_FSIZE 0x0025
+
+#define GRUB_PXENV_UDP_OPEN 0x0030
+#define GRUB_PXENV_UDP_CLOSE 0x0031
+#define GRUB_PXENV_UDP_READ 0x0032
+#define GRUB_PXENV_UDP_WRITE 0x0033
+
+#define GRUB_PXENV_START_UNDI 0x0000
+#define GRUB_PXENV_UNDI_STARTUP 0x0001
+#define GRUB_PXENV_UNDI_CLEANUP 0x0002
+#define GRUB_PXENV_UNDI_INITIALIZE 0x0003
+#define GRUB_PXENV_UNDI_RESET_NIC 0x0004
+#define GRUB_PXENV_UNDI_SHUTDOWN 0x0005
+#define GRUB_PXENV_UNDI_OPEN 0x0006
+#define GRUB_PXENV_UNDI_CLOSE 0x0007
+#define GRUB_PXENV_UNDI_TRANSMIT 0x0008
+#define GRUB_PXENV_UNDI_SET_MCAST_ADDR 0x0009
+#define GRUB_PXENV_UNDI_SET_STATION_ADDR 0x000A
+#define GRUB_PXENV_UNDI_SET_PACKET_FILTER 0x000B
+#define GRUB_PXENV_UNDI_GET_INFORMATION 0x000C
+#define GRUB_PXENV_UNDI_GET_STATISTICS 0x000D
+#define GRUB_PXENV_UNDI_CLEAR_STATISTICS 0x000E
+#define GRUB_PXENV_UNDI_INITIATE_DIAGS 0x000F
+#define GRUB_PXENV_UNDI_FORCE_INTERRUPT 0x0010
+#define GRUB_PXENV_UNDI_GET_MCAST_ADDR 0x0011
+#define GRUB_PXENV_UNDI_GET_NIC_TYPE 0x0012
+#define GRUB_PXENV_UNDI_GET_IFACE_INFO 0x0013
+#define GRUB_PXENV_UNDI_ISR 0x0014
+#define GRUB_PXENV_STOP_UNDI 0x0015
+#define GRUB_PXENV_UNDI_GET_STATE 0x0015
+
+#define GRUB_PXENV_UNLOAD_STACK 0x0070
+#define GRUB_PXENV_GET_CACHED_INFO 0x0071
+#define GRUB_PXENV_RESTART_DHCP 0x0072
+#define GRUB_PXENV_RESTART_TFTP 0x0073
+#define GRUB_PXENV_MODE_SWITCH 0x0074
+#define GRUB_PXENV_START_BASE 0x0075
+#define GRUB_PXENV_STOP_BASE 0x0076
+
+#define GRUB_PXENV_EXIT_SUCCESS 0x0000
+#define GRUB_PXENV_EXIT_FAILURE 0x0001
+
+#define GRUB_PXENV_STATUS_SUCCESS 0x00
+#define GRUB_PXENV_STATUS_FAILURE 0x01
+#define GRUB_PXENV_STATUS_BAD_FUNC 0x02
+#define GRUB_PXENV_STATUS_UNSUPPORTED 0x03
+#define GRUB_PXENV_STATUS_KEEP_UNDI 0x04
+#define GRUB_PXENV_STATUS_KEEP_ALL 0x05
+#define GRUB_PXENV_STATUS_OUT_OF_RESOURCES 0x06
+#define GRUB_PXENV_STATUS_ARP_TIMEOUT 0x11
+#define GRUB_PXENV_STATUS_UDP_CLOSED 0x18
+#define GRUB_PXENV_STATUS_UDP_OPEN 0x19
+#define GRUB_PXENV_STATUS_TFTP_CLOSED 0x1A
+#define GRUB_PXENV_STATUS_TFTP_OPEN 0x1B
+#define GRUB_PXENV_STATUS_MCOPY_PROBLEM 0x20
+#define GRUB_PXENV_STATUS_BIS_INTEGRITY_FAILURE 0x21
+#define GRUB_PXENV_STATUS_BIS_VALIDATE_FAILURE 0x22
+#define GRUB_PXENV_STATUS_BIS_INIT_FAILURE 0x23
+#define GRUB_PXENV_STATUS_BIS_SHUTDOWN_FAILURE 0x24
+#define GRUB_PXENV_STATUS_BIS_GBOA_FAILURE 0x25
+#define GRUB_PXENV_STATUS_BIS_FREE_FAILURE 0x26
+#define GRUB_PXENV_STATUS_BIS_GSI_FAILURE 0x27
+#define GRUB_PXENV_STATUS_BIS_BAD_CKSUM 0x28
+#define GRUB_PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS 0x30
+#define GRUB_PXENV_STATUS_TFTP_OPEN_TIMEOUT 0x32
+
+#define GRUB_PXENV_STATUS_TFTP_UNKNOWN_OPCODE 0x33
+#define GRUB_PXENV_STATUS_TFTP_READ_TIMEOUT 0x35
+#define GRUB_PXENV_STATUS_TFTP_ERROR_OPCODE 0x36
+#define GRUB_PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION 0x38
+#define GRUB_PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION 0x39
+#define GRUB_PXENV_STATUS_TFTP_TOO_MANY_PACKAGES 0x3A
+#define GRUB_PXENV_STATUS_TFTP_FILE_NOT_FOUND 0x3B
+#define GRUB_PXENV_STATUS_TFTP_ACCESS_VIOLATION 0x3C
+#define GRUB_PXENV_STATUS_TFTP_NO_MCAST_ADDRESS 0x3D
+#define GRUB_PXENV_STATUS_TFTP_NO_FILESIZE 0x3E
+#define GRUB_PXENV_STATUS_TFTP_INVALID_PACKET_SIZE 0x3F
+#define GRUB_PXENV_STATUS_DHCP_TIMEOUT 0x51
+#define GRUB_PXENV_STATUS_DHCP_NO_IP_ADDRESS 0x52
+#define GRUB_PXENV_STATUS_DHCP_NO_BOOTFILE_NAME 0x53
+#define GRUB_PXENV_STATUS_DHCP_BAD_IP_ADDRESS 0x54
+#define GRUB_PXENV_STATUS_UNDI_INVALID_FUNCTION 0x60
+#define GRUB_PXENV_STATUS_UNDI_MEDIATEST_FAILED 0x61
+#define GRUB_PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST 0x62
+#define GRUB_PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC 0x63
+#define GRUB_PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY 0x64
+#define GRUB_PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA 0x65
+#define GRUB_PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA 0x66
+#define GRUB_PXENV_STATUS_UNDI_BAD_MAC_ADDRESS 0x67
+#define GRUB_PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM 0x68
+#define GRUB_PXENV_STATUS_UNDI_ERROR_SETTING_ISR 0x69
+#define GRUB_PXENV_STATUS_UNDI_INVALID_STATE 0x6A
+#define GRUB_PXENV_STATUS_UNDI_TRANSMIT_ERROR 0x6B
+#define GRUB_PXENV_STATUS_UNDI_INVALID_PARAMETER 0x6C
+#define GRUB_PXENV_STATUS_BSTRAP_PROMPT_MENU 0x74
+#define GRUB_PXENV_STATUS_BSTRAP_MCAST_ADDR 0x76
+#define GRUB_PXENV_STATUS_BSTRAP_MISSING_LIST 0x77
+#define GRUB_PXENV_STATUS_BSTRAP_NO_RESPONSE 0x78
+#define GRUB_PXENV_STATUS_BSTRAP_FILE_TOO_BIG 0x79
+#define GRUB_PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE 0xA0
+#define GRUB_PXENV_STATUS_BINL_NO_PXE_SERVER 0xA1
+#define GRUB_PXENV_STATUS_NOT_AVAILABLE_IN_PMODE 0xA2
+#define GRUB_PXENV_STATUS_NOT_AVAILABLE_IN_RMODE 0xA3
+#define GRUB_PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED 0xB0
+#define GRUB_PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY 0xC0
+#define GRUB_PXENV_STATUS_LOADER_NO_BC_ROMID 0xC1
+#define GRUB_PXENV_STATUS_LOADER_BAD_BC_ROMID 0xC2
+#define GRUB_PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE 0xC3
+#define GRUB_PXENV_STATUS_LOADER_NO_UNDI_ROMID 0xC4
+#define GRUB_PXENV_STATUS_LOADER_BAD_UNDI_ROMID 0xC5
+#define GRUB_PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE 0xC6
+#define GRUB_PXENV_STATUS_LOADER_NO_PXE_STRUCT 0xC8
+#define GRUB_PXENV_STATUS_LOADER_NO_PXENV_STRUCT 0xC9
+#define GRUB_PXENV_STATUS_LOADER_UNDI_START 0xCA
+#define GRUB_PXENV_STATUS_LOADER_BC_START 0xCB
+
+#define GRUB_PXENV_PACKET_TYPE_DHCP_DISCOVER 1
+#define GRUB_PXENV_PACKET_TYPE_DHCP_ACK 2
+#define GRUB_PXENV_PACKET_TYPE_CACHED_REPLY 3
+
+#define GRUB_PXE_BOOTP_REQ 1
+#define GRUB_PXE_BOOTP_REP 2
+
+#define GRUB_PXE_BOOTP_BCAST 0x8000
+
+#if 1
+#define GRUB_PXE_BOOTP_SIZE (1024 + 236) /* DHCP extended vendor field size. */
+#else
+#define GRUB_PXE_BOOTP_SIZE (312 + 236) /* DHCP standard vendor field size. */
+#endif
+
+#define GRUB_PXE_TFTP_PORT 69
+
+#define GRUB_PXE_ERR_LEN 0xFFFFFFFF
+
+#ifndef ASM_FILE
+
+#define GRUB_PXE_SIGNATURE "PXENV+"
+
+struct grub_pxenv
+{
+ grub_uint8_t signature[6]; /* 'PXENV+'. */
+ grub_uint16_t version; /* MSB = major, LSB = minor. */
+ grub_uint8_t length; /* structure length. */
+ grub_uint8_t checksum; /* checksum pad. */
+ grub_uint32_t rm_entry; /* SEG:OFF to PXE entry point. */
+ grub_uint32_t pm_offset; /* Protected mode entry. */
+ grub_uint16_t pm_selector; /* Protected mode selector. */
+ grub_uint16_t stack_seg; /* Stack segment address. */
+ grub_uint16_t stack_size; /* Stack segment size (bytes). */
+ grub_uint16_t bc_code_seg; /* BC Code segment address. */
+ grub_uint16_t bc_code_size; /* BC Code segment size (bytes). */
+ grub_uint16_t bc_data_seg; /* BC Data segment address. */
+ grub_uint16_t bc_data_size; /* BC Data segment size (bytes). */
+ grub_uint16_t undi_data_seg; /* UNDI Data segment address. */
+ grub_uint16_t undi_data_size; /* UNDI Data segment size (bytes). */
+ grub_uint16_t undi_code_seg; /* UNDI Code segment address. */
+ grub_uint16_t undi_code_size; /* UNDI Code segment size (bytes). */
+ grub_uint32_t pxe_ptr; /* SEG:OFF to !PXE struct. */
+} GRUB_PACKED;
+
+struct grub_pxe_bangpxe
+{
+ grub_uint8_t signature[4];
+#define GRUB_PXE_BANGPXE_SIGNATURE "!PXE"
+ grub_uint8_t length;
+ grub_uint8_t chksum;
+ grub_uint8_t rev;
+ grub_uint8_t reserved;
+ grub_uint32_t undiromid;
+ grub_uint32_t baseromid;
+ grub_uint32_t rm_entry;
+} GRUB_PACKED;
+
+struct grub_pxenv_get_cached_info
+{
+ grub_uint16_t status;
+ grub_uint16_t packet_type;
+ grub_uint16_t buffer_size;
+ grub_uint32_t buffer;
+ grub_uint16_t buffer_limit;
+} GRUB_PACKED;
+
+struct grub_pxenv_tftp_open
+{
+ grub_uint16_t status;
+ grub_uint32_t server_ip;
+ grub_uint32_t gateway_ip;
+ grub_uint8_t filename[128];
+ grub_uint16_t tftp_port;
+ grub_uint16_t packet_size;
+} GRUB_PACKED;
+
+struct grub_pxenv_tftp_close
+{
+ grub_uint16_t status;
+} GRUB_PACKED;
+
+struct grub_pxenv_tftp_read
+{
+ grub_uint16_t status;
+ grub_uint16_t packet_number;
+ grub_uint16_t buffer_size;
+ grub_uint32_t buffer;
+} GRUB_PACKED;
+
+struct grub_pxenv_tftp_get_fsize
+{
+ grub_uint16_t status;
+ grub_uint32_t server_ip;
+ grub_uint32_t gateway_ip;
+ grub_uint8_t filename[128];
+ grub_uint32_t file_size;
+} GRUB_PACKED;
+
+struct grub_pxenv_udp_open
+{
+ grub_uint16_t status;
+ grub_uint32_t src_ip;
+} GRUB_PACKED;
+
+struct grub_pxenv_udp_close
+{
+ grub_uint16_t status;
+} GRUB_PACKED;
+
+struct grub_pxenv_udp_write
+{
+ grub_uint16_t status;
+ grub_uint32_t ip;
+ grub_uint32_t gateway;
+ grub_uint16_t src_port;
+ grub_uint16_t dst_port;
+ grub_uint16_t buffer_size;
+ grub_uint32_t buffer;
+} GRUB_PACKED;
+
+struct grub_pxenv_udp_read
+{
+ grub_uint16_t status;
+ grub_uint32_t src_ip;
+ grub_uint32_t dst_ip;
+ grub_uint16_t src_port;
+ grub_uint16_t dst_port;
+ grub_uint16_t buffer_size;
+ grub_uint32_t buffer;
+} GRUB_PACKED;
+
+struct grub_pxenv_unload_stack
+{
+ grub_uint16_t status;
+ grub_uint8_t reserved[10];
+} GRUB_PACKED;
+
+int EXPORT_FUNC(grub_pxe_call) (int func, void * data, grub_uint32_t pxe_rm_entry) __attribute__ ((regparm(3)));
+
+extern struct grub_pxe_bangpxe *grub_pxe_pxenv;
+
+void *
+grub_pxe_get_cached (grub_uint16_t type);
+
+#endif
+
+#endif /* GRUB_CPU_PXE_H */
diff --git a/include/grub/i386/pc/time.h b/include/grub/i386/pc/time.h
new file mode 100644
index 0000000..e93320f
--- /dev/null
+++ b/include/grub/i386/pc/time.h
@@ -0,0 +1,24 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2003,2004,2005,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_MACHINE_TIME_HEADER
+#define KERNEL_MACHINE_TIME_HEADER 1
+
+#include <grub/symbol.h>
+
+#endif /* ! KERNEL_MACHINE_TIME_HEADER */
diff --git a/include/grub/i386/pc/vbe.h b/include/grub/i386/pc/vbe.h
new file mode 100644
index 0000000..f349b5c
--- /dev/null
+++ b/include/grub/i386/pc/vbe.h
@@ -0,0 +1,232 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_VBE_MACHINE_HEADER
+#define GRUB_VBE_MACHINE_HEADER 1
+
+#include <grub/video.h>
+
+/* Default video mode to be used. */
+#define GRUB_VBE_DEFAULT_VIDEO_MODE 0x101
+
+/* VBE status codes. */
+#define GRUB_VBE_STATUS_OK 0x004f
+
+#define GRUB_VBE_CAPABILITY_DACWIDTH (1 << 0)
+
+/* Bits from the GRUB_VBE "mode_attributes" field in the mode info struct. */
+#define GRUB_VBE_MODEATTR_SUPPORTED (1 << 0)
+#define GRUB_VBE_MODEATTR_RESERVED_1 (1 << 1)
+#define GRUB_VBE_MODEATTR_BIOS_TTY_OUTPUT_SUPPORT (1 << 2)
+#define GRUB_VBE_MODEATTR_COLOR (1 << 3)
+#define GRUB_VBE_MODEATTR_GRAPHICS (1 << 4)
+#define GRUB_VBE_MODEATTR_VGA_COMPATIBLE (1 << 5)
+#define GRUB_VBE_MODEATTR_VGA_WINDOWED_AVAIL (1 << 6)
+#define GRUB_VBE_MODEATTR_LFB_AVAIL (1 << 7)
+#define GRUB_VBE_MODEATTR_DOUBLE_SCAN_AVAIL (1 << 8)
+#define GRUB_VBE_MODEATTR_INTERLACED_AVAIL (1 << 9)
+#define GRUB_VBE_MODEATTR_TRIPLE_BUF_AVAIL (1 << 10)
+#define GRUB_VBE_MODEATTR_STEREO_AVAIL (1 << 11)
+#define GRUB_VBE_MODEATTR_DUAL_DISPLAY_START (1 << 12)
+
+/* Values for the GRUB_VBE memory_model field in the mode info struct. */
+#define GRUB_VBE_MEMORY_MODEL_TEXT 0x00
+#define GRUB_VBE_MEMORY_MODEL_CGA 0x01
+#define GRUB_VBE_MEMORY_MODEL_HERCULES 0x02
+#define GRUB_VBE_MEMORY_MODEL_PLANAR 0x03
+#define GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL 0x04
+#define GRUB_VBE_MEMORY_MODEL_NONCHAIN4_256 0x05
+#define GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR 0x06
+#define GRUB_VBE_MEMORY_MODEL_YUV 0x07
+
+/* Note:
+
+ Please refer to VESA BIOS Extension 3.0 Specification for more descriptive
+ meanings of following structures and how they should be used.
+
+ I have tried to maintain field name compatibility against specification
+ while following naming conventions used in GRUB. */
+
+typedef grub_uint32_t grub_vbe_farptr_t;
+typedef grub_uint32_t grub_vbe_physptr_t;
+typedef grub_uint32_t grub_vbe_status_t;
+
+struct grub_vbe_info_block
+{
+ grub_uint8_t signature[4];
+ grub_uint16_t version;
+
+ grub_vbe_farptr_t oem_string_ptr;
+ grub_uint32_t capabilities;
+ grub_vbe_farptr_t video_mode_ptr;
+ grub_uint16_t total_memory;
+
+ grub_uint16_t oem_software_rev;
+ grub_vbe_farptr_t oem_vendor_name_ptr;
+ grub_vbe_farptr_t oem_product_name_ptr;
+ grub_vbe_farptr_t oem_product_rev_ptr;
+
+ grub_uint8_t reserved[222];
+
+ grub_uint8_t oem_data[256];
+} GRUB_PACKED;
+
+struct grub_vbe_mode_info_block
+{
+ /* Mandatory information for all VBE revisions. */
+ grub_uint16_t mode_attributes;
+ grub_uint8_t win_a_attributes;
+ grub_uint8_t win_b_attributes;
+ grub_uint16_t win_granularity;
+ grub_uint16_t win_size;
+ grub_uint16_t win_a_segment;
+ grub_uint16_t win_b_segment;
+ grub_vbe_farptr_t win_func_ptr;
+ grub_uint16_t bytes_per_scan_line;
+
+ /* Mandatory information for VBE 1.2 and above. */
+ grub_uint16_t x_resolution;
+ grub_uint16_t y_resolution;
+ grub_uint8_t x_char_size;
+ grub_uint8_t y_char_size;
+ grub_uint8_t number_of_planes;
+ grub_uint8_t bits_per_pixel;
+ grub_uint8_t number_of_banks;
+ grub_uint8_t memory_model;
+ grub_uint8_t bank_size;
+ grub_uint8_t number_of_image_pages;
+ grub_uint8_t reserved;
+
+ /* Direct Color fields (required for direct/6 and YUV/7 memory models). */
+ grub_uint8_t red_mask_size;
+ grub_uint8_t red_field_position;
+ grub_uint8_t green_mask_size;
+ grub_uint8_t green_field_position;
+ grub_uint8_t blue_mask_size;
+ grub_uint8_t blue_field_position;
+ grub_uint8_t rsvd_mask_size;
+ grub_uint8_t rsvd_field_position;
+ grub_uint8_t direct_color_mode_info;
+
+ /* Mandatory information for VBE 2.0 and above. */
+ grub_vbe_physptr_t phys_base_addr;
+ grub_uint32_t reserved2;
+ grub_uint16_t reserved3;
+
+ /* Mandatory information for VBE 3.0 and above. */
+ grub_uint16_t lin_bytes_per_scan_line;
+ grub_uint8_t bnk_number_of_image_pages;
+ grub_uint8_t lin_number_of_image_pages;
+ grub_uint8_t lin_red_mask_size;
+ grub_uint8_t lin_red_field_position;
+ grub_uint8_t lin_green_mask_size;
+ grub_uint8_t lin_green_field_position;
+ grub_uint8_t lin_blue_mask_size;
+ grub_uint8_t lin_blue_field_position;
+ grub_uint8_t lin_rsvd_mask_size;
+ grub_uint8_t lin_rsvd_field_position;
+ grub_uint32_t max_pixel_clock;
+
+ /* Reserved field to make structure to be 256 bytes long, VESA BIOS
+ Extension 3.0 Specification says to reserve 189 bytes here but
+ that doesn't make structure to be 256 bytes. So additional one is
+ added here. */
+ grub_uint8_t reserved4[189 + 1];
+} GRUB_PACKED;
+
+struct grub_vbe_crtc_info_block
+{
+ grub_uint16_t horizontal_total;
+ grub_uint16_t horizontal_sync_start;
+ grub_uint16_t horizontal_sync_end;
+ grub_uint16_t vertical_total;
+ grub_uint16_t vertical_sync_start;
+ grub_uint16_t vertical_sync_end;
+ grub_uint8_t flags;
+ grub_uint32_t pixel_clock;
+ grub_uint16_t refresh_rate;
+ grub_uint8_t reserved[40];
+} GRUB_PACKED;
+
+struct grub_vbe_palette_data
+{
+ grub_uint8_t blue;
+ grub_uint8_t green;
+ grub_uint8_t red;
+ grub_uint8_t alignment;
+} GRUB_PACKED;
+
+struct grub_vbe_flat_panel_info
+{
+ grub_uint16_t horizontal_size;
+ grub_uint16_t vertical_size;
+ grub_uint16_t panel_type;
+ grub_uint8_t red_bpp;
+ grub_uint8_t green_bpp;
+ grub_uint8_t blue_bpp;
+ grub_uint8_t reserved_bpp;
+ grub_uint32_t reserved_offscreen_mem_size;
+ grub_vbe_farptr_t reserved_offscreen_mem_ptr;
+
+ grub_uint8_t reserved[14];
+} GRUB_PACKED;
+
+/* Prototypes for helper functions. */
+/* Call VESA BIOS 0x4f00 to get VBE Controller Information, return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_controller_info (struct grub_vbe_info_block *controller_info);
+/* Call VESA BIOS 0x4f01 to get VBE Mode Information, return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_mode_info (grub_uint32_t mode,
+ struct grub_vbe_mode_info_block *mode_info);
+/* Call VESA BIOS 0x4f03 to return current VBE Mode, return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_mode (grub_uint32_t *mode);
+/* Call VESA BIOS 0x4f05 to set memory window, return status. */
+grub_vbe_status_t
+grub_vbe_bios_set_memory_window (grub_uint32_t window, grub_uint32_t position);
+/* Call VESA BIOS 0x4f05 to return memory window, return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_memory_window (grub_uint32_t window,
+ grub_uint32_t *position);
+/* Call VESA BIOS 0x4f06 to set scanline length (in bytes), return status. */
+grub_vbe_status_t
+grub_vbe_bios_set_scanline_length (grub_uint32_t length);
+/* Call VESA BIOS 0x4f06 to return scanline length (in bytes), return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_scanline_length (grub_uint32_t *length);
+/* Call VESA BIOS 0x4f07 to get display start, return status. */
+grub_vbe_status_t
+grub_vbe_bios_get_display_start (grub_uint32_t *x,
+ grub_uint32_t *y);
+
+grub_vbe_status_t grub_vbe_bios_getset_dac_palette_width (int set, int *width);
+
+#define grub_vbe_bios_get_dac_palette_width(width) grub_vbe_bios_getset_dac_palette_width(0, (width))
+#define grub_vbe_bios_set_dac_palette_width(width) grub_vbe_bios_getset_dac_palette_width(1, (width))
+
+grub_err_t grub_vbe_probe (struct grub_vbe_info_block *info_block);
+grub_err_t grub_vbe_get_video_mode (grub_uint32_t *mode);
+grub_err_t grub_vbe_get_video_mode_info (grub_uint32_t mode,
+ struct grub_vbe_mode_info_block *mode_info);
+grub_vbe_status_t
+grub_vbe_bios_get_pm_interface (grub_uint16_t *seg, grub_uint16_t *offset,
+ grub_uint16_t *length);
+
+
+#endif /* ! GRUB_VBE_MACHINE_HEADER */
diff --git a/include/grub/i386/pc/vesa_modes_table.h b/include/grub/i386/pc/vesa_modes_table.h
new file mode 100644
index 0000000..376ca37
--- /dev/null
+++ b/include/grub/i386/pc/vesa_modes_table.h
@@ -0,0 +1,19 @@
+#ifndef GRUB_VESA_MODE_TABLE_HEADER
+#define GRUB_VESA_MODE_TABLE_HEADER 1
+
+#include <grub/types.h>
+
+#define GRUB_VESA_MODE_TABLE_START 0x300
+#define GRUB_VESA_MODE_TABLE_END 0x373
+
+struct grub_vesa_mode_table_entry {
+ grub_uint16_t width;
+ grub_uint16_t height;
+ grub_uint8_t depth;
+};
+
+extern struct grub_vesa_mode_table_entry
+grub_vesa_mode_table[GRUB_VESA_MODE_TABLE_END
+ - GRUB_VESA_MODE_TABLE_START + 1];
+
+#endif
diff --git a/include/grub/i386/pci.h b/include/grub/i386/pci.h
new file mode 100644
index 0000000..dffeb56
--- /dev/null
+++ b/include/grub/i386/pci.h
@@ -0,0 +1,105 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_PCI_H
+#define GRUB_CPU_PCI_H 1
+
+#include <grub/types.h>
+#include <grub/i386/io.h>
+
+#define GRUB_MACHINE_PCI_IO_BASE 0
+#define GRUB_PCI_ADDR_REG 0xcf8
+#define GRUB_PCI_DATA_REG 0xcfc
+#define GRUB_PCI_NUM_BUS 256
+#define GRUB_PCI_NUM_DEVICES 32
+
+static inline grub_uint32_t
+grub_pci_read (grub_pci_address_t addr)
+{
+ grub_outl (addr, GRUB_PCI_ADDR_REG);
+ return grub_inl (GRUB_PCI_DATA_REG);
+}
+
+static inline grub_uint16_t
+grub_pci_read_word (grub_pci_address_t addr)
+{
+ grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+ return grub_inw (GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline grub_uint8_t
+grub_pci_read_byte (grub_pci_address_t addr)
+{
+ grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+ return grub_inb (GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline void
+grub_pci_write (grub_pci_address_t addr, grub_uint32_t data)
+{
+ grub_outl (addr, GRUB_PCI_ADDR_REG);
+ grub_outl (data, GRUB_PCI_DATA_REG);
+}
+
+static inline void
+grub_pci_write_word (grub_pci_address_t addr, grub_uint16_t data)
+{
+ grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+ grub_outw (data, GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+static inline void
+grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data)
+{
+ grub_outl (addr & ~3, GRUB_PCI_ADDR_REG);
+ grub_outb (data, GRUB_PCI_DATA_REG + (addr & 3));
+}
+
+#ifndef GRUB_MACHINE_IEEE1275
+
+static inline volatile void *
+grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
+ grub_addr_t base,
+ grub_size_t size __attribute__ ((unused)))
+{
+ return (volatile void *) base;
+}
+
+static inline void
+grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
+ volatile void *mem __attribute__ ((unused)),
+ grub_size_t size __attribute__ ((unused)))
+{
+}
+
+#else
+
+volatile void *
+grub_pci_device_map_range (grub_pci_device_t dev,
+ grub_addr_t base,
+ grub_size_t size);
+
+void
+grub_pci_device_unmap_range (grub_pci_device_t dev,
+ volatile void *mem,
+ grub_size_t size);
+
+#endif
+
+
+#endif /* GRUB_CPU_PCI_H */
diff --git a/include/grub/i386/pit.h b/include/grub/i386/pit.h
new file mode 100644
index 0000000..4bd49d4
--- /dev/null
+++ b/include/grub/i386/pit.h
@@ -0,0 +1,103 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_CPU_PIT_HEADER
+#define KERNEL_CPU_PIT_HEADER 1
+
+#include <grub/types.h>
+#include <grub/err.h>
+
+enum
+ {
+ /* The PIT channel value ports. You can write to and read from them.
+ Do not mess with timer 0 or 1. */
+ GRUB_PIT_COUNTER_0 = 0x40,
+ GRUB_PIT_COUNTER_1 = 0x41,
+ GRUB_PIT_COUNTER_2 = 0x42,
+ /* The PIT control port. You can only write to it. Do not mess with
+ timer 0 or 1. */
+ GRUB_PIT_CTRL = 0x43,
+ /* The speaker port. */
+ GRUB_PIT_SPEAKER_PORT = 0x61,
+ };
+
+
+/* The speaker port. */
+enum
+ {
+ /* If 0, follow state of SPEAKER_DATA bit, otherwise enable output
+ from timer 2. */
+ GRUB_PIT_SPK_TMR2 = 0x01,
+ /* If SPEAKER_TMR2 is not set, this provides direct input into the
+ speaker. Otherwise, this enables or disables the output from the
+ timer. */
+ GRUB_PIT_SPK_DATA = 0x02,
+
+ GRUB_PIT_SPK_TMR2_LATCH = 0x20
+ };
+
+/* The PIT control port. You can only write to it. Do not mess with
+ timer 0 or 1. */
+enum
+ {
+ GRUB_PIT_CTRL_SELECT_MASK = 0xc0,
+ GRUB_PIT_CTRL_SELECT_0 = 0x00,
+ GRUB_PIT_CTRL_SELECT_1 = 0x40,
+ GRUB_PIT_CTRL_SELECT_2 = 0x80,
+
+ /* Read and load control. */
+ GRUB_PIT_CTRL_READLOAD_MASK= 0x30,
+ GRUB_PIT_CTRL_COUNTER_LATCH = 0x00, /* Hold timer value until read. */
+ GRUB_PIT_CTRL_READLOAD_LSB = 0x10, /* Read/load the LSB. */
+ GRUB_PIT_CTRL_READLOAD_MSB = 0x20, /* Read/load the MSB. */
+ GRUB_PIT_CTRL_READLOAD_WORD = 0x30, /* Read/load the LSB then the MSB. */
+
+ /* Mode control. */
+ GRUB_PIT_CTRL_MODE_MASK = 0x0e,
+ /* Interrupt on terminal count. Setting the mode sets output to low.
+ When counter is set and terminated, output is set to high. */
+ GRUB_PIT_CTRL_INTR_ON_TERM = 0x00,
+ /* Programmable one-shot. When loading counter, output is set to
+ high. When counter terminated, output is set to low. Can be
+ triggered again from that point on by setting the gate pin to
+ high. */
+ GRUB_PIT_CTRL_PROGR_ONE_SHOT = 0x02,
+
+ /* Rate generator. Output is low for one period of the counter, and
+ high for the other. */
+ GRUB_PIT_CTRL_RATE_GEN = 0x04,
+
+ /* Square wave generator. Output is low for one half of the period,
+ and high for the other half. */
+ GRUB_PIT_CTRL_SQUAREWAVE_GEN = 0x06,
+ /* Software triggered strobe. Setting the mode sets output to high.
+ When counter is set and terminated, output is set to low. */
+ GRUB_PIT_CTRL_SOFTSTROBE = 0x08,
+
+ /* Hardware triggered strobe. Like software triggered strobe, but
+ only starts the counter when the gate pin is set to high. */
+ GRUB_PIT_CTRL_HARDSTROBE = 0x0a,
+
+
+ /* Count mode. */
+ GRUB_PIT_CTRL_COUNT_MASK = 0x01,
+ GRUB_PIT_CTRL_COUNT_BINARY = 0x00, /* 16-bit binary counter. */
+ GRUB_PIT_CTRL_COUNT_BCD = 0x01 /* 4-decade BCD counter. */
+ };
+
+#endif /* ! KERNEL_CPU_PIT_HEADER */
diff --git a/include/grub/i386/pmtimer.h b/include/grub/i386/pmtimer.h
new file mode 100644
index 0000000..ac09180
--- /dev/null
+++ b/include/grub/i386/pmtimer.h
@@ -0,0 +1,37 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_CPU_PMTIMER_HEADER
+#define KERNEL_CPU_PMTIMER_HEADER 1
+
+#include <grub/i386/tsc.h>
+#include <grub/i386/io.h>
+
+/*
+ Preconditions:
+ * Caller has ensured that both pmtimer and tsc are supported
+ * 1 <= num_pm_ticks <= 3580
+ Return:
+ * Number of TSC ticks elapsed
+ * 0 on failure.
+*/
+grub_uint64_t
+EXPORT_FUNC(grub_pmtimer_wait_count_tsc) (grub_port_t pmtimer,
+ grub_uint16_t num_pm_ticks);
+
+#endif
diff --git a/include/grub/i386/qemu/boot.h b/include/grub/i386/qemu/boot.h
new file mode 100644
index 0000000..5f53eab
--- /dev/null
+++ b/include/grub/i386/qemu/boot.h
@@ -0,0 +1,25 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_BOOT_MACHINE_HEADER
+#define GRUB_BOOT_MACHINE_HEADER 1
+
+/* The size of boot.img. */
+#define GRUB_BOOT_MACHINE_SIZE (0x100000 - GRUB_BOOT_MACHINE_LINK_ADDR)
+
+#endif
diff --git a/include/grub/i386/qemu/console.h b/include/grub/i386/qemu/console.h
new file mode 100644
index 0000000..774399a
--- /dev/null
+++ b/include/grub/i386/qemu/console.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/console.h>
diff --git a/include/grub/i386/qemu/kernel.h b/include/grub/i386/qemu/kernel.h
new file mode 100644
index 0000000..f34206b
--- /dev/null
+++ b/include/grub/i386/qemu/kernel.h
@@ -0,0 +1,35 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2005,2006,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_KERNEL_MACHINE_HEADER
+#define GRUB_KERNEL_MACHINE_HEADER 1
+
+#include <grub/offsets.h>
+
+#ifndef ASM_FILE
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+extern grub_addr_t grub_core_entry_addr;
+
+void grub_qemu_init_cirrus (void);
+
+#endif /* ! ASM_FILE */
+
+#endif /* ! GRUB_KERNEL_MACHINE_HEADER */
diff --git a/include/grub/i386/qemu/memory.h b/include/grub/i386/qemu/memory.h
new file mode 100644
index 0000000..8dd6f7c
--- /dev/null
+++ b/include/grub/i386/qemu/memory.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/memory.h>
diff --git a/include/grub/i386/qemu/serial.h b/include/grub/i386/qemu/serial.h
new file mode 100644
index 0000000..2d85634
--- /dev/null
+++ b/include/grub/i386/qemu/serial.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/serial.h>
diff --git a/include/grub/i386/qemu/time.h b/include/grub/i386/qemu/time.h
new file mode 100644
index 0000000..7177c74
--- /dev/null
+++ b/include/grub/i386/qemu/time.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/time.h>
diff --git a/include/grub/i386/rdmsr.h b/include/grub/i386/rdmsr.h
new file mode 100644
index 0000000..c0a0c71
--- /dev/null
+++ b/include/grub/i386/rdmsr.h
@@ -0,0 +1,37 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2019 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_RDMSR_H
+#define GRUB_RDMSR_H 1
+
+/*
+ * TODO: Add a general protection exception handler.
+ * Accessing a reserved or unimplemented MSR address results in a GP#.
+ */
+
+static inline grub_uint64_t
+grub_msr_read (grub_uint32_t msr_id)
+{
+ grub_uint32_t low, high;
+
+ asm volatile ("rdmsr" : "=a" (low), "=d" (high) : "c" (msr_id));
+
+ return ((grub_uint64_t)high << 32) | low;
+}
+
+#endif /* GRUB_RDMSR_H */
diff --git a/include/grub/i386/reboot.h b/include/grub/i386/reboot.h
new file mode 100644
index 0000000..c2716f3
--- /dev/null
+++ b/include/grub/i386/reboot.h
@@ -0,0 +1,28 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2011 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_REBOOT_H
+#define GRUB_REBOOT_H 1
+
+#ifndef ASM_FILE
+
+extern grub_uint8_t grub_reboot_end[], grub_reboot_start[];
+
+#endif
+
+#endif
diff --git a/include/grub/i386/relocator.h b/include/grub/i386/relocator.h
new file mode 100644
index 0000000..2a56c3b
--- /dev/null
+++ b/include/grub/i386/relocator.h
@@ -0,0 +1,100 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_RELOCATOR_CPU_HEADER
+#define GRUB_RELOCATOR_CPU_HEADER 1
+
+#include <grub/types.h>
+#include <grub/err.h>
+#include <grub/relocator.h>
+
+struct grub_relocator32_state
+{
+ grub_uint32_t esp;
+ grub_uint32_t ebp;
+ grub_uint32_t eax;
+ grub_uint32_t ebx;
+ grub_uint32_t ecx;
+ grub_uint32_t edx;
+ grub_uint32_t eip;
+ grub_uint32_t esi;
+ grub_uint32_t edi;
+};
+
+struct grub_relocator16_state
+{
+ grub_uint16_t cs;
+ grub_uint16_t ds;
+ grub_uint16_t es;
+ grub_uint16_t fs;
+ grub_uint16_t gs;
+ grub_uint16_t ss;
+ grub_uint16_t sp;
+ grub_uint16_t ip;
+ grub_uint32_t ebx;
+ grub_uint32_t edx;
+ grub_uint32_t esi;
+ grub_uint32_t ebp;
+ int a20;
+};
+
+struct grub_relocator64_state
+{
+ grub_uint64_t rsp;
+ grub_uint64_t rax;
+ grub_uint64_t rbx;
+ grub_uint64_t rcx;
+ grub_uint64_t rdx;
+ grub_uint64_t rip;
+ grub_uint64_t rsi;
+ grub_addr_t cr3;
+};
+
+#ifdef GRUB_MACHINE_EFI
+#ifdef __x86_64__
+struct grub_relocator64_efi_state
+{
+ grub_uint64_t rax;
+ grub_uint64_t rbx;
+ grub_uint64_t rcx;
+ grub_uint64_t rdx;
+ grub_uint64_t rip;
+ grub_uint64_t rsi;
+};
+#endif
+#endif
+
+grub_err_t grub_relocator16_boot (struct grub_relocator *rel,
+ struct grub_relocator16_state state);
+
+grub_err_t grub_relocator32_boot (struct grub_relocator *rel,
+ struct grub_relocator32_state state,
+ int avoid_efi_bootservices);
+
+grub_err_t grub_relocator64_boot (struct grub_relocator *rel,
+ struct grub_relocator64_state state,
+ grub_addr_t min_addr, grub_addr_t max_addr);
+
+#ifdef GRUB_MACHINE_EFI
+#ifdef __x86_64__
+grub_err_t grub_relocator64_efi_boot (struct grub_relocator *rel,
+ struct grub_relocator64_efi_state state);
+#endif
+#endif
+
+#endif /* ! GRUB_RELOCATOR_CPU_HEADER */
diff --git a/include/grub/i386/relocator_private.h b/include/grub/i386/relocator_private.h
new file mode 100644
index 0000000..b7c96a6
--- /dev/null
+++ b/include/grub/i386/relocator_private.h
@@ -0,0 +1 @@
+#define GRUB_RELOCATOR16_STACK_SIZE 4096
diff --git a/include/grub/i386/setjmp.h b/include/grub/i386/setjmp.h
new file mode 100644
index 0000000..bf959a6
--- /dev/null
+++ b/include/grub/i386/setjmp.h
@@ -0,0 +1,29 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2003,2006,2007,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_SETJMP_CPU_HEADER
+#define GRUB_SETJMP_CPU_HEADER 1
+
+typedef unsigned long grub_jmp_buf[6];
+
+int grub_setjmp (grub_jmp_buf env) RETURNS_TWICE __attribute__ ((cdecl,
+ regparm (3)));
+void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn, cdecl,
+ regparm (3)));
+
+#endif /* ! GRUB_SETJMP_CPU_HEADER */
diff --git a/include/grub/i386/time.h b/include/grub/i386/time.h
new file mode 100644
index 0000000..4da5ae9
--- /dev/null
+++ b/include/grub/i386/time.h
@@ -0,0 +1,29 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_CPU_TIME_HEADER
+#define KERNEL_CPU_TIME_HEADER 1
+
+static __inline void
+grub_cpu_idle (void)
+{
+ /* FIXME: this can't work until we handle interrupts. */
+/* asm volatile ("hlt"); */
+}
+
+#endif /* ! KERNEL_CPU_TIME_HEADER */
diff --git a/include/grub/i386/tsc.h b/include/grub/i386/tsc.h
new file mode 100644
index 0000000..947e62f
--- /dev/null
+++ b/include/grub/i386/tsc.h
@@ -0,0 +1,70 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_CPU_TSC_HEADER
+#define KERNEL_CPU_TSC_HEADER 1
+
+#include <grub/types.h>
+#include <grub/i386/cpuid.h>
+
+void grub_tsc_init (void);
+/* In ms per 2^32 ticks. */
+extern grub_uint32_t EXPORT_VAR(grub_tsc_rate);
+int
+grub_tsc_calibrate_from_xen (void);
+int
+grub_tsc_calibrate_from_efi (void);
+int
+grub_tsc_calibrate_from_pmtimer (void);
+int
+grub_tsc_calibrate_from_pit (void);
+
+/* Read the TSC value, which increments with each CPU clock cycle. */
+static __inline grub_uint64_t
+grub_get_tsc (void)
+{
+ grub_uint32_t lo, hi;
+ grub_uint32_t a,b,c,d;
+
+ /* The CPUID instruction is a 'serializing' instruction, and
+ avoids out-of-order execution of the RDTSC instruction. */
+ grub_cpuid (0,a,b,c,d);
+ /* Read TSC value. We cannot use "=A", since this would use
+ %rax on x86_64. */
+ asm volatile ("rdtsc":"=a" (lo), "=d" (hi));
+
+ return (((grub_uint64_t) hi) << 32) | lo;
+}
+
+static __inline int
+grub_cpu_is_tsc_supported (void)
+{
+#if !defined(GRUB_MACHINE_XEN) && !defined(GRUB_MACHINE_XEN_PVH)
+ grub_uint32_t a,b,c,d;
+ if (! grub_cpu_is_cpuid_supported ())
+ return 0;
+
+ grub_cpuid(1,a,b,c,d);
+
+ return (d & (1 << 4)) != 0;
+#else
+ return 1;
+#endif
+}
+
+#endif /* ! KERNEL_CPU_TSC_HEADER */
diff --git a/include/grub/i386/types.h b/include/grub/i386/types.h
new file mode 100644
index 0000000..c20063f
--- /dev/null
+++ b/include/grub/i386/types.h
@@ -0,0 +1,33 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_TYPES_CPU_HEADER
+#define GRUB_TYPES_CPU_HEADER 1
+
+/* The size of void *. */
+#define GRUB_TARGET_SIZEOF_VOID_P 4
+
+/* The size of long. */
+#define GRUB_TARGET_SIZEOF_LONG 4
+
+/* i386 is little-endian. */
+#undef GRUB_TARGET_WORDS_BIGENDIAN
+
+#define GRUB_HAVE_UNALIGNED_ACCESS 1
+
+#endif /* ! GRUB_TYPES_CPU_HEADER */
diff --git a/include/grub/i386/wrmsr.h b/include/grub/i386/wrmsr.h
new file mode 100644
index 0000000..dea60ae
--- /dev/null
+++ b/include/grub/i386/wrmsr.h
@@ -0,0 +1,35 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2019 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_WRMSR_H
+#define GRUB_WRMSR_H 1
+
+/*
+ * TODO: Add a general protection exception handler.
+ * Accessing a reserved or unimplemented MSR address results in a GP#.
+ */
+
+static inline void
+grub_msr_write(grub_uint32_t msr_id, grub_uint64_t msr_value)
+{
+ grub_uint32_t low = msr_value, high = msr_value >> 32;
+
+ asm volatile ("wrmsr" : : "c" (msr_id), "a" (low), "d" (high));
+}
+
+#endif /* GRUB_WRMSR_H */
diff --git a/include/grub/i386/xen/hypercall.h b/include/grub/i386/xen/hypercall.h
new file mode 100644
index 0000000..4e4c12a
--- /dev/null
+++ b/include/grub/i386/xen/hypercall.h
@@ -0,0 +1,88 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_XEN_CPU_HYPERCALL_HEADER
+#define GRUB_XEN_CPU_HYPERCALL_HEADER 1
+
+#include <grub/types.h>
+
+int
+EXPORT_FUNC (grub_xen_hypercall) (grub_uint32_t callno, grub_uint32_t a0,
+ grub_uint32_t a1, grub_uint32_t a2,
+ grub_uint32_t a3, grub_uint32_t a4,
+ grub_uint32_t a5)
+#ifdef GRUB_MACHINE_XEN
+ __attribute__ ((regparm (3), cdecl))
+#endif
+ ;
+
+static inline int
+grub_xen_sched_op (int cmd, void *arg)
+{
+ return grub_xen_hypercall (__HYPERVISOR_sched_op, cmd, (grub_uint32_t) arg,
+ 0, 0, 0, 0);
+}
+
+static inline int
+grub_xen_mmu_update (const struct mmu_update *reqs,
+ unsigned count, unsigned *done_out, unsigned foreigndom)
+{
+ return grub_xen_hypercall (__HYPERVISOR_mmu_update, (grub_uint32_t) reqs,
+ (grub_uint32_t) count, (grub_uint32_t) done_out,
+ (grub_uint32_t) foreigndom, 0, 0);
+}
+
+static inline int
+grub_xen_mmuext_op (mmuext_op_t * ops,
+ unsigned int count,
+ unsigned int *pdone, unsigned int foreigndom)
+{
+ return grub_xen_hypercall (__HYPERVISOR_mmuext_op, (grub_uint32_t) ops,
+ count, (grub_uint32_t) pdone, foreigndom, 0, 0);
+}
+
+static inline int
+grub_xen_event_channel_op (int op, void *arg)
+{
+ return grub_xen_hypercall (__HYPERVISOR_event_channel_op, op,
+ (grub_uint32_t) arg, 0, 0, 0, 0);
+}
+
+
+static inline int
+grub_xen_update_va_mapping (void *addr, uint64_t pte, uint32_t flags)
+{
+ return grub_xen_hypercall (__HYPERVISOR_update_va_mapping,
+ (grub_uint32_t) addr, pte, pte >> 32, flags, 0,
+ 0);
+}
+
+static inline int
+grub_xen_grant_table_op (int a, void *b, int c)
+{
+ return grub_xen_hypercall (__HYPERVISOR_grant_table_op, a,
+ (grub_uint32_t) b, c, 0, 0, 0);
+}
+
+static inline int
+grub_xen_vm_assist (int cmd, int type)
+{
+ return grub_xen_hypercall (__HYPERVISOR_vm_assist, cmd, type, 0, 0, 0, 0);
+}
+
+#endif
diff --git a/include/grub/i386/xen/kernel.h b/include/grub/i386/xen/kernel.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/grub/i386/xen/kernel.h
diff --git a/include/grub/i386/xen/memory.h b/include/grub/i386/xen/memory.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/include/grub/i386/xen/memory.h
diff --git a/include/grub/i386/xen_pvh/boot.h b/include/grub/i386/xen_pvh/boot.h
new file mode 100644
index 0000000..6cd23aa
--- /dev/null
+++ b/include/grub/i386/xen_pvh/boot.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/boot.h>
diff --git a/include/grub/i386/xen_pvh/console.h b/include/grub/i386/xen_pvh/console.h
new file mode 100644
index 0000000..305a46d
--- /dev/null
+++ b/include/grub/i386/xen_pvh/console.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/console.h>
diff --git a/include/grub/i386/xen_pvh/int.h b/include/grub/i386/xen_pvh/int.h
new file mode 100644
index 0000000..0f1f9ee
--- /dev/null
+++ b/include/grub/i386/xen_pvh/int.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/int_types.h>
diff --git a/include/grub/i386/xen_pvh/kernel.h b/include/grub/i386/xen_pvh/kernel.h
new file mode 100644
index 0000000..2b7b8a1
--- /dev/null
+++ b/include/grub/i386/xen_pvh/kernel.h
@@ -0,0 +1,30 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2018 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_KERNEL_MACHINE_HEADER
+#define GRUB_KERNEL_MACHINE_HEADER 1
+
+#ifndef ASM_FILE
+
+#define GRUB_KERNEL_USE_RSDP_ADDR 1
+
+extern grub_uint64_t EXPORT_VAR(grub_rsdp_addr);
+
+#endif /* ! ASM_FILE */
+
+#endif /* GRUB_KERNEL_MACHINE_HEADER */
diff --git a/include/grub/i386/xen_pvh/memory.h b/include/grub/i386/xen_pvh/memory.h
new file mode 100644
index 0000000..8dd6f7c
--- /dev/null
+++ b/include/grub/i386/xen_pvh/memory.h
@@ -0,0 +1 @@
+#include <grub/i386/coreboot/memory.h>
diff --git a/include/grub/i386/xen_pvh/time.h b/include/grub/i386/xen_pvh/time.h
new file mode 100644
index 0000000..2298ee8
--- /dev/null
+++ b/include/grub/i386/xen_pvh/time.h
@@ -0,0 +1 @@
+#include <grub/i386/pc/time.h>
diff --git a/include/grub/i386/xnu.h b/include/grub/i386/xnu.h
new file mode 100644
index 0000000..062a7dd
--- /dev/null
+++ b/include/grub/i386/xnu.h
@@ -0,0 +1,149 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_CPU_XNU_H
+#define GRUB_CPU_XNU_H 1
+
+#include <grub/err.h>
+#include <grub/efi/api.h>
+#include <grub/cpu/relocator.h>
+
+#define XNU_RELOCATOR(x) (grub_relocator32_ ## x)
+
+#define GRUB_XNU_PAGESIZE 4096
+typedef grub_uint32_t grub_xnu_ptr_t;
+
+struct grub_xnu_boot_params_common
+{
+ /* Command line passed to xnu. */
+ grub_uint8_t cmdline[1024];
+
+ /* Later are the same as EFI's get_memory_map (). */
+ grub_xnu_ptr_t efi_mmap;
+ grub_uint32_t efi_mmap_size;
+ grub_uint32_t efi_mem_desc_size;
+ grub_uint32_t efi_mem_desc_version;
+
+ /* Later are video parameters. */
+ grub_xnu_ptr_t lfb_base;
+#define GRUB_XNU_VIDEO_SPLASH 1
+#define GRUB_XNU_VIDEO_TEXT_IN_VIDEO 2
+ grub_uint32_t lfb_mode;
+ grub_uint32_t lfb_line_len;
+ grub_uint32_t lfb_width;
+ grub_uint32_t lfb_height;
+ grub_uint32_t lfb_depth;
+
+ /* Pointer to device tree and its len. */
+ grub_xnu_ptr_t devtree;
+ grub_uint32_t devtreelen;
+
+ /* First used address by kernel or boot structures. */
+ grub_xnu_ptr_t heap_start;
+ /* Last used address by kernel or boot structures minus previous value. */
+ grub_uint32_t heap_size;
+ /* First memory page containing runtime code or data. */
+ grub_uint32_t efi_runtime_first_page;
+ /* First memory page containing runtime code or data minus previous value. */
+ grub_uint32_t efi_runtime_npages;
+} GRUB_PACKED;
+
+struct grub_xnu_boot_params_v1
+{
+ grub_uint16_t verminor;
+ grub_uint16_t vermajor;
+ struct grub_xnu_boot_params_common common;
+
+ grub_uint32_t efi_system_table;
+ /* Size of grub_efi_uintn_t in bits. */
+ grub_uint8_t efi_uintnbits;
+} GRUB_PACKED;
+#define GRUB_XNU_BOOTARGSV1_VERMINOR 5
+#define GRUB_XNU_BOOTARGSV1_VERMAJOR 1
+
+struct grub_xnu_boot_params_v2
+{
+ grub_uint16_t verminor;
+ grub_uint16_t vermajor;
+
+ /* Size of grub_efi_uintn_t in bits. */
+ grub_uint8_t efi_uintnbits;
+ grub_uint8_t unused[3];
+
+ struct grub_xnu_boot_params_common common;
+
+ grub_uint64_t efi_runtime_first_page_virtual;
+ grub_uint32_t efi_system_table;
+ grub_uint32_t unused2[9];
+ grub_uint64_t ram_size;
+ grub_uint64_t fsbfreq;
+ grub_uint32_t unused3[734];
+} GRUB_PACKED;
+#define GRUB_XNU_BOOTARGSV2_VERMINOR 0
+#define GRUB_XNU_BOOTARGSV2_VERMAJOR 2
+
+union grub_xnu_boot_params_any
+{
+ struct grub_xnu_boot_params_v1 v1;
+ struct grub_xnu_boot_params_v2 v2;
+};
+
+struct grub_xnu_devprop_header
+{
+ grub_uint32_t length;
+ /* Always set to 1. Version? */
+ grub_uint32_t alwaysone;
+ grub_uint32_t num_devices;
+};
+
+struct grub_xnu_devprop_device_header
+{
+ grub_uint32_t length;
+ grub_uint32_t num_values;
+};
+
+void grub_cpu_xnu_unload (void);
+
+struct grub_xnu_devprop_device_descriptor;
+
+struct grub_xnu_devprop_device_descriptor *
+grub_xnu_devprop_add_device (struct grub_efi_device_path *path, int length);
+grub_err_t
+grub_xnu_devprop_remove_device (struct grub_xnu_devprop_device_descriptor *dev);
+grub_err_t
+grub_xnu_devprop_remove_property (struct grub_xnu_devprop_device_descriptor *dev,
+ char *name);
+grub_err_t
+grub_xnu_devprop_add_property_utf8 (struct grub_xnu_devprop_device_descriptor *dev,
+ char *name, void *data, int datalen);
+grub_err_t
+grub_xnu_devprop_add_property_utf16 (struct grub_xnu_devprop_device_descriptor *dev,
+ grub_uint16_t *name, int namelen,
+ void *data, int datalen);
+grub_err_t
+grub_xnu_devprop_remove_property_utf8 (struct grub_xnu_devprop_device_descriptor *dev,
+ char *name);
+void grub_cpu_xnu_init (void);
+void grub_cpu_xnu_fini (void);
+
+extern grub_uint32_t grub_xnu_entry_point;
+extern grub_uint32_t grub_xnu_stack;
+extern grub_uint32_t grub_xnu_arg1;
+extern char grub_xnu_cmdline[1024];
+grub_err_t grub_xnu_boot (void);
+#endif