diff --git a/ChangeLog b/ChangeLog index 12da2c9..e3ac3ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,53 @@ 2009-03-15 Vladimir Serbinenko + + Efiemu + + * conf/i386-pc.rmk: new modules efiemu, efiemu_acpi, efiemu_pnvram, + _linux_efi, linux_efi. + new files in grub-emu + new targets efiemu32.o and efiemu64.o + * lib/i386/pc/acpi.c: new file + * loader/linux_normal_efiemu.c: likewise + * loader/i386/efi/linux.c: added preliminary efiemu support + * util/i386/pc/grub-install.in: add efiemu??.o to the list of + files to copy + * include/grub/autoefi.h: new file + * nclude/grub/i386/efiemu.h: likewise + * include/grub/i386/pc/efiemu.h: likewise + * include/grub/acpi.h: likewise + * include/grub/i386/pc/memory.h: + (GRUB_MACHINE_MEMORY_ACPI): new definition + (GRUB_MACHINE_MEMORY_NVS): likewise + * include/grub/efi/api.h: add LL suffix when necessary + new definitions relating to tables + * include/grub/types.h: new definitions for pointer conversion + * include/grub/efiemu/efiemu.h: new file + * include/grub/efiemu/runtime.h: likewise + * efiemu/prepare.c: likewise + * efiemu/loadcore_common.c: likewise + * efiemu/loadcore64.c: likewise + * efiemu/runtime/efiemu.sh: likewise + * efiemu/runtime/efiemu.S: likewise + * efiemu/runtime/efiemu.c: likewise + * efiemu/runtime/config.h: likewise + * efiemu/prepare32.c: likewise + * efiemu/main.c: likewise + * efiemu/modules/pnvram.c: likewise + * efiemu/modules/i386: likewise + * efiemu/modules/i386/pc: likewise + * efiemu/modules/acpi.c: likewise + * efiemu/i386/pc/cfgtables.c: likewise + * efiemu/i386/loadcore64.c: likewise + * efiemu/i386/loadcore32.c: likewise + * efiemu/prepare64.c: likewise + * efiemu/loadcore.c: likewise + * efiemu/symbols.c: likewise + * efiemu/mm.c: likewise + * efiemu/loadcore32.c: likewise + * lib/i386/uppermem.c: likewise + * include/grub/i386/uppermem.h: likewise + +2009-03-15 Vladimir Serbinenko UFS improvements diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index a2fca47..d5e1fab 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -147,6 +147,11 @@ grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ + efiemu/main.c efiemu/loadcore64.c \ + efiemu/loadcore32.c efiemu/loadcore_common.c efiemu/mm.c \ + efiemu/modules/pnvram.c efiemu/i386/loadcore32.c \ + efiemu/i386/loadcore64.c efiemu/symbols.c efiemu/prepare32.c \ + efiemu/prepare64.c efiemu/uppermem.c lib/crc.c \ grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) @@ -174,7 +179,21 @@ pkglib_MODULES = biosdisk.mod _chain.mod _linux.mod linux.mod normal.mod \ ata.mod vga.mod memdisk.mod pci.mod lspci.mod \ aout.mod _bsd.mod bsd.mod pxe.mod pxecmd.mod datetime.mod date.mod \ datehook.mod lsmmap.mod ata_pthru.mod hdparm.mod \ - usb.mod uhci.mod ohci.mod usbtest.mod usbms.mod usb_keyboard.mod + usb.mod uhci.mod ohci.mod usbtest.mod usbms.mod usb_keyboard.mod \ + efiemu.mod efiemu_acpi.mod efiemu_pnvram.mod + +# For efiemu.mod. +efiemu_mod_SOURCES = efiemu/main.c efiemu/i386/loadcore32.c efiemu/i386/loadcore64.c efiemu/i386/pc/cfgtables.c efiemu/mm.c efiemu/loadcore_common.c efiemu/symbols.c efiemu/loadcore32.c efiemu/loadcore64.c efiemu/prepare32.c efiemu/prepare64.c lib/i386/pc/acpi.c efiemu/uppermem.c +efiemu_mod_CFLAGS = $(COMMON_CFLAGS) -Werror -Wall +efiemu_mod_LDFLAGS = $(COMMON_LDFLAGS) + +efiemu_acpi_mod_SOURCES = efiemu/modules/acpi.c +efiemu_acpi_mod_CFLAGS = $(COMMON_CFLAGS) -Werror -Wall +efiemu_acpi_mod_LDFLAGS = $(COMMON_LDFLAGS) + +efiemu_pnvram_mod_SOURCES = efiemu/modules/pnvram.c +efiemu_pnvram_mod_CFLAGS = $(COMMON_CFLAGS) -Werror -Wall +efiemu_pnvram_mod_LDFLAGS = $(COMMON_LDFLAGS) # For biosdisk.mod. biosdisk_mod_SOURCES = disk/i386/pc/biosdisk.c @@ -381,5 +400,19 @@ hdparm_mod_SOURCES = commands/hdparm.c lib/hexdump.c hdparm_mod_CFLAGS = $(COMMON_CFLAGS) hdparm_mod_LDFLAGS = $(COMMON_LDFLAGS) +efiemu32.o: efiemu/runtime/efiemu.c + $(CC) -c -m32 -DELF32 -o $@ -Wall -Werror efiemu/runtime/efiemu.c -nostdlib -O2 -Iefiemu/runtime -Iinclude +efiemu64_c.o: efiemu/runtime/efiemu.c + $(CC) -c -m64 -DELF64 -o $@ -Wall -Werror efiemu/runtime/efiemu.c -nostdlib -mcmodel=large -O2 -Iefiemu/runtime -Iinclude + +efiemu64_s.o: efiemu/runtime/efiemu.S + $(CC) -c -m64 -DELF64 -o $@ -Wall -Werror efiemu/runtime/efiemu.S -nostdlib -mcmodel=large -O2 -Iefiemu/runtime -Iinclude + +efiemu64.o: efiemu64_c.o efiemu64_s.o + ld -o $@ -r efiemu64_c.o efiemu64_s.o -nostdlib + +CLEANFILES += efiemu32.o efiemu64.o efiemu64_c.o efiemu64_s.o +lib_DATA += efiemu32.o efiemu64.o + include $(srcdir)/conf/i386.mk include $(srcdir)/conf/common.mk diff --git a/conf/i386.rmk b/conf/i386.rmk index 93f84ce..4e86ed8 100644 --- a/conf/i386.rmk +++ b/conf/i386.rmk @@ -14,3 +14,8 @@ pkglib_MODULES += vga_text.mod vga_text_mod_SOURCES = term/i386/pc/vga_text.c term/i386/vga_common.c vga_text_mod_CFLAGS = $(COMMON_CFLAGS) vga_text_mod_LDFLAGS = $(COMMON_LDFLAGS) + +pkglib_MODULES += uppermem.mod +uppermem_mod_SOURCES = lib/i386/uppermem.c +uppermem_mod_CFLAGS = $(COMMON_CFLAGS) +uppermem_mod_LDFLAGS = $(COMMON_LDFLAGS) diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h index a764b37..f359ed3 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -40,15 +40,15 @@ #define GRUB_EFI_TPL_NOTIFY 16 #define GRUB_EFI_TPL_HIGH_LEVEL 31 -#define GRUB_EFI_MEMORY_UC 0x0000000000000001 -#define GRUB_EFI_MEMORY_WC 0x0000000000000002 -#define GRUB_EFI_MEMORY_WT 0x0000000000000004 -#define GRUB_EFI_MEMORY_WB 0x0000000000000008 -#define GRUB_EFI_MEMORY_UCE 0x0000000000000010 -#define GRUB_EFI_MEMORY_WP 0x0000000000001000 -#define GRUB_EFI_MEMORY_RP 0x0000000000002000 -#define GRUB_EFI_MEMORY_XP 0x0000000000004000 -#define GRUB_EFI_MEMORY_RUNTIME 0x8000000000000000 +#define GRUB_EFI_MEMORY_UC 0x0000000000000001LL +#define GRUB_EFI_MEMORY_WC 0x0000000000000002LL +#define GRUB_EFI_MEMORY_WT 0x0000000000000004LL +#define GRUB_EFI_MEMORY_WB 0x0000000000000008LL +#define GRUB_EFI_MEMORY_UCE 0x0000000000000010LL +#define GRUB_EFI_MEMORY_WP 0x0000000000001000LL +#define GRUB_EFI_MEMORY_RP 0x0000000000002000LL +#define GRUB_EFI_MEMORY_XP 0x0000000000004000LL +#define GRUB_EFI_MEMORY_RUNTIME 0x8000000000000000LL #define GRUB_EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 #define GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 @@ -619,7 +619,7 @@ struct grub_efi_time grub_efi_int16_t time_zone; grub_efi_uint8_t daylight; grub_efi_uint8_t pad2; -}; +} __attribute__ ((packed)); typedef struct grub_efi_time grub_efi_time_t; struct grub_efi_time_capabilities @@ -936,6 +936,9 @@ struct grub_efi_configuration_table }; typedef struct grub_efi_configuration_table grub_efi_configuration_table_t; +#define GRUB_EFIEMU_SYSTEM_TABLE_SIGNATURE 0x5453595320494249LL +#define GRUB_EFIEMU_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552LL + struct grub_efi_simple_input_interface { grub_efi_status_t diff --git a/include/grub/types.h b/include/grub/types.h index 8d51b66..faf2257 100644 --- a/include/grub/types.h +++ b/include/grub/types.h @@ -100,6 +100,16 @@ typedef grub_int32_t grub_ssize_t; # define LONG_MAX 2147483647UL #endif +#if GRUB_CPU_SIZEOF_VOID_P == 4 +#define UINT_TO_PTR(x) ((void*)(grub_uint32_t)(x)) +#define PTR_TO_UINT64(x) ((grub_uint64_t)(grub_uint32_t)(x)) +#define PTR_TO_UINT32(x) ((grub_uint32_t)(x)) +#else +#define UINT_TO_PTR(x) ((void*)(grub_uint64_t)(x)) +#define PTR_TO_UINT64(x) ((grub_uint64_t)(x)) +#define PTR_TO_UINT32(x) ((grub_uint32_t)(grub_uint64_t)(x)) +#endif + /* The type for representing a file offset. */ typedef grub_uint64_t grub_off_t; diff --git a/util/i386/pc/grub-install.in b/util/i386/pc/grub-install.in index ff1ed1e..d1d8a40 100644 --- a/util/i386/pc/grub-install.in +++ b/util/i386/pc/grub-install.in @@ -211,7 +211,7 @@ if test -n "$tmp"; then fi # Copy the GRUB images to the GRUB directory. -for file in ${grubdir}/*.mod ${grubdir}/*.lst ${grubdir}/*.img; do +for file in ${grubdir}/*.mod ${grubdir}/*.lst ${grubdir}/*.img ${grubdir}/efiemu??.o; do if test -f $file && [ "`basename $file`" != menu.lst ]; then rm -f $file || exit 1 fi @@ -220,7 +220,7 @@ for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst; do cp -f $file ${grubdir} || exit 1 done if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then - for file in ${pkglibdir}/*.img; do + for file in ${pkglibdir}/*.img ${grubdir}/efiemu??.o; do cp -f $file ${grubdir} || exit 1 done fi