[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
kern/efi/mm.c - MAX_USABLE_ADDRESS
From: |
Leif Lindholm |
Subject: |
kern/efi/mm.c - MAX_USABLE_ADDRESS |
Date: |
Mon, 9 Dec 2013 18:30:36 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Hi,
The EFI memory management code contains a hard-wired limit restricting
physical (and virtual, all 1:1 mapped in UEFI) addresses to 32-bit.
While this may be the right thing to do on x86, and hasn't caused me
any issues on 32-bit ARM, I have received reports of at least two
upcoming 64-bit ARM platforms with no RAM in the lower 4GB of physical
address space.
A simple fix would be to just stack the ifdefs, but a better one might
be to move the define to one of <cpu/efi/memory.h> (which is currently
a dummy for all platforms, simply including <efi/memory.h>) or types.h.
So, for something compile tested only on arm64:
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
index 6e9dace..5673d23 100644
--- a/grub-core/kern/efi/mm.c
+++ b/grub-core/kern/efi/mm.c
@@ -32,12 +32,6 @@
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
#define PAGES_TO_BYTES(pages) ((pages) << 12)
-#if defined (__code_model_large__) || !defined (__x86_64__)
-#define MAX_USABLE_ADDRESS 0xffffffff
-#else
-#define MAX_USABLE_ADDRESS 0x7fffffff
-#endif
-
/* The size of a memory map obtained from the firmware. This must be
a multiplier of 4KB. */
#define MEMORY_MAP_SIZE 0x3000
diff --git a/include/grub/arm/types.h b/include/grub/arm/types.h
index 4a806d0..612ea57 100644
--- a/include/grub/arm/types.h
+++ b/include/grub/arm/types.h
@@ -25,6 +25,8 @@
/* The size of long. */
#define GRUB_TARGET_SIZEOF_LONG 4
+#define MAX_USABLE_ADDRESS 0xffffffff
+
/* currently only support little-endian. */
#undef GRUB_TARGET_WORDS_BIGENDIAN
diff --git a/include/grub/arm64/types.h b/include/grub/arm64/types.h
index d132c5e..d52967d 100644
--- a/include/grub/arm64/types.h
+++ b/include/grub/arm64/types.h
@@ -25,6 +25,8 @@
/* The size of long. */
#define GRUB_TARGET_SIZEOF_LONG 8
+#define MAX_USABLE_ADDRESS 0xffffffffffffULL
+
/* currently only support little-endian. */
#undef GRUB_TARGET_WORDS_BIGENDIAN
diff --git a/include/grub/i386/types.h b/include/grub/i386/types.h
index c20063f..7fa7917 100644
--- a/include/grub/i386/types.h
+++ b/include/grub/i386/types.h
@@ -25,6 +25,12 @@
/* The size of long. */
#define GRUB_TARGET_SIZEOF_LONG 4
+#if defined (__code_model_large__)
+#define MAX_USABLE_ADDRESS 0xffffffff
+#else
+#define MAX_USABLE_ADDRESS 0x7fffffff
+#endif
+
/* i386 is little-endian. */
#undef GRUB_TARGET_WORDS_BIGENDIAN
diff --git a/include/grub/ia64/types.h b/include/grub/ia64/types.h
index 91a546d..8f13cf6 100644
--- a/include/grub/ia64/types.h
+++ b/include/grub/ia64/types.h
@@ -25,6 +25,8 @@
/* The size of long. */
#define GRUB_TARGET_SIZEOF_LONG 8
+#define MAX_USABLE_ADDRESS 0xffffffff
+
/* ia64 is little-endian (usually). */
#undef GRUB_TARGET_WORDS_BIGENDIAN
diff --git a/include/grub/x86_64/types.h b/include/grub/x86_64/types.h
index d53138e..baa31bb 100644
--- a/include/grub/x86_64/types.h
+++ b/include/grub/x86_64/types.h
@@ -25,6 +25,12 @@
/* The size of long. */
#define GRUB_TARGET_SIZEOF_LONG 8
+#if defined (__code_model_large__)
+#define MAX_USABLE_ADDRESS 0xffffffff
+#else
+#define MAX_USABLE_ADDRESS 0x7fffffff
+#endif
+
/* x86_64 is little-endian. */
#undef GRUB_TARGET_WORDS_BIGENDIAN
---
Would a cleaned-up patch of the same be acceptable?
/
Leif
- kern/efi/mm.c - MAX_USABLE_ADDRESS,
Leif Lindholm <=