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 <unistd.h>
00026 #include "hosthooks.h"
00027 #include "hosthooks-def.h"
00028
00029 #ifndef MAP_FAILED
00030 #define MAP_FAILED (void *)-1L
00031 #endif
00032
00033 static void *pa_gt_pch_get_address (size_t, int);
00034 static int pa_gt_pch_use_address (void *, size_t, int, size_t);
00035
00036 #undef HOST_HOOKS_GT_PCH_GET_ADDRESS
00037 #define HOST_HOOKS_GT_PCH_GET_ADDRESS pa_gt_pch_get_address
00038 #undef HOST_HOOKS_GT_PCH_USE_ADDRESS
00039 #define HOST_HOOKS_GT_PCH_USE_ADDRESS pa_gt_pch_use_address
00040
00041
00042
00043 #if defined(__hppa__) && defined(__LP64__)
00044 # define TRY_EMPTY_VM_SPACE 0x8000000000000000
00045 #elif defined(__hppa__)
00046 # define TRY_EMPTY_VM_SPACE 0x60000000
00047 #else
00048 # define TRY_EMPTY_VM_SPACE 0
00049 #endif
00050
00051
00052
00053
00054
00055 static void *
00056 pa_gt_pch_get_address (size_t size, int fd)
00057 {
00058 void *addr;
00059
00060 addr = mmap ((void *)TRY_EMPTY_VM_SPACE, size, PROT_READ | PROT_WRITE,
00061 MAP_PRIVATE, fd, 0);
00062
00063
00064 if (addr == (void *) MAP_FAILED)
00065 return NULL;
00066
00067 munmap (addr, size);
00068
00069 return addr;
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 static int
00088 pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
00089 {
00090 void *addr;
00091
00092
00093
00094
00095 if (size == 0)
00096 return -1;
00097
00098
00099 addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
00100
00101 if (addr == base)
00102 return 1;
00103
00104 if (addr != (void *) MAP_FAILED)
00105 munmap (addr, size);
00106
00107
00108 addr = mmap (base, size, PROT_READ | PROT_WRITE,
00109 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
00110
00111 if (addr != base)
00112 {
00113 if (addr != (void *) MAP_FAILED)
00114 munmap (addr, size);
00115 return -1;
00116 }
00117
00118 if (lseek (fd, offset, SEEK_SET) == (off_t)-1)
00119 return -1;
00120
00121 while (size)
00122 {
00123 ssize_t nbytes;
00124
00125 nbytes = read (fd, base, MIN (size, SSIZE_MAX));
00126 if (nbytes <= 0)
00127 return -1;
00128 base = (char *) base + nbytes;
00129 size -= nbytes;
00130 }
00131
00132 return 1;
00133 }
00134
00135
00136 const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;