00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include <sys/mman.h>
00025 #include "hosthooks.h"
00026 #include "hosthooks-def.h"
00027
00028
00029 #undef HOST_HOOKS_GT_PCH_USE_ADDRESS
00030 #define HOST_HOOKS_GT_PCH_USE_ADDRESS sol_gt_pch_use_address
00031
00032
00033
00034
00035 static int
00036 sol_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
00037 {
00038 void *addr;
00039
00040
00041
00042
00043 if (size == 0)
00044 return -1;
00045
00046 addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
00047 fd, offset);
00048
00049
00050
00051
00052 if (addr != base)
00053 {
00054 size_t page_size = getpagesize();
00055 char one_byte;
00056 size_t i;
00057
00058 if (addr != (void *) MAP_FAILED)
00059 munmap (addr, size);
00060
00061 errno = 0;
00062 for (i = 0; i < size; i += page_size)
00063 if (mincore ((char *)base + i, page_size, (void *)&one_byte) == -1
00064 && errno == ENOMEM)
00065 continue;
00066 else
00067 break;
00068
00069 if (i >= size)
00070 addr = mmap (base, size,
00071 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
00072 fd, offset);
00073 }
00074
00075 return addr == base ? 1 : -1;
00076 }
00077
00078
00079 const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;