Commit b990f4bc by John David Anglin Committed by John David Anglin

pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH file to anonymous private map.

	* pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH
	file to anonymous private map.

From-SVN: r92027
parent 3e5bcef3
2004-12-10 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH
file to anonymous private map.
2004-12-10 Roger Sayle <roger@eyesopen.com> 2004-12-10 Roger Sayle <roger@eyesopen.com>
PR target/18002 PR target/18002
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "system.h" #include "system.h"
#include "coretypes.h" #include "coretypes.h"
#include <sys/mman.h> #include <sys/mman.h>
#include <unistd.h>
#include "hosthooks.h" #include "hosthooks.h"
#include "hosthooks-def.h" #include "hosthooks-def.h"
...@@ -70,11 +71,11 @@ pa_gt_pch_get_address (size_t size, int fd) ...@@ -70,11 +71,11 @@ pa_gt_pch_get_address (size_t size, int fd)
It's not possibly to reliably mmap a file using MAP_PRIVATE to It's not possibly to reliably mmap a file using MAP_PRIVATE to
a specific START address on either hpux or linux. First we see a specific START address on either hpux or linux. First we see
if mmap with MAP_PRIVATE works. If it does, we are off to the if mmap with MAP_PRIVATE works. If it does, we are off to the
races. If it doesn't, we try an anonymous MAP_PRIVATE since the races. If it doesn't, we try an anonymous private mmap since the
kernel is more likely to honor the BASE address in anonymous maps. kernel is more likely to honor the BASE address in anonymous maps.
We then mmap the file to an arbitrary location and copy the data We then copy the data to the anonymous private map. This assumes
to the anonymous private map. This assumes of course that we of course that we don't need to change the data in the PCH file
don't need to change the PCH data after the file is created. after it is created.
This approach obviously causes a performance penalty but there is This approach obviously causes a performance penalty but there is
little else we can do given the current PCH implementation. */ little else we can do given the current PCH implementation. */
...@@ -82,7 +83,7 @@ pa_gt_pch_get_address (size_t size, int fd) ...@@ -82,7 +83,7 @@ pa_gt_pch_get_address (size_t size, int fd)
static int static int
pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset) pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{ {
void *addr, *faddr; void *addr;
/* We're called with size == 0 if we're not planning to load a PCH /* We're called with size == 0 if we're not planning to load a PCH
file at all. This allows the hook to free any static space that file at all. This allows the hook to free any static space that
...@@ -91,8 +92,7 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset) ...@@ -91,8 +92,7 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
return -1; return -1;
/* Try to map the file with MAP_PRIVATE. */ /* Try to map the file with MAP_PRIVATE. */
addr = mmap (base, size, PROT_READ | PROT_WRITE, addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
MAP_PRIVATE, fd, offset);
if (addr == base) if (addr == base)
return 1; return 1;
...@@ -100,20 +100,22 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset) ...@@ -100,20 +100,22 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
if (addr != (void *) MAP_FAILED) if (addr != (void *) MAP_FAILED)
munmap (addr, size); munmap (addr, size);
/* Try to make an anonymous private mmap at the desired location. */
addr = mmap (base, size, PROT_READ | PROT_WRITE, addr = mmap (base, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr != base) if (addr != base)
return -1; {
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
return -1;
}
faddr = mmap (NULL, size, PROT_READ, MAP_PRIVATE, if (lseek (fd, offset, SEEK_SET) == (off_t)-1)
fd, offset);
if (faddr == (void *) MAP_FAILED)
return -1; return -1;
memcpy (addr, faddr, size); if (read (fd, base, size) == -1)
munmap (faddr, size); return -1;
return 1; return 1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment