summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EdkUnixPkg/Sec/SecMain.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/EdkUnixPkg/Sec/SecMain.c b/EdkUnixPkg/Sec/SecMain.c
index b2234c4..32793f7 100644
--- a/EdkUnixPkg/Sec/SecMain.c
+++ b/EdkUnixPkg/Sec/SecMain.c
@@ -313,18 +313,28 @@ MapMemory (
INTN prot,
INTN flags)
{
- static UINTN base = 0x40000000;
- const UINTN align = (1 << 24);
- void *res;
-
- res = mmap ((void *)base, length, prot, flags, fd, 0);
- if (res == MAP_FAILED)
- return NULL;
-
- // Guard page.
- base += length + 4096;
- base = (base + align - 1) & ~(align - 1);
+ STATIC UINTN base = 0x40000000;
+ CONST UINTN align = (1 << 24);
+ VOID *res;
+ BOOLEAN isAligned = 0;
+ //
+ // Try to get an aligned block somewhere in the address space of this
+ // process.
+ //
+ while((!isAligned) && (base != 0)) {
+ res = mmap ((void *)base, length, prot, flags, fd, 0);
+ if (res == MAP_FAILED) {
+ return NULL;
+ }
+ if ((((UINTN)res) & ~(align-1)) == (UINTN)res) {
+ isAligned=1;
+ }
+ else {
+ munmap(res, length);
+ base += align;
+ }
+ }
return res;
}