diff options
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/0001-vm-fix-vm_map_enter.patch | 33 | ||||
-rw-r--r-- | debian/patches/acpihalt.patch | 2364 | ||||
-rw-r--r-- | debian/patches/series | 3 |
3 files changed, 0 insertions, 2400 deletions
diff --git a/debian/patches/0001-vm-fix-vm_map_enter.patch b/debian/patches/0001-vm-fix-vm_map_enter.patch deleted file mode 100644 index a01cbdf..0000000 --- a/debian/patches/0001-vm-fix-vm_map_enter.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 0c961dfdeda6e757068479d7876697b931a2780e Mon Sep 17 00:00:00 2001 -From: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Fri, 5 Sep 2014 14:13:42 +0200 -Subject: [PATCH] vm: fix vm_map_enter - -Previously, vm_map_enter returned KERN_NO_SPACE if ADDRESS is out of -range even if ANYWHERE was given. - -* vm/vm_map.c (vm_map_enter): Pick a suitable address if the given -address is out of bounds and anywhere is given. ---- - vm/vm_map.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/vm/vm_map.c b/vm/vm_map.c -index 6b13724..fe4aae1 100644 ---- a/vm/vm_map.c -+++ b/vm/vm_map.c -@@ -781,10 +781,8 @@ kern_return_t vm_map_enter( - * Calculate the first possible address. - */ - -- if (start < map->min_offset) -+ if (start < map->min_offset || start > map->max_offset) - start = map->min_offset; -- if (start > map->max_offset) -- RETURN(KERN_NO_SPACE); - - /* - * Look for the first possible address; --- -2.1.0 - diff --git a/debian/patches/acpihalt.patch b/debian/patches/acpihalt.patch deleted file mode 100644 index aaf3acd..0000000 --- a/debian/patches/acpihalt.patch +++ /dev/null @@ -1,2364 +0,0 @@ -diff --git a/i386/Makefrag.am b/i386/Makefrag.am -index cac2267..4dd6a9f 100644 ---- a/i386/Makefrag.am -+++ b/i386/Makefrag.am -@@ -55,6 +55,25 @@ libkernel_a_SOURCES += \ - i386/i386at/pic_isa.c \ - i386/i386at/rtc.c \ - i386/i386at/rtc.h -+ -+libkernel_a_SOURCES += \ -+ i386/i386at/acpihalt.c \ -+ i386/i386at/acpihalt.h \ -+ i386/i386at/acpi.c \ -+ i386/i386at/grub_glue.c \ -+ i386/grub/err.h \ -+ i386/grub/cpu/io.h \ -+ i386/grub/cpu/types.h \ -+ i386/grub/cpu/time.h \ -+ i386/grub/mm.h \ -+ i386/grub/acpi.h \ -+ i386/grub/symbol.h \ -+ i386/grub/misc.h \ -+ i386/grub/types.h \ -+ i386/grub/time.h \ -+ i386/grub/i18n.h \ -+ i386/grub/compiler.h \ -+ i386/grub/glue.h - endif - - # -diff --git a/i386/grub/acpi.h b/i386/grub/acpi.h -new file mode 100644 -index 0000000..2ac2bd6 ---- /dev/null -+++ b/i386/grub/acpi.h -@@ -0,0 +1,220 @@ -+/* -+ * 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_ACPI_HEADER -+#define GRUB_ACPI_HEADER 1 -+ -+#ifndef GRUB_DSDT_TEST -+#include <grub/types.h> -+#include <grub/err.h> -+#endif -+ -+#define GRUB_RSDP_SIGNATURE "RSD PTR " -+#define GRUB_RSDP_SIGNATURE_SIZE 8 -+ -+struct grub_acpi_rsdp_v10 -+{ -+ grub_uint8_t signature[GRUB_RSDP_SIGNATURE_SIZE]; -+ grub_uint8_t checksum; -+ grub_uint8_t oemid[6]; -+ grub_uint8_t revision; -+ grub_uint32_t rsdt_addr; -+} GRUB_PACKED; -+ -+struct grub_acpi_rsdp_v20 -+{ -+ struct grub_acpi_rsdp_v10 rsdpv1; -+ grub_uint32_t length; -+ grub_uint64_t xsdt_addr; -+ grub_uint8_t checksum; -+ grub_uint8_t reserved[3]; -+} GRUB_PACKED; -+ -+struct grub_acpi_table_header -+{ -+ grub_uint8_t signature[4]; -+ grub_uint32_t length; -+ grub_uint8_t revision; -+ grub_uint8_t checksum; -+ grub_uint8_t oemid[6]; -+ grub_uint8_t oemtable[8]; -+ grub_uint32_t oemrev; -+ grub_uint8_t creator_id[4]; -+ grub_uint32_t creator_rev; -+} GRUB_PACKED; -+ -+#define GRUB_ACPI_FADT_SIGNATURE "FACP" -+ -+struct grub_acpi_fadt -+{ -+ struct grub_acpi_table_header hdr; -+ grub_uint32_t facs_addr; -+ grub_uint32_t dsdt_addr; -+ grub_uint8_t somefields1[20]; -+ grub_uint32_t pm1a; -+ grub_uint8_t somefields2[64]; -+ grub_uint64_t facs_xaddr; -+ grub_uint64_t dsdt_xaddr; -+ grub_uint8_t somefields3[96]; -+} GRUB_PACKED; -+ -+#define GRUB_ACPI_MADT_SIGNATURE "APIC" -+ -+struct grub_acpi_madt_entry_header -+{ -+ grub_uint8_t type; -+ grub_uint8_t len; -+}; -+ -+struct grub_acpi_madt -+{ -+ struct grub_acpi_table_header hdr; -+ grub_uint32_t lapic_addr; -+ grub_uint32_t flags; -+ struct grub_acpi_madt_entry_header entries[0]; -+}; -+ -+enum -+ { -+ GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC = 0, -+ GRUB_ACPI_MADT_ENTRY_TYPE_IOAPIC = 1, -+ GRUB_ACPI_MADT_ENTRY_TYPE_INTERRUPT_OVERRIDE = 2, -+ GRUB_ACPI_MADT_ENTRY_TYPE_LAPIC_NMI = 4, -+ GRUB_ACPI_MADT_ENTRY_TYPE_SAPIC = 6, -+ GRUB_ACPI_MADT_ENTRY_TYPE_LSAPIC = 7, -+ GRUB_ACPI_MADT_ENTRY_TYPE_PLATFORM_INT_SOURCE = 8 -+ }; -+ -+struct grub_acpi_madt_entry_lapic -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t acpiid; -+ grub_uint8_t apicid; -+ grub_uint32_t flags; -+}; -+ -+struct grub_acpi_madt_entry_ioapic -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t id; -+ grub_uint8_t pad; -+ grub_uint32_t address; -+ grub_uint32_t global_sys_interrupt; -+}; -+ -+struct grub_acpi_madt_entry_interrupt_override -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t bus; -+ grub_uint8_t source; -+ grub_uint32_t global_sys_interrupt; -+ grub_uint16_t flags; -+} GRUB_PACKED; -+ -+ -+struct grub_acpi_madt_entry_lapic_nmi -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t acpiid; -+ grub_uint16_t flags; -+ grub_uint8_t lint; -+} GRUB_PACKED; -+ -+struct grub_acpi_madt_entry_sapic -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t id; -+ grub_uint8_t pad; -+ grub_uint32_t global_sys_interrupt_base; -+ grub_uint64_t addr; -+}; -+ -+struct grub_acpi_madt_entry_lsapic -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint8_t cpu_id; -+ grub_uint8_t id; -+ grub_uint8_t eid; -+ grub_uint8_t pad[3]; -+ grub_uint32_t flags; -+ grub_uint32_t cpu_uid; -+ grub_uint8_t cpu_uid_str[0]; -+}; -+ -+struct grub_acpi_madt_entry_platform_int_source -+{ -+ struct grub_acpi_madt_entry_header hdr; -+ grub_uint16_t flags; -+ grub_uint8_t inttype; -+ grub_uint8_t cpu_id; -+ grub_uint8_t cpu_eid; -+ grub_uint8_t sapic_vector; -+ grub_uint32_t global_sys_int; -+ grub_uint32_t src_flags; -+}; -+ -+enum -+ { -+ GRUB_ACPI_MADT_ENTRY_SAPIC_FLAGS_ENABLED = 1 -+ }; -+ -+#ifndef GRUB_DSDT_TEST -+struct grub_acpi_rsdp_v10 *grub_acpi_get_rsdpv1 (void); -+struct grub_acpi_rsdp_v20 *grub_acpi_get_rsdpv2 (void); -+struct grub_acpi_rsdp_v10 *grub_machine_acpi_get_rsdpv1 (void); -+struct grub_acpi_rsdp_v20 *grub_machine_acpi_get_rsdpv2 (void); -+grub_uint8_t grub_byte_checksum (void *base, grub_size_t size); -+ -+grub_err_t grub_acpi_create_ebda (void); -+ -+void grub_acpi_halt (void); -+#endif -+ -+#define GRUB_ACPI_SLP_EN (1 << 13) -+#define GRUB_ACPI_SLP_TYP_OFFSET 10 -+ -+enum -+ { -+ GRUB_ACPI_OPCODE_ZERO = 0, GRUB_ACPI_OPCODE_ONE = 1, -+ GRUB_ACPI_OPCODE_NAME = 8, GRUB_ACPI_OPCODE_BYTE_CONST = 0x0a, -+ GRUB_ACPI_OPCODE_WORD_CONST = 0x0b, -+ GRUB_ACPI_OPCODE_DWORD_CONST = 0x0c, -+ GRUB_ACPI_OPCODE_STRING_CONST = 0x0d, -+ GRUB_ACPI_OPCODE_SCOPE = 0x10, -+ GRUB_ACPI_OPCODE_BUFFER = 0x11, -+ GRUB_ACPI_OPCODE_PACKAGE = 0x12, -+ GRUB_ACPI_OPCODE_METHOD = 0x14, GRUB_ACPI_OPCODE_EXTOP = 0x5b, -+ GRUB_ACPI_OPCODE_CREATE_WORD_FIELD = 0x8b, -+ GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD = 0x8c, -+ GRUB_ACPI_OPCODE_IF = 0xa0, GRUB_ACPI_OPCODE_ONES = 0xff -+ }; -+enum -+ { -+ GRUB_ACPI_EXTOPCODE_MUTEX = 0x01, -+ GRUB_ACPI_EXTOPCODE_EVENT_OP = 0x02, -+ GRUB_ACPI_EXTOPCODE_OPERATION_REGION = 0x80, -+ GRUB_ACPI_EXTOPCODE_FIELD_OP = 0x81, -+ GRUB_ACPI_EXTOPCODE_DEVICE_OP = 0x82, -+ GRUB_ACPI_EXTOPCODE_PROCESSOR_OP = 0x83, -+ GRUB_ACPI_EXTOPCODE_POWER_RES_OP = 0x84, -+ GRUB_ACPI_EXTOPCODE_THERMAL_ZONE_OP = 0x85, -+ GRUB_ACPI_EXTOPCODE_INDEX_FIELD_OP = 0x86, -+ GRUB_ACPI_EXTOPCODE_BANK_FIELD_OP = 0x87, -+ }; -+ -+#endif /* ! GRUB_ACPI_HEADER */ -diff --git a/i386/grub/compiler.h b/i386/grub/compiler.h -new file mode 100644 -index 0000000..c9e1d7a ---- /dev/null -+++ b/i386/grub/compiler.h -@@ -0,0 +1,51 @@ -+/* compiler.h - macros for various compiler features */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2002,2003,2005,2006,2007,2008,2009,2010,2014 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_COMPILER_HEADER -+#define GRUB_COMPILER_HEADER 1 -+ -+/* GCC version checking borrowed from glibc. */ -+#if defined(__GNUC__) && defined(__GNUC_MINOR__) -+# define GNUC_PREREQ(maj,min) \ -+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -+#else -+# define GNUC_PREREQ(maj,min) 0 -+#endif -+ -+/* Does this compiler support compile-time error attributes? */ -+#if GNUC_PREREQ(4,3) -+# define ATTRIBUTE_ERROR(msg) \ -+ __attribute__ ((__error__ (msg))) -+#else -+# define ATTRIBUTE_ERROR(msg) __attribute__ ((noreturn)) -+#endif -+ -+#if GNUC_PREREQ(4,4) -+# define GNU_PRINTF gnu_printf -+#else -+# define GNU_PRINTF printf -+#endif -+ -+#if GNUC_PREREQ(3,4) -+# define WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) -+#else -+# define WARN_UNUSED_RESULT -+#endif -+ -+#endif /* ! GRUB_COMPILER_HEADER */ -diff --git a/i386/grub/cpu/io.h b/i386/grub/cpu/io.h -new file mode 100644 -index 0000000..ae12a3e ---- /dev/null -+++ b/i386/grub/cpu/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/i386/grub/cpu/time.h b/i386/grub/cpu/time.h -new file mode 100644 -index 0000000..842882c ---- /dev/null -+++ b/i386/grub/cpu/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/i386/grub/cpu/types.h b/i386/grub/cpu/types.h -new file mode 100644 -index 0000000..c20063f ---- /dev/null -+++ b/i386/grub/cpu/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/i386/grub/err.h b/i386/grub/err.h -new file mode 100644 -index 0000000..1590c68 ---- /dev/null -+++ b/i386/grub/err.h -@@ -0,0 +1,96 @@ -+/* err.h - error numbers and prototypes */ -+/* -+ * 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_ERR_HEADER -+#define GRUB_ERR_HEADER 1 -+ -+#include <grub/symbol.h> -+ -+#define GRUB_MAX_ERRMSG 256 -+ -+typedef enum -+ { -+ GRUB_ERR_NONE = 0, -+ GRUB_ERR_TEST_FAILURE, -+ GRUB_ERR_BAD_MODULE, -+ GRUB_ERR_OUT_OF_MEMORY, -+ GRUB_ERR_BAD_FILE_TYPE, -+ GRUB_ERR_FILE_NOT_FOUND, -+ GRUB_ERR_FILE_READ_ERROR, -+ GRUB_ERR_BAD_FILENAME, -+ GRUB_ERR_UNKNOWN_FS, -+ GRUB_ERR_BAD_FS, -+ GRUB_ERR_BAD_NUMBER, -+ GRUB_ERR_OUT_OF_RANGE, -+ GRUB_ERR_UNKNOWN_DEVICE, -+ GRUB_ERR_BAD_DEVICE, -+ GRUB_ERR_READ_ERROR, -+ GRUB_ERR_WRITE_ERROR, -+ GRUB_ERR_UNKNOWN_COMMAND, -+ GRUB_ERR_INVALID_COMMAND, -+ GRUB_ERR_BAD_ARGUMENT, -+ GRUB_ERR_BAD_PART_TABLE, -+ GRUB_ERR_UNKNOWN_OS, -+ GRUB_ERR_BAD_OS, -+ GRUB_ERR_NO_KERNEL, -+ GRUB_ERR_BAD_FONT, -+ GRUB_ERR_NOT_IMPLEMENTED_YET, -+ GRUB_ERR_SYMLINK_LOOP, -+ GRUB_ERR_BAD_COMPRESSED_DATA, -+ GRUB_ERR_MENU, -+ GRUB_ERR_TIMEOUT, -+ GRUB_ERR_IO, -+ GRUB_ERR_ACCESS_DENIED, -+ GRUB_ERR_EXTRACTOR, -+ GRUB_ERR_NET_BAD_ADDRESS, -+ GRUB_ERR_NET_ROUTE_LOOP, -+ GRUB_ERR_NET_NO_ROUTE, -+ GRUB_ERR_NET_NO_ANSWER, -+ GRUB_ERR_NET_NO_CARD, -+ GRUB_ERR_WAIT, -+ GRUB_ERR_BUG, -+ GRUB_ERR_NET_PORT_CLOSED, -+ GRUB_ERR_NET_INVALID_RESPONSE, -+ GRUB_ERR_NET_UNKNOWN_ERROR, -+ GRUB_ERR_NET_PACKET_TOO_BIG, -+ GRUB_ERR_NET_NO_DOMAIN, -+ GRUB_ERR_EOF, -+ GRUB_ERR_BAD_SIGNATURE -+ } -+grub_err_t; -+ -+struct grub_error_saved -+{ -+ grub_err_t grub_errno; -+ char errmsg[GRUB_MAX_ERRMSG]; -+}; -+ -+extern grub_err_t EXPORT_VAR(grub_errno); -+extern char EXPORT_VAR(grub_errmsg)[GRUB_MAX_ERRMSG]; -+ -+grub_err_t EXPORT_FUNC(grub_error) (grub_err_t n, const char *fmt, ...); -+void EXPORT_FUNC(grub_fatal) (const char *fmt, ...) __attribute__ ((noreturn)); -+void EXPORT_FUNC(grub_error_push) (void); -+int EXPORT_FUNC(grub_error_pop) (void); -+void EXPORT_FUNC(grub_print_error) (void); -+extern int EXPORT_VAR(grub_err_printed_errors); -+int grub_err_printf (const char *fmt, ...) -+ __attribute__ ((format (__printf__, 1, 2))); -+ -+#endif /* ! GRUB_ERR_HEADER */ -diff --git a/i386/grub/glue.h b/i386/grub/glue.h -new file mode 100644 -index 0000000..e1c62eb ---- /dev/null -+++ b/i386/grub/glue.h -@@ -0,0 +1,31 @@ -+/* -+ * Copyright (c) 2014 Free Software Foundation. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#ifndef _GRUB_GLUE_H -+#define _GRUB_GLUE_H -+ -+#define GRUB_FILE __FILE__ -+#define grub_memcmp memcmp -+#define grub_printf printf -+#define grub_puts_ puts -+ -+#include <mach/mach_types.h> -+#include <i386/vm_param.h> -+ -+vm_offset_t io_map_cached(vm_offset_t phys_addr, vm_size_t size); -+ -+#endif /* _GRUB_GLUE_H */ -diff --git a/i386/grub/i18n.h b/i386/grub/i18n.h -new file mode 100644 -index 0000000..8b53357 ---- /dev/null -+++ b/i386/grub/i18n.h -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (c) 2014 Free Software Foundation. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#ifndef _GRUB_I18N_H -+#define _GRUB_I18N_H -+ -+/* No i18n please. */ -+#define _(x) x -+#define N_(x) x -+ -+#endif /* _GRUB_I18N_H */ -diff --git a/i386/grub/misc.h b/i386/grub/misc.h -new file mode 100644 -index 0000000..c6cd456 ---- /dev/null -+++ b/i386/grub/misc.h -@@ -0,0 +1,517 @@ -+/* misc.h - prototypes for misc functions */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2002,2003,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_MISC_HEADER -+#define GRUB_MISC_HEADER 1 -+ -+#include <stdarg.h> -+#include <grub/types.h> -+#include <grub/symbol.h> -+#include <grub/err.h> -+#include <grub/i18n.h> -+#include <grub/compiler.h> -+ -+#define ALIGN_UP(addr, align) \ -+ ((addr + (typeof (addr)) align - 1) & ~((typeof (addr)) align - 1)) -+#define ALIGN_UP_OVERHEAD(addr, align) ((-(addr)) & ((typeof (addr)) (align) - 1)) -+#define ALIGN_DOWN(addr, align) \ -+ ((addr) & ~((typeof (addr)) align - 1)) -+#define ARRAY_SIZE(array) (sizeof (array) / sizeof (array[0])) -+#define COMPILE_TIME_ASSERT(cond) switch (0) { case 1: case !(cond): ; } -+ -+#define grub_dprintf(condition, ...) grub_real_dprintf(GRUB_FILE, __LINE__, condition, __VA_ARGS__) -+ -+void *EXPORT_FUNC(grub_memmove) (void *dest, const void *src, grub_size_t n); -+char *EXPORT_FUNC(grub_strcpy) (char *dest, const char *src); -+ -+static inline char * -+grub_strncpy (char *dest, const char *src, int c) -+{ -+ char *p = dest; -+ -+ while ((*p++ = *src++) != '\0' && --c) -+ ; -+ -+ return dest; -+} -+ -+static inline char * -+grub_stpcpy (char *dest, const char *src) -+{ -+ char *d = dest; -+ const char *s = src; -+ -+ do -+ *d++ = *s; -+ while (*s++ != '\0'); -+ -+ return d - 1; -+} -+ -+/* XXX: If grub_memmove is too slow, we must implement grub_memcpy. */ -+static inline void * -+grub_memcpy (void *dest, const void *src, grub_size_t n) -+{ -+ return grub_memmove (dest, src, n); -+} -+ -+#if defined (__APPLE__) && defined(__i386__) && !defined (GRUB_UTIL) -+#define GRUB_BUILTIN_ATTR __attribute__ ((regparm(0))) -+#else -+#define GRUB_BUILTIN_ATTR -+#endif -+ -+#if defined(__x86_64__) && !defined (GRUB_UTIL) -+#if defined (__MINGW32__) || defined (__CYGWIN__) || defined (__MINGW64__) -+#define GRUB_ASM_ATTR __attribute__ ((sysv_abi)) -+#else -+#define GRUB_ASM_ATTR -+#endif -+#endif -+ -+/* Prototypes for aliases. */ -+#ifndef GRUB_UTIL -+int GRUB_BUILTIN_ATTR EXPORT_FUNC(memcmp) (const void *s1, const void *s2, grub_size_t n); -+void *GRUB_BUILTIN_ATTR EXPORT_FUNC(memmove) (void *dest, const void *src, grub_size_t n); -+void *GRUB_BUILTIN_ATTR EXPORT_FUNC(memcpy) (void *dest, const void *src, grub_size_t n); -+void *GRUB_BUILTIN_ATTR EXPORT_FUNC(memset) (void *s, int c, grub_size_t n); -+ -+#ifdef __APPLE__ -+void GRUB_BUILTIN_ATTR EXPORT_FUNC (__bzero) (void *s, grub_size_t n); -+#endif -+ -+#endif -+ -+int EXPORT_FUNC(grub_memcmp) (const void *s1, const void *s2, grub_size_t n); -+int EXPORT_FUNC(grub_strcmp) (const char *s1, const char *s2); -+int EXPORT_FUNC(grub_strncmp) (const char *s1, const char *s2, grub_size_t n); -+ -+char *EXPORT_FUNC(grub_strchr) (const char *s, int c); -+char *EXPORT_FUNC(grub_strrchr) (const char *s, int c); -+int EXPORT_FUNC(grub_strword) (const char *s, const char *w); -+ -+/* Copied from gnulib. -+ Written by Bruno Haible <bruno@clisp.org>, 2005. */ -+static inline char * -+grub_strstr (const char *haystack, const char *needle) -+{ -+ /* Be careful not to look at the entire extent of haystack or needle -+ until needed. This is useful because of these two cases: -+ - haystack may be very long, and a match of needle found early, -+ - needle may be very long, and not even a short initial segment of -+ needle may be found in haystack. */ -+ if (*needle != '\0') -+ { -+ /* Speed up the following searches of needle by caching its first -+ character. */ -+ char b = *needle++; -+ -+ for (;; haystack++) -+ { -+ if (*haystack == '\0') -+ /* No match. */ -+ return 0; -+ if (*haystack == b) -+ /* The first character matches. */ -+ { -+ const char *rhaystack = haystack + 1; -+ const char *rneedle = needle; -+ -+ for (;; rhaystack++, rneedle++) -+ { -+ if (*rneedle == '\0') -+ /* Found a match. */ -+ return (char *) haystack; -+ if (*rhaystack == '\0') -+ /* No match. */ -+ return 0; -+ if (*rhaystack != *rneedle) -+ /* Nothing in this round. */ -+ break; -+ } -+ } -+ } -+ } -+ else -+ return (char *) haystack; -+} -+ -+int EXPORT_FUNC(grub_isspace) (int c); -+ -+static inline int -+grub_isprint (int c) -+{ -+ return (c >= ' ' && c <= '~'); -+} -+ -+static inline int -+grub_iscntrl (int c) -+{ -+ return (c >= 0x00 && c <= 0x1F) || c == 0x7F; -+} -+ -+static inline int -+grub_isalpha (int c) -+{ -+ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); -+} -+ -+static inline int -+grub_islower (int c) -+{ -+ return (c >= 'a' && c <= 'z'); -+} -+ -+static inline int -+grub_isupper (int c) -+{ -+ return (c >= 'A' && c <= 'Z'); -+} -+ -+static inline int -+grub_isgraph (int c) -+{ -+ return (c >= '!' && c <= '~'); -+} -+ -+static inline int -+grub_isdigit (int c) -+{ -+ return (c >= '0' && c <= '9'); -+} -+ -+static inline int -+grub_isxdigit (int c) -+{ -+ return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); -+} -+ -+static inline int -+grub_isalnum (int c) -+{ -+ return grub_isalpha (c) || grub_isdigit (c); -+} -+ -+static inline int -+grub_tolower (int c) -+{ -+ if (c >= 'A' && c <= 'Z') -+ return c - 'A' + 'a'; -+ -+ return c; -+} -+ -+static inline int -+grub_toupper (int c) -+{ -+ if (c >= 'a' && c <= 'z') -+ return c - 'a' + 'A'; -+ -+ return c; -+} -+ -+static inline int -+grub_strcasecmp (const char *s1, const char *s2) -+{ -+ while (*s1 && *s2) -+ { -+ if (grub_tolower ((grub_uint8_t) *s1) -+ != grub_tolower ((grub_uint8_t) *s2)) -+ break; -+ -+ s1++; -+ s2++; -+ } -+ -+ return (int) grub_tolower ((grub_uint8_t) *s1) -+ - (int) grub_tolower ((grub_uint8_t) *s2); -+} -+ -+static inline int -+grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) -+{ -+ if (n == 0) -+ return 0; -+ -+ while (*s1 && *s2 && --n) -+ { -+ if (grub_tolower (*s1) != grub_tolower (*s2)) -+ break; -+ -+ s1++; -+ s2++; -+ } -+ -+ return (int) grub_tolower ((grub_uint8_t) *s1) -+ - (int) grub_tolower ((grub_uint8_t) *s2); -+} -+ -+unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base); -+unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base); -+ -+static inline long -+grub_strtol (const char *str, char **end, int base) -+{ -+ int negative = 0; -+ unsigned long long magnitude; -+ -+ while (*str && grub_isspace (*str)) -+ str++; -+ -+ if (*str == '-') -+ { -+ negative = 1; -+ str++; -+ } -+ -+ magnitude = grub_strtoull (str, end, base); -+ if (negative) -+ { -+ if (magnitude > (unsigned long) GRUB_LONG_MAX + 1) -+ { -+ grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); -+ return GRUB_LONG_MIN; -+ } -+ return -((long) magnitude); -+ } -+ else -+ { -+ if (magnitude > GRUB_LONG_MAX) -+ { -+ grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected")); -+ return GRUB_LONG_MAX; -+ } -+ return (long) magnitude; -+ } -+} -+ -+char *EXPORT_FUNC(grub_strdup) (const char *s) WARN_UNUSED_RESULT; -+char *EXPORT_FUNC(grub_strndup) (const char *s, grub_size_t n) WARN_UNUSED_RESULT; -+void *EXPORT_FUNC(grub_memset) (void *s, int c, grub_size_t n); -+grub_size_t EXPORT_FUNC(grub_strlen) (const char *s) WARN_UNUSED_RESULT; -+int EXPORT_FUNC(grub_printf) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2))); -+int EXPORT_FUNC(grub_printf_) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2))); -+ -+/* Replace all `ch' characters of `input' with `with' and copy the -+ result into `output'; return EOS address of `output'. */ -+static inline char * -+grub_strchrsub (char *output, const char *input, char ch, const char *with) -+{ -+ while (*input) -+ { -+ if (*input == ch) -+ { -+ grub_strcpy (output, with); -+ output += grub_strlen (with); -+ input++; -+ continue; -+ } -+ *output++ = *input++; -+ } -+ *output = '\0'; -+ return output; -+} -+ -+extern void (*EXPORT_VAR (grub_xputs)) (const char *str); -+ -+static inline int -+grub_puts (const char *s) -+{ -+ const char nl[2] = "\n"; -+ grub_xputs (s); -+ grub_xputs (nl); -+ -+ return 1; /* Cannot fail. */ -+} -+ -+int EXPORT_FUNC(grub_puts_) (const char *s); -+void EXPORT_FUNC(grub_real_dprintf) (const char *file, -+ const int line, -+ const char *condition, -+ const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 4, 5))); -+int EXPORT_FUNC(grub_vprintf) (const char *fmt, va_list args); -+int EXPORT_FUNC(grub_snprintf) (char *str, grub_size_t n, const char *fmt, ...) -+ __attribute__ ((format (GNU_PRINTF, 3, 4))); -+int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt, -+ va_list args); -+char *EXPORT_FUNC(grub_xasprintf) (const char *fmt, ...) -+ __attribute__ ((format (GNU_PRINTF, 1, 2))) WARN_UNUSED_RESULT; -+char *EXPORT_FUNC(grub_xvasprintf) (const char *fmt, va_list args) WARN_UNUSED_RESULT; -+void EXPORT_FUNC(grub_exit) (void) __attribute__ ((noreturn)); -+grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n, -+ grub_uint64_t d, -+ grub_uint64_t *r); -+ -+#if (defined (__MINGW32__) || defined (__CYGWIN__)) && !defined(GRUB_UTIL) -+void EXPORT_FUNC (__register_frame_info) (void); -+void EXPORT_FUNC (__deregister_frame_info) (void); -+void EXPORT_FUNC (___chkstk_ms) (void); -+void EXPORT_FUNC (__chkstk_ms) (void); -+#endif -+ -+/* Inline functions. */ -+ -+static inline char * -+grub_memchr (const void *p, int c, grub_size_t len) -+{ -+ const char *s = (const char *) p; -+ const char *e = s + len; -+ -+ for (; s < e; s++) -+ if (*s == c) -+ return (char *) s; -+ -+ return 0; -+} -+ -+ -+static inline unsigned int -+grub_abs (int x) -+{ -+ if (x < 0) -+ return (unsigned int) (-x); -+ else -+ return (unsigned int) x; -+} -+ -+/* Rounded-up division */ -+static inline unsigned int -+grub_div_roundup (unsigned int x, unsigned int y) -+{ -+ return (x + y - 1) / y; -+} -+ -+/* Reboot the machine. */ -+#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS) -+void EXPORT_FUNC(grub_reboot) (void) __attribute__ ((noreturn)); -+#else -+void grub_reboot (void) __attribute__ ((noreturn)); -+#endif -+ -+#if defined (__clang__) && !defined (GRUB_UTIL) -+void __attribute__ ((noreturn)) EXPORT_FUNC (abort) (void); -+#endif -+ -+#ifdef GRUB_MACHINE_PCBIOS -+/* Halt the system, using APM if possible. If NO_APM is true, don't -+ * use APM even if it is available. */ -+void grub_halt (int no_apm) __attribute__ ((noreturn)); -+#elif defined (__mips__) && !defined (GRUB_MACHINE_EMU) -+void EXPORT_FUNC (grub_halt) (void) __attribute__ ((noreturn)); -+#else -+void grub_halt (void) __attribute__ ((noreturn)); -+#endif -+ -+#ifdef GRUB_MACHINE_EMU -+/* Flag to check if module loading is available. */ -+extern const int EXPORT_VAR(grub_no_modules); -+#else -+#define grub_no_modules 0 -+#endif -+ -+static inline void -+grub_error_save (struct grub_error_saved *save) -+{ -+ grub_memcpy (save->errmsg, grub_errmsg, sizeof (save->errmsg)); -+ save->grub_errno = grub_errno; -+ grub_errno = GRUB_ERR_NONE; -+} -+ -+static inline void -+grub_error_load (const struct grub_error_saved *save) -+{ -+ grub_memcpy (grub_errmsg, save->errmsg, sizeof (grub_errmsg)); -+ grub_errno = save->grub_errno; -+} -+ -+#ifndef GRUB_UTIL -+ -+#if defined (__arm__) -+ -+grub_uint32_t -+EXPORT_FUNC (__udivsi3) (grub_uint32_t a, grub_uint32_t b); -+ -+grub_uint32_t -+EXPORT_FUNC (__umodsi3) (grub_uint32_t a, grub_uint32_t b); -+ -+#endif -+ -+#if defined (__sparc__) || defined (__powerpc__) -+unsigned -+EXPORT_FUNC (__ctzdi2) (grub_uint64_t x); -+#define NEED_CTZDI2 1 -+#endif -+ -+#if defined (__mips__) || defined (__arm__) -+unsigned -+EXPORT_FUNC (__ctzsi2) (grub_uint32_t x); -+#define NEED_CTZSI2 1 -+#endif -+ -+#ifdef __arm__ -+grub_uint32_t -+EXPORT_FUNC (__aeabi_uidiv) (grub_uint32_t a, grub_uint32_t b); -+grub_uint32_t -+EXPORT_FUNC (__aeabi_uidivmod) (grub_uint32_t a, grub_uint32_t b); -+ -+/* Needed for allowing modules to be compiled as thumb. */ -+grub_uint64_t -+EXPORT_FUNC (__muldi3) (grub_uint64_t a, grub_uint64_t b); -+grub_uint64_t -+EXPORT_FUNC (__aeabi_lmul) (grub_uint64_t a, grub_uint64_t b); -+ -+#endif -+ -+#if defined (__ia64__) -+ -+grub_uint64_t -+EXPORT_FUNC (__udivdi3) (grub_uint64_t a, grub_uint64_t b); -+ -+grub_uint64_t -+EXPORT_FUNC (__umoddi3) (grub_uint64_t a, grub_uint64_t b); -+ -+#endif -+ -+#endif /* GRUB_UTIL */ -+ -+ -+#if BOOT_TIME_STATS -+struct grub_boot_time -+{ -+ struct grub_boot_time *next; -+ grub_uint64_t tp; -+ const char *file; -+ int line; -+ char *msg; -+}; -+ -+extern struct grub_boot_time *EXPORT_VAR(grub_boot_time_head); -+ -+void EXPORT_FUNC(grub_real_boot_time) (const char *file, -+ const int line, -+ const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 3, 4))); -+#define grub_boot_time(...) grub_real_boot_time(GRUB_FILE, __LINE__, __VA_ARGS__) -+#else -+#define grub_boot_time(...) -+#endif -+ -+#define grub_max(a, b) (((a) > (b)) ? (a) : (b)) -+#define grub_min(a, b) (((a) < (b)) ? (a) : (b)) -+ -+#endif /* ! GRUB_MISC_HEADER */ -diff --git a/i386/grub/mm.h b/i386/grub/mm.h -new file mode 100644 -index 0000000..28e2e53 ---- /dev/null -+++ b/i386/grub/mm.h -@@ -0,0 +1,77 @@ -+/* mm.h - prototypes and declarations for memory manager */ -+/* -+ * 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_MM_H -+#define GRUB_MM_H 1 -+ -+#include <grub/types.h> -+#include <grub/symbol.h> -+#include <config.h> -+ -+#ifndef NULL -+# define NULL ((void *) 0) -+#endif -+ -+void grub_mm_init_region (void *addr, grub_size_t size); -+void *EXPORT_FUNC(grub_malloc) (grub_size_t size); -+void *EXPORT_FUNC(grub_zalloc) (grub_size_t size); -+void EXPORT_FUNC(grub_free) (void *ptr); -+void *EXPORT_FUNC(grub_realloc) (void *ptr, grub_size_t size); -+#ifndef GRUB_MACHINE_EMU -+void *EXPORT_FUNC(grub_memalign) (grub_size_t align, grub_size_t size); -+#endif -+ -+void grub_mm_check_real (const char *file, int line); -+#define grub_mm_check() grub_mm_check_real (GRUB_FILE, __LINE__); -+ -+/* For debugging. */ -+#if defined(MM_DEBUG) && !defined(GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) -+/* Set this variable to 1 when you want to trace all memory function calls. */ -+extern int EXPORT_VAR(grub_mm_debug); -+ -+void grub_mm_dump_free (void); -+void grub_mm_dump (unsigned lineno); -+ -+#define grub_malloc(size) \ -+ grub_debug_malloc (GRUB_FILE, __LINE__, size) -+ -+#define grub_zalloc(size) \ -+ grub_debug_zalloc (GRUB_FILE, __LINE__, size) -+ -+#define grub_realloc(ptr,size) \ -+ grub_debug_realloc (GRUB_FILE, __LINE__, ptr, size) -+ -+#define grub_memalign(align,size) \ -+ grub_debug_memalign (GRUB_FILE, __LINE__, align, size) -+ -+#define grub_free(ptr) \ -+ grub_debug_free (GRUB_FILE, __LINE__, ptr) -+ -+void *EXPORT_FUNC(grub_debug_malloc) (const char *file, int line, -+ grub_size_t size); -+void *EXPORT_FUNC(grub_debug_zalloc) (const char *file, int line, -+ grub_size_t size); -+void EXPORT_FUNC(grub_debug_free) (const char *file, int line, void *ptr); -+void *EXPORT_FUNC(grub_debug_realloc) (const char *file, int line, void *ptr, -+ grub_size_t size); -+void *EXPORT_FUNC(grub_debug_memalign) (const char *file, int line, -+ grub_size_t align, grub_size_t size); -+#endif /* MM_DEBUG && ! GRUB_UTIL */ -+ -+#endif /* ! GRUB_MM_H */ -diff --git a/i386/grub/symbol.h b/i386/grub/symbol.h -new file mode 100644 -index 0000000..ed19f70 ---- /dev/null -+++ b/i386/grub/symbol.h -@@ -0,0 +1,72 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 1999,2000,2001,2002,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_SYMBOL_HEADER -+#define GRUB_SYMBOL_HEADER 1 -+ -+#include <config.h> -+ -+/* Apple assembler requires local labels to start with a capital L */ -+#define LOCAL(sym) L_ ## sym -+ -+/* Add an underscore to a C symbol in assembler code if needed. */ -+#ifndef GRUB_UTIL -+ -+#ifdef __APPLE__ -+#define MACRO_DOLLAR(x) $$ ## x -+#else -+#define MACRO_DOLLAR(x) $ ## x -+#endif -+ -+#if HAVE_ASM_USCORE -+#ifdef ASM_FILE -+# define EXT_C(sym) _ ## sym -+#else -+# define EXT_C(sym) "_" sym -+#endif -+#else -+# define EXT_C(sym) sym -+#endif -+ -+#ifdef __arm__ -+#define END .end -+#endif -+ -+#if defined (__APPLE__) -+#define FUNCTION(x) .globl EXT_C(x) ; EXT_C(x): -+#define VARIABLE(x) .globl EXT_C(x) ; EXT_C(x): -+#elif defined (__CYGWIN__) || defined (__MINGW32__) -+/* .type not supported for non-ELF targets. XXX: Check this in configure? */ -+#define FUNCTION(x) .globl EXT_C(x) ; .def EXT_C(x); .scl 2; .type 32; .endef; EXT_C(x): -+#define VARIABLE(x) .globl EXT_C(x) ; .def EXT_C(x); .scl 2; .type 0; .endef; EXT_C(x): -+#elif defined (__arm__) -+#define FUNCTION(x) .globl EXT_C(x) ; .type EXT_C(x), %function ; EXT_C(x): -+#define VARIABLE(x) .globl EXT_C(x) ; .type EXT_C(x), %object ; EXT_C(x): -+#else -+#define FUNCTION(x) .globl EXT_C(x) ; .type EXT_C(x), @function ; EXT_C(x): -+#define VARIABLE(x) .globl EXT_C(x) ; .type EXT_C(x), @object ; EXT_C(x): -+#endif -+#endif -+ -+/* Mark an exported symbol. */ -+#ifndef GRUB_SYMBOL_GENERATOR -+# define EXPORT_FUNC(x) x -+# define EXPORT_VAR(x) x -+#endif /* ! GRUB_SYMBOL_GENERATOR */ -+ -+#endif /* ! GRUB_SYMBOL_HEADER */ -diff --git a/i386/grub/time.h b/i386/grub/time.h -new file mode 100644 -index 0000000..64ac99a ---- /dev/null -+++ b/i386/grub/time.h -@@ -0,0 +1,46 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 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_TIME_HEADER -+#define KERNEL_TIME_HEADER 1 -+ -+#include <grub/types.h> -+#include <grub/symbol.h> -+#ifndef GRUB_MACHINE_EMU -+#include <grub/cpu/time.h> -+#else -+static inline void -+grub_cpu_idle(void) -+{ -+} -+#endif -+ -+void EXPORT_FUNC(grub_millisleep) (grub_uint32_t ms); -+grub_uint64_t EXPORT_FUNC(grub_get_time_ms) (void); -+ -+grub_uint64_t grub_rtc_get_time_ms (void); -+ -+static __inline void -+grub_sleep (grub_uint32_t s) -+{ -+ grub_millisleep (1000 * s); -+} -+ -+void grub_install_get_time_ms (grub_uint64_t (*get_time_ms_func) (void)); -+ -+#endif /* ! KERNEL_TIME_HEADER */ -diff --git a/i386/grub/types.h b/i386/grub/types.h -new file mode 100644 -index 0000000..79f765c ---- /dev/null -+++ b/i386/grub/types.h -@@ -0,0 +1,325 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2002,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_TYPES_HEADER -+#define GRUB_TYPES_HEADER 1 -+ -+#include <config.h> -+#ifndef GRUB_UTIL -+#include <grub/cpu/types.h> -+#endif -+ -+#ifdef __MINGW32__ -+#define GRUB_PACKED __attribute__ ((packed,gcc_struct)) -+#else -+#define GRUB_PACKED __attribute__ ((packed)) -+#endif -+ -+#ifdef GRUB_BUILD -+# define GRUB_CPU_SIZEOF_VOID_P BUILD_SIZEOF_VOID_P -+# define GRUB_CPU_SIZEOF_LONG BUILD_SIZEOF_LONG -+# if BUILD_WORDS_BIGENDIAN -+# define GRUB_CPU_WORDS_BIGENDIAN 1 -+# else -+# undef GRUB_CPU_WORDS_BIGENDIAN -+# endif -+#elif defined (GRUB_UTIL) -+# define GRUB_CPU_SIZEOF_VOID_P SIZEOF_VOID_P -+# define GRUB_CPU_SIZEOF_LONG SIZEOF_LONG -+# ifdef WORDS_BIGENDIAN -+# define GRUB_CPU_WORDS_BIGENDIAN 1 -+# else -+# undef GRUB_CPU_WORDS_BIGENDIAN -+# endif -+#else /* ! GRUB_UTIL */ -+# define GRUB_CPU_SIZEOF_VOID_P GRUB_TARGET_SIZEOF_VOID_P -+# define GRUB_CPU_SIZEOF_LONG GRUB_TARGET_SIZEOF_LONG -+# ifdef GRUB_TARGET_WORDS_BIGENDIAN -+# define GRUB_CPU_WORDS_BIGENDIAN 1 -+# else -+# undef GRUB_CPU_WORDS_BIGENDIAN -+# endif -+#endif /* ! GRUB_UTIL */ -+ -+#if GRUB_CPU_SIZEOF_VOID_P != 4 && GRUB_CPU_SIZEOF_VOID_P != 8 -+# error "This architecture is not supported because sizeof(void *) != 4 and sizeof(void *) != 8" -+#endif -+ -+#if GRUB_CPU_SIZEOF_LONG != 4 && GRUB_CPU_SIZEOF_LONG != 8 -+# error "This architecture is not supported because sizeof(long) != 4 and sizeof(long) != 8" -+#endif -+ -+#if !defined (GRUB_UTIL) && !defined (GRUB_TARGET_WORDSIZE) -+# if GRUB_TARGET_SIZEOF_VOID_P == 4 -+# define GRUB_TARGET_WORDSIZE 32 -+# elif GRUB_TARGET_SIZEOF_VOID_P == 8 -+# define GRUB_TARGET_WORDSIZE 64 -+# endif -+#endif -+ -+/* Define various wide integers. */ -+typedef signed char grub_int8_t; -+typedef short grub_int16_t; -+typedef int grub_int32_t; -+#if GRUB_CPU_SIZEOF_LONG == 8 -+typedef long grub_int64_t; -+#else -+typedef long long grub_int64_t; -+#endif -+ -+typedef unsigned char grub_uint8_t; -+typedef unsigned short grub_uint16_t; -+typedef unsigned grub_uint32_t; -+# define PRIxGRUB_UINT32_T "x" -+# define PRIuGRUB_UINT32_T "u" -+#if GRUB_CPU_SIZEOF_LONG == 8 -+typedef unsigned long grub_uint64_t; -+# define PRIxGRUB_UINT64_T "lx" -+# define PRIuGRUB_UINT64_T "lu" -+#else -+typedef unsigned long long grub_uint64_t; -+# define PRIxGRUB_UINT64_T "llx" -+# define PRIuGRUB_UINT64_T "llu" -+#endif -+ -+/* Misc types. */ -+ -+#if GRUB_CPU_SIZEOF_VOID_P == 8 -+typedef grub_uint64_t grub_addr_t; -+typedef grub_uint64_t grub_size_t; -+typedef grub_int64_t grub_ssize_t; -+ -+# define GRUB_SIZE_MAX 18446744073709551615UL -+ -+# if GRUB_CPU_SIZEOF_LONG == 8 -+# define PRIxGRUB_SIZE "lx" -+# define PRIxGRUB_ADDR "lx" -+# define PRIuGRUB_SIZE "lu" -+# define PRIdGRUB_SSIZE "ld" -+# else -+# define PRIxGRUB_SIZE "llx" -+# define PRIxGRUB_ADDR "llx" -+# define PRIuGRUB_SIZE "llu" -+# define PRIdGRUB_SSIZE "lld" -+# endif -+#else -+typedef grub_uint32_t grub_addr_t; -+typedef grub_uint32_t grub_size_t; -+typedef grub_int32_t grub_ssize_t; -+ -+# define GRUB_SIZE_MAX 4294967295UL -+ -+# define PRIxGRUB_SIZE "x" -+# define PRIxGRUB_ADDR "x" -+# define PRIuGRUB_SIZE "u" -+# define PRIdGRUB_SSIZE "d" -+#endif -+ -+#define GRUB_UCHAR_MAX 0xFF -+#define GRUB_USHRT_MAX 65535 -+#define GRUB_SHRT_MAX 0x7fff -+#define GRUB_UINT_MAX 4294967295U -+#define GRUB_INT_MAX 0x7fffffff -+#define GRUB_INT32_MIN (-2147483647 - 1) -+#define GRUB_INT32_MAX 2147483647 -+ -+#if GRUB_CPU_SIZEOF_LONG == 8 -+# define GRUB_ULONG_MAX 18446744073709551615UL -+# define GRUB_LONG_MAX 9223372036854775807L -+# define GRUB_LONG_MIN (-9223372036854775807L - 1) -+#else -+# define GRUB_ULONG_MAX 4294967295UL -+# define GRUB_LONG_MAX 2147483647L -+# define GRUB_LONG_MIN (-2147483647L - 1) -+#endif -+ -+typedef grub_uint64_t grub_properly_aligned_t; -+ -+#define GRUB_PROPERLY_ALIGNED_ARRAY(name, size) grub_properly_aligned_t name[((size) + sizeof (grub_properly_aligned_t) - 1) / sizeof (grub_properly_aligned_t)] -+ -+/* The type for representing a file offset. */ -+typedef grub_uint64_t grub_off_t; -+ -+/* The type for representing a disk block address. */ -+typedef grub_uint64_t grub_disk_addr_t; -+ -+/* Byte-orders. */ -+static inline grub_uint16_t grub_swap_bytes16(grub_uint16_t _x) -+{ -+ return (grub_uint16_t) ((_x << 8) | (_x >> 8)); -+} -+ -+#define grub_swap_bytes16_compile_time(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8)) -+#define grub_swap_bytes32_compile_time(x) ((((x) & 0xff) << 24) | (((x) & 0xff00) << 8) | (((x) & 0xff0000) >> 8) | (((x) & 0xff000000UL) >> 24)) -+#define grub_swap_bytes64_compile_time(x) \ -+({ \ -+ grub_uint64_t _x = (x); \ -+ (grub_uint64_t) ((_x << 56) \ -+ | ((_x & (grub_uint64_t) 0xFF00ULL) << 40) \ -+ | ((_x & (grub_uint64_t) 0xFF0000ULL) << 24) \ -+ | ((_x & (grub_uint64_t) 0xFF000000ULL) << 8) \ -+ | ((_x & (grub_uint64_t) 0xFF00000000ULL) >> 8) \ -+ | ((_x & (grub_uint64_t) 0xFF0000000000ULL) >> 24) \ -+ | ((_x & (grub_uint64_t) 0xFF000000000000ULL) >> 40) \ -+ | (_x >> 56)); \ -+}) -+ -+#if defined(__GNUC__) && (__GNUC__ > 3) && (__GNUC__ > 4 || __GNUC_MINOR__ >= 3) -+static inline grub_uint32_t grub_swap_bytes32(grub_uint32_t x) -+{ -+ return __builtin_bswap32(x); -+} -+ -+static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t x) -+{ -+ return __builtin_bswap64(x); -+} -+#else /* not gcc 4.3 or newer */ -+static inline grub_uint32_t grub_swap_bytes32(grub_uint32_t _x) -+{ -+ return ((_x << 24) -+ | ((_x & (grub_uint32_t) 0xFF00UL) << 8) -+ | ((_x & (grub_uint32_t) 0xFF0000UL) >> 8) -+ | (_x >> 24)); -+} -+ -+static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t _x) -+{ -+ return ((_x << 56) -+ | ((_x & (grub_uint64_t) 0xFF00ULL) << 40) -+ | ((_x & (grub_uint64_t) 0xFF0000ULL) << 24) -+ | ((_x & (grub_uint64_t) 0xFF000000ULL) << 8) -+ | ((_x & (grub_uint64_t) 0xFF00000000ULL) >> 8) -+ | ((_x & (grub_uint64_t) 0xFF0000000000ULL) >> 24) -+ | ((_x & (grub_uint64_t) 0xFF000000000000ULL) >> 40) -+ | (_x >> 56)); -+} -+#endif /* not gcc 4.3 or newer */ -+ -+#ifdef GRUB_CPU_WORDS_BIGENDIAN -+# define grub_cpu_to_le16(x) grub_swap_bytes16(x) -+# define grub_cpu_to_le32(x) grub_swap_bytes32(x) -+# define grub_cpu_to_le64(x) grub_swap_bytes64(x) -+# define grub_le_to_cpu16(x) grub_swap_bytes16(x) -+# define grub_le_to_cpu32(x) grub_swap_bytes32(x) -+# define grub_le_to_cpu64(x) grub_swap_bytes64(x) -+# define grub_cpu_to_be16(x) ((grub_uint16_t) (x)) -+# define grub_cpu_to_be32(x) ((grub_uint32_t) (x)) -+# define grub_cpu_to_be64(x) ((grub_uint64_t) (x)) -+# define grub_be_to_cpu16(x) ((grub_uint16_t) (x)) -+# define grub_be_to_cpu32(x) ((grub_uint32_t) (x)) -+# define grub_be_to_cpu64(x) ((grub_uint64_t) (x)) -+# define grub_cpu_to_be16_compile_time(x) ((grub_uint16_t) (x)) -+# define grub_cpu_to_be32_compile_time(x) ((grub_uint32_t) (x)) -+# define grub_cpu_to_be64_compile_time(x) ((grub_uint64_t) (x)) -+# define grub_be_to_cpu64_compile_time(x) ((grub_uint64_t) (x)) -+# define grub_cpu_to_le32_compile_time(x) grub_swap_bytes32_compile_time(x) -+# define grub_cpu_to_le64_compile_time(x) grub_swap_bytes64_compile_time(x) -+# define grub_cpu_to_le16_compile_time(x) grub_swap_bytes16_compile_time(x) -+#else /* ! WORDS_BIGENDIAN */ -+# define grub_cpu_to_le16(x) ((grub_uint16_t) (x)) -+# define grub_cpu_to_le32(x) ((grub_uint32_t) (x)) -+# define grub_cpu_to_le64(x) ((grub_uint64_t) (x)) -+# define grub_le_to_cpu16(x) ((grub_uint16_t) (x)) -+# define grub_le_to_cpu32(x) ((grub_uint32_t) (x)) -+# define grub_le_to_cpu64(x) ((grub_uint64_t) (x)) -+# define grub_cpu_to_be16(x) grub_swap_bytes16(x) -+# define grub_cpu_to_be32(x) grub_swap_bytes32(x) -+# define grub_cpu_to_be64(x) grub_swap_bytes64(x) -+# define grub_be_to_cpu16(x) grub_swap_bytes16(x) -+# define grub_be_to_cpu32(x) grub_swap_bytes32(x) -+# define grub_be_to_cpu64(x) grub_swap_bytes64(x) -+# define grub_cpu_to_be16_compile_time(x) grub_swap_bytes16_compile_time(x) -+# define grub_cpu_to_be32_compile_time(x) grub_swap_bytes32_compile_time(x) -+# define grub_cpu_to_be64_compile_time(x) grub_swap_bytes64_compile_time(x) -+# define grub_be_to_cpu64_compile_time(x) grub_swap_bytes64_compile_time(x) -+# define grub_cpu_to_le16_compile_time(x) ((grub_uint16_t) (x)) -+# define grub_cpu_to_le32_compile_time(x) ((grub_uint32_t) (x)) -+# define grub_cpu_to_le64_compile_time(x) ((grub_uint64_t) (x)) -+ -+#endif /* ! WORDS_BIGENDIAN */ -+ -+static inline grub_uint16_t grub_get_unaligned16 (const void *ptr) -+{ -+ struct grub_unaligned_uint16_t -+ { -+ grub_uint16_t d; -+ } GRUB_PACKED; -+ const struct grub_unaligned_uint16_t *dd -+ = (const struct grub_unaligned_uint16_t *) ptr; -+ return dd->d; -+} -+ -+static inline void grub_set_unaligned16 (void *ptr, grub_uint16_t val) -+{ -+ struct grub_unaligned_uint16_t -+ { -+ grub_uint16_t d; -+ } GRUB_PACKED; -+ struct grub_unaligned_uint16_t *dd = (struct grub_unaligned_uint16_t *) ptr; -+ dd->d = val; -+} -+ -+static inline grub_uint32_t grub_get_unaligned32 (const void *ptr) -+{ -+ struct grub_unaligned_uint32_t -+ { -+ grub_uint32_t d; -+ } GRUB_PACKED; -+ const struct grub_unaligned_uint32_t *dd -+ = (const struct grub_unaligned_uint32_t *) ptr; -+ return dd->d; -+} -+ -+static inline void grub_set_unaligned32 (void *ptr, grub_uint32_t val) -+{ -+ struct grub_unaligned_uint32_t -+ { -+ grub_uint32_t d; -+ } GRUB_PACKED; -+ struct grub_unaligned_uint32_t *dd = (struct grub_unaligned_uint32_t *) ptr; -+ dd->d = val; -+} -+ -+struct grub_unaligned_uint64 -+{ -+ grub_uint64_t val; -+} GRUB_PACKED; -+ -+typedef struct grub_unaligned_uint64 grub_unaligned_uint64_t; -+ -+static inline grub_uint64_t grub_get_unaligned64 (const void *ptr) -+{ -+ const struct grub_unaligned_uint64 *dd -+ = (const struct grub_unaligned_uint64 *) ptr; -+ return dd->val; -+} -+ -+static inline void grub_set_unaligned64 (void *ptr, grub_uint64_t val) -+{ -+ struct grub_unaligned_uint64_t -+ { -+ grub_uint64_t d; -+ } GRUB_PACKED; -+ struct grub_unaligned_uint64_t *dd = (struct grub_unaligned_uint64_t *) ptr; -+ dd->d = val; -+} -+ -+#define GRUB_CHAR_BIT 8 -+ -+#endif /* ! GRUB_TYPES_HEADER */ -diff --git a/i386/i386/io_map.c b/i386/i386/io_map.c -index 74e0b47..03d7152 100644 ---- a/i386/i386/io_map.c -+++ b/i386/i386/io_map.c -@@ -58,3 +58,32 @@ io_map( - VM_PROT_READ|VM_PROT_WRITE); - return (start); - } -+ -+/* -+ * Allocate and map memory for devices that may need to be mapped before -+ * Mach VM is running. -+ * -+ * This maps the all pages containing [PHYS_ADDR:PHYS_ADDR + SIZE]. -+ * For contiguous requests to those pages will reuse the previously -+ * established mapping. -+ */ -+vm_offset_t -+io_map_cached( -+ vm_offset_t phys_addr, -+ vm_size_t size) -+{ -+ static vm_offset_t base; -+ static vm_size_t length; -+ static vm_offset_t map; -+ -+ if (! map -+ || (phys_addr < base) -+ || (base + length < phys_addr + size)) -+ { -+ base = trunc_page(phys_addr); -+ length = round_page(phys_addr - base + size); -+ map = io_map(base, length); -+ } -+ -+ return map + (phys_addr - base); -+} -diff --git a/i386/i386at/acpi.c b/i386/i386at/acpi.c -new file mode 100644 -index 0000000..ec8aeb1 ---- /dev/null -+++ b/i386/i386at/acpi.c -@@ -0,0 +1,82 @@ -+/* acpi.c - get acpi tables. */ -+/* -+ * 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/>. -+ */ -+ -+#include <grub/glue.h> -+#include <grub/acpi.h> -+#include <grub/misc.h> -+ -+struct grub_acpi_rsdp_v10 * -+grub_machine_acpi_get_rsdpv1 (void) -+{ -+ int ebda_len; -+ grub_uint8_t *ebda, *ptr; -+ -+ grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); -+ ebda = (grub_uint8_t *) phystokv ((* ((grub_uint16_t *) phystokv (0x40e))) << 4); -+ ebda_len = * (grub_uint16_t *) ebda; -+ if (! ebda_len) -+ return 0; -+ for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) -+ if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 -+ && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 -+ && ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0) -+ return (struct grub_acpi_rsdp_v10 *) ptr; -+ -+ grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); -+ for (ptr = (grub_uint8_t *) phystokv (0xe0000); ptr < (grub_uint8_t *) phystokv (0x100000); -+ ptr += 16) -+ if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 -+ && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 -+ && ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0) -+ return (struct grub_acpi_rsdp_v10 *) ptr; -+ return 0; -+} -+ -+struct grub_acpi_rsdp_v20 * -+grub_machine_acpi_get_rsdpv2 (void) -+{ -+ int ebda_len; -+ grub_uint8_t *ebda, *ptr; -+ -+ grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); -+ ebda = (grub_uint8_t *) phystokv ((* ((grub_uint16_t *) phystokv (0x40e))) << 4); -+ ebda_len = * (grub_uint16_t *) ebda; -+ if (! ebda_len) -+ return 0; -+ for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) -+ if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 -+ && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 -+ && ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0 -+ && ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024 -+ && grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length) -+ == 0) -+ return (struct grub_acpi_rsdp_v20 *) ptr; -+ -+ grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); -+ for (ptr = (grub_uint8_t *) phystokv (0xe0000); ptr < (grub_uint8_t *) phystokv (0x100000); -+ ptr += 16) -+ if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 -+ && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 -+ && ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0 -+ && ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024 -+ && grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length) -+ == 0) -+ return (struct grub_acpi_rsdp_v20 *) ptr; -+ return 0; -+} -diff --git a/i386/i386at/acpihalt.c b/i386/i386at/acpihalt.c -new file mode 100644 -index 0000000..23df44f ---- /dev/null -+++ b/i386/i386at/acpihalt.c -@@ -0,0 +1,409 @@ -+/* -+ * 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/>. -+ */ -+ -+#include <grub/glue.h> -+ -+#ifdef GRUB_DSDT_TEST -+#include <stdio.h> -+#include <unistd.h> -+#include <stdlib.h> -+#include <stdint.h> -+#include <string.h> -+#include <errno.h> -+ -+#define grub_dprintf(cond, args...) printf ( args ) -+#define grub_printf printf -+typedef uint64_t grub_uint64_t; -+typedef uint32_t grub_uint32_t; -+typedef uint16_t grub_uint16_t; -+typedef uint8_t grub_uint8_t; -+ -+#endif -+ -+#include <grub/acpi.h> -+#ifndef GRUB_DSDT_TEST -+#include <grub/i18n.h> -+#else -+#define _(x) x -+#define N_(x) x -+#endif -+ -+#ifndef GRUB_DSDT_TEST -+#include <grub/mm.h> -+#include <grub/misc.h> -+#include <grub/time.h> -+#include <grub/cpu/io.h> -+#endif -+ -+static inline grub_uint32_t -+decode_length (const grub_uint8_t *ptr, int *numlen) -+{ -+ int num_bytes, i; -+ grub_uint32_t ret; -+ if (*ptr < 64) -+ { -+ if (numlen) -+ *numlen = 1; -+ return *ptr; -+ } -+ num_bytes = *ptr >> 6; -+ if (numlen) -+ *numlen = num_bytes + 1; -+ ret = *ptr & 0xf; -+ ptr++; -+ for (i = 0; i < num_bytes; i++) -+ { -+ ret |= *ptr << (8 * i + 4); -+ ptr++; -+ } -+ return ret; -+} -+ -+static inline grub_uint32_t -+skip_name_string (const grub_uint8_t *ptr, const grub_uint8_t *end) -+{ -+ const grub_uint8_t *ptr0 = ptr; -+ -+ while (ptr < end && (*ptr == '^' || *ptr == '\\')) -+ ptr++; -+ switch (*ptr) -+ { -+ case '.': -+ ptr++; -+ ptr += 8; -+ break; -+ case '/': -+ ptr++; -+ ptr += 1 + (*ptr) * 4; -+ break; -+ case 0: -+ ptr++; -+ break; -+ default: -+ ptr += 4; -+ break; -+ } -+ return ptr - ptr0; -+} -+ -+static inline grub_uint32_t -+skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end) -+{ -+ grub_dprintf ("acpi", "data type = 0x%x\n", *ptr); -+ switch (*ptr) -+ { -+ case GRUB_ACPI_OPCODE_PACKAGE: -+ case GRUB_ACPI_OPCODE_BUFFER: -+ return 1 + decode_length (ptr + 1, 0); -+ case GRUB_ACPI_OPCODE_ZERO: -+ case GRUB_ACPI_OPCODE_ONES: -+ case GRUB_ACPI_OPCODE_ONE: -+ return 1; -+ case GRUB_ACPI_OPCODE_BYTE_CONST: -+ return 2; -+ case GRUB_ACPI_OPCODE_WORD_CONST: -+ return 3; -+ case GRUB_ACPI_OPCODE_DWORD_CONST: -+ return 5; -+ case GRUB_ACPI_OPCODE_STRING_CONST: -+ { -+ const grub_uint8_t *ptr0 = ptr; -+ for (ptr++; ptr < end && *ptr; ptr++); -+ if (ptr == end) -+ return 0; -+ return ptr - ptr0 + 1; -+ } -+ default: -+ if (*ptr == '^' || *ptr == '\\' || *ptr == '_' -+ || (*ptr >= 'A' && *ptr <= 'Z')) -+ return skip_name_string (ptr, end); -+ grub_printf ("Unknown opcode 0x%x\n", *ptr); -+ return 0; -+ } -+} -+ -+static inline grub_uint32_t -+skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end) -+{ -+ const grub_uint8_t *ptr0 = ptr; -+ int add; -+ grub_dprintf ("acpi", "Extended opcode: 0x%x\n", *ptr); -+ switch (*ptr) -+ { -+ case GRUB_ACPI_EXTOPCODE_MUTEX: -+ ptr++; -+ ptr += skip_name_string (ptr, end); -+ ptr++; -+ break; -+ case GRUB_ACPI_EXTOPCODE_EVENT_OP: -+ ptr++; -+ ptr += skip_name_string (ptr, end); -+ break; -+ case GRUB_ACPI_EXTOPCODE_OPERATION_REGION: -+ ptr++; -+ ptr += skip_name_string (ptr, end); -+ ptr++; -+ ptr += add = skip_data_ref_object (ptr, end); -+ if (!add) -+ return 0; -+ ptr += add = skip_data_ref_object (ptr, end); -+ if (!add) -+ return 0; -+ break; -+ case GRUB_ACPI_EXTOPCODE_FIELD_OP: -+ case GRUB_ACPI_EXTOPCODE_DEVICE_OP: -+ case GRUB_ACPI_EXTOPCODE_PROCESSOR_OP: -+ case GRUB_ACPI_EXTOPCODE_POWER_RES_OP: -+ case GRUB_ACPI_EXTOPCODE_THERMAL_ZONE_OP: -+ case GRUB_ACPI_EXTOPCODE_INDEX_FIELD_OP: -+ case GRUB_ACPI_EXTOPCODE_BANK_FIELD_OP: -+ ptr++; -+ ptr += decode_length (ptr, 0); -+ break; -+ default: -+ grub_printf ("Unexpected extended opcode: 0x%x\n", *ptr); -+ return 0; -+ } -+ return ptr - ptr0; -+} -+ -+static int -+get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end, -+ grub_uint8_t *scope, int scope_len) -+{ -+ grub_uint8_t *prev = table; -+ -+ if (!ptr) -+ ptr = table + sizeof (struct grub_acpi_table_header); -+ while (ptr < end && prev < ptr) -+ { -+ int add; -+ prev = ptr; -+ grub_dprintf ("acpi", "Opcode 0x%x\n", *ptr); -+ grub_dprintf ("acpi", "Tell %x\n", (unsigned) (ptr - table)); -+ switch (*ptr) -+ { -+ case GRUB_ACPI_OPCODE_EXTOP: -+ ptr++; -+ ptr += add = skip_ext_op (ptr, end); -+ if (!add) -+ return -1; -+ break; -+ case GRUB_ACPI_OPCODE_CREATE_WORD_FIELD: -+ case GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD: -+ { -+ ptr += 5; -+ ptr += add = skip_data_ref_object (ptr, end); -+ if (!add) -+ return -1; -+ ptr += 4; -+ break; -+ } -+ case GRUB_ACPI_OPCODE_NAME: -+ ptr++; -+ if ((!scope || grub_memcmp (scope, "\\", scope_len) == 0) && -+ (grub_memcmp (ptr, "_S5_", 4) == 0 || grub_memcmp (ptr, "\\_S5_", 4) == 0)) -+ { -+ int ll; -+ grub_uint8_t *ptr2 = ptr; -+ grub_dprintf ("acpi", "S5 found\n"); -+ ptr2 += skip_name_string (ptr, end); -+ if (*ptr2 != 0x12) -+ { -+ grub_printf ("Unknown opcode in _S5: 0x%x\n", *ptr2); -+ return -1; -+ } -+ ptr2++; -+ decode_length (ptr2, &ll); -+ ptr2 += ll; -+ ptr2++; -+ switch (*ptr2) -+ { -+ case GRUB_ACPI_OPCODE_ZERO: -+ return 0; -+ case GRUB_ACPI_OPCODE_ONE: -+ return 1; -+ case GRUB_ACPI_OPCODE_BYTE_CONST: -+ return ptr2[1]; -+ default: -+ grub_printf ("Unknown data type in _S5: 0x%x\n", *ptr2); -+ return -1; -+ } -+ } -+ ptr += add = skip_name_string (ptr, end); -+ if (!add) -+ return -1; -+ ptr += add = skip_data_ref_object (ptr, end); -+ if (!add) -+ return -1; -+ break; -+ case GRUB_ACPI_OPCODE_SCOPE: -+ { -+ int scope_sleep_type; -+ int ll; -+ grub_uint8_t *name; -+ int name_len; -+ -+ ptr++; -+ add = decode_length (ptr, &ll); -+ name = ptr + ll; -+ name_len = skip_name_string (name, ptr + add); -+ if (!name_len) -+ return -1; -+ scope_sleep_type = get_sleep_type (table, name + name_len, -+ ptr + add, name, name_len); -+ if (scope_sleep_type != -2) -+ return scope_sleep_type; -+ ptr += add; -+ break; -+ } -+ case GRUB_ACPI_OPCODE_IF: -+ case GRUB_ACPI_OPCODE_METHOD: -+ { -+ ptr++; -+ ptr += decode_length (ptr, 0); -+ break; -+ } -+ default: -+ grub_printf ("Unknown opcode 0x%x\n", *ptr); -+ return -1; -+ } -+ } -+ -+ return -2; -+} -+ -+#ifdef GRUB_DSDT_TEST -+int -+main (int argc, char **argv) -+{ -+ FILE *f; -+ size_t len; -+ unsigned char *buf; -+ if (argc < 2) -+ printf ("Usage: %s FILE\n", argv[0]); -+ f = grub_util_fopen (argv[1], "rb"); -+ if (!f) -+ { -+ printf ("Couldn't open file\n"); -+ return 1; -+ } -+ fseek (f, 0, SEEK_END); -+ len = ftell (f); -+ fseek (f, 0, SEEK_SET); -+ buf = malloc (len); -+ if (!buf) -+ { -+ printf (_("error: %s.\n"), _("out of memory")); -+ fclose (f); -+ return 2; -+ } -+ if (fread (buf, 1, len, f) != len) -+ { -+ printf (_("cannot read `%s': %s"), argv[1], strerror (errno)); -+ free (buf); -+ fclose (f); -+ return 2; -+ } -+ -+ printf ("Sleep type = %d\n", get_sleep_type (buf, NULL, buf + len, NULL, 0)); -+ free (buf); -+ fclose (f); -+ return 0; -+} -+ -+#else -+ -+void -+grub_acpi_halt (void) -+{ -+ struct grub_acpi_rsdp_v20 *rsdp2; -+ struct grub_acpi_rsdp_v10 *rsdp1; -+ struct grub_acpi_table_header *rsdt; -+ grub_uint32_t *entry_ptr; -+ grub_uint32_t port = 0; -+ int sleep_type = -1; -+ -+ rsdp2 = grub_acpi_get_rsdpv2 (); -+ if (rsdp2) -+ rsdp1 = &(rsdp2->rsdpv1); -+ else -+ rsdp1 = grub_acpi_get_rsdpv1 (); -+ grub_dprintf ("acpi", "rsdp1=%p\n", rsdp1); -+ if (!rsdp1) -+ return; -+ -+ rsdt = (struct grub_acpi_table_header *) -+ io_map_cached (rsdp1->rsdt_addr, sizeof *rsdt); -+ rsdt = (struct grub_acpi_table_header *) -+ io_map_cached (rsdp1->rsdt_addr, rsdt->length); -+ -+ for (entry_ptr = (grub_uint32_t *) (rsdt + 1); -+ entry_ptr < (grub_uint32_t *) (((grub_uint8_t *) rsdt) -+ + rsdt->length); -+ entry_ptr++) -+ { -+ if (grub_memcmp ((void *) io_map_cached (*entry_ptr, 4), -+ "FACP", 4) == 0) -+ { -+ struct grub_acpi_fadt *fadt = (struct grub_acpi_fadt *) -+ io_map_cached (*entry_ptr, sizeof *fadt); -+ -+ struct grub_acpi_table_header *dsdt = -+ (struct grub_acpi_table_header *) -+ io_map_cached (fadt->dsdt_addr, sizeof *dsdt); -+ grub_uint8_t *buf = (grub_uint8_t *) -+ io_map_cached (fadt->dsdt_addr, dsdt->length); -+ -+ port = fadt->pm1a; -+ -+ grub_dprintf ("acpi", "PM1a port=%x\n", port); -+ -+ if (grub_memcmp (dsdt->signature, "DSDT", -+ sizeof (dsdt->signature)) == 0 -+ && sleep_type < 0) -+ sleep_type = get_sleep_type (buf, NULL, buf + dsdt->length, -+ NULL, 0); -+ } -+ else -+ if (grub_memcmp ((void *) io_map_cached (*entry_ptr, 4), "SSDT", 4) == 0 -+ && sleep_type < 0) -+ { -+ struct grub_acpi_table_header *ssdt -+ = (struct grub_acpi_table_header *) (grub_addr_t) -+ io_map_cached (*entry_ptr, sizeof *ssdt); -+ grub_uint8_t *buf = (grub_uint8_t *) -+ io_map_cached (*entry_ptr, ssdt->length); -+ -+ grub_dprintf ("acpi", "SSDT = %p\n", ssdt); -+ -+ sleep_type = get_sleep_type (buf, NULL, buf + ssdt->length, NULL, 0); -+ } -+ } -+ -+ grub_dprintf ("acpi", "SLP_TYP = %d, port = 0x%x\n", sleep_type, port); -+ if (port && sleep_type >= 0 && sleep_type < 8) -+ grub_outw (GRUB_ACPI_SLP_EN | (sleep_type << GRUB_ACPI_SLP_TYP_OFFSET), -+ port & 0xffff); -+ -+ grub_millisleep (1500); -+ -+ /* TRANSLATORS: It's computer shutdown using ACPI, not disabling ACPI. */ -+ grub_puts_ (N_("ACPI shutdown failed")); -+} -+#endif -diff --git a/i386/i386at/acpihalt.h b/i386/i386at/acpihalt.h -new file mode 100644 -index 0000000..a4fdb07 ---- /dev/null -+++ b/i386/i386at/acpihalt.h -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (c) 2014 Free Software Foundation. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#ifndef _ACPIHALT_H_ -+#define _ACPIHALT_H_ -+ -+void grub_acpi_halt (void); -+ -+#endif /* _ACPIHALT_H_ */ -diff --git a/i386/i386at/grub_glue.c b/i386/i386at/grub_glue.c -new file mode 100644 -index 0000000..68a4cb1 ---- /dev/null -+++ b/i386/i386at/grub_glue.c -@@ -0,0 +1,67 @@ -+/* -+ * Copyright (c) 2014 Free Software Foundation. -+ * -+ * 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, see <http://www.gnu.org/licenses/>. -+ */ -+ -+#include <kern/printf.h> -+#include <stdarg.h> -+#include <i386/vm_param.h> -+ -+#include <grub/glue.h> -+#include <grub/acpi.h> -+ -+#define GRUB_DEBUG 1 -+ -+void -+grub_real_dprintf (const char *file, const int line, const char *condition, -+ const char *fmt, ...) -+{ -+#if GRUB_DEBUG -+ va_list listp; -+ va_start(listp, fmt); -+ vprintf (fmt, listp); -+ va_end(listp); -+#endif -+} -+ -+void -+grub_millisleep (grub_uint32_t ms) -+{ -+ /* Do nothing. */ -+} -+ -+struct grub_acpi_rsdp_v20 * -+grub_acpi_get_rsdpv2 (void) -+{ -+ return grub_machine_acpi_get_rsdpv2 (); -+} -+ -+struct grub_acpi_rsdp_v10 * -+grub_acpi_get_rsdpv1 (void) -+{ -+ return grub_machine_acpi_get_rsdpv1 (); -+} -+ -+/* Simple checksum by summing all bytes. Used by ACPI and SMBIOS. */ -+grub_uint8_t -+grub_byte_checksum (void *base, grub_size_t size) -+{ -+ grub_uint8_t *ptr; -+ grub_uint8_t ret = 0; -+ for (ptr = (grub_uint8_t *) base; ptr < ((grub_uint8_t *) base) + size; -+ ptr++) -+ ret += *ptr; -+ return ret; -+} -diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c -index 95752fa..6093a66 100644 ---- a/i386/i386at/model_dep.c -+++ b/i386/i386at/model_dep.c -@@ -69,6 +69,7 @@ - #include <i386at/kd.h> - #include <i386at/rtc.h> - #include <i386at/model_dep.h> -+#include <i386at/acpihalt.h> - #ifdef MACH_XEN - #include <xen/console.h> - #include <xen/store.h> -@@ -231,6 +232,7 @@ void halt_all_cpus(boolean_t reboot) - #ifdef MACH_HYP - hyp_halt(); - #endif /* MACH_HYP */ -+ grub_acpi_halt(); - printf("In tight loop: hit ctl-alt-del to reboot\n"); - (void) spl0(); - } diff --git a/debian/patches/series b/debian/patches/series index 16a46e4..14fccb4 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,6 +6,3 @@ protected_payload.patch Add-some-padding-to-make-objects-fit-a-single-cache-.patch -#acpihalt.patch - -0001-vm-fix-vm_map_enter.patch |