From: bbahnsen Date: Sun, 7 Jan 2007 19:09:33 +0000 (+0000) Subject: Always return an aligned block when mapping memory. X-Git-Tag: edk2-stable201903~23692 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=6bb60d710b3e041221582400390eca5977cd9aca;ds=sidebyside Always return an aligned block when mapping memory. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2185 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/EdkUnixPkg/Sec/SecMain.c b/EdkUnixPkg/Sec/SecMain.c index b2234c49a9..32793f7c64 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; }