grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Efiemu


From: phcoder
Subject: Re: Efiemu
Date: Fri, 20 Mar 2009 20:32:56 +0100
User-agent: Thunderbird 2.0.0.21 (X11/20090318)

update on patch
phcoder wrote:
Bean wrote:

First, I notice some novel use of macro. For example, use GRUB_EFI to
wrap around efi calls, which expands to different prefix in different
environment. I'm not a big fan of macro, and this seems a little
weird.
It can't be done without at least some macros because it's able to load 64-bit efiemu from 32-bit mode and vice-versa. But GRUB_EFI can be replaced to a set of grub_autoefi_* aliases


Also, perhaps you should just avoid linux_efiemu altogether. The efi
linux loader contains some tricks that mostly make sense in apple efi
firmware, and it might cause hazard in bios environment. Besides, if
it's just for testing purpose, linux is not a very good efi citizen,
it doesn't even have a efi loader of its own.

I agree that for now this part of patch should probably be left out. At least until we merge all i386/*/linux.c to i386/linux.c by using Vesa's memory manager and video functions. However efiemu can help linux to get decent efi support in future.



--

Regards
Vladimir 'phcoder' Serbinenko
diff --git a/ChangeLog b/ChangeLog
index 12da2c9..e3ac3ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,53 @@
 2009-03-15  Vladimir Serbinenko  <address@hidden>
+ 
+       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  <address@hidden>
 
        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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]