diff options
author | Mike Pall <mike> | 2011-05-16 02:29:44 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-05-16 02:29:44 +0200 |
commit | be73a96751261bb3a424aa1c5d28547f23037733 (patch) | |
tree | 4baa8353f73592a5b5cf034666fd19a7a96f74a5 | |
parent | 58f38c254bcdcf1f874f2e052751f568c2866133 (diff) | |
download | luajit-be73a96751261bb3a424aa1c5d28547f23037733.tar.gz luajit-be73a96751261bb3a424aa1c5d28547f23037733.tar.bz2 luajit-be73a96751261bb3a424aa1c5d28547f23037733.zip |
ARM: Generalize machine code co-location. ARM has a +-32MB range.
-rw-r--r-- | src/lj_mcode.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/lj_mcode.c b/src/lj_mcode.c index b3ce1f7f..8d0f7213 100644 --- a/src/lj_mcode.c +++ b/src/lj_mcode.c | |||
@@ -156,23 +156,43 @@ static void mcode_protect(jit_State *J, int prot) | |||
156 | 156 | ||
157 | /* -- MCode area allocation ----------------------------------------------- */ | 157 | /* -- MCode area allocation ----------------------------------------------- */ |
158 | 158 | ||
159 | #if LJ_64 | 159 | #if LJ_TARGET_X64 |
160 | #define mcode_validptr(p) ((p) && (uintptr_t)(p) < (uintptr_t)1<<47) | ||
161 | #else | ||
162 | #define mcode_validptr(p) ((p) && (uintptr_t)(p) < 0xffff0000) | ||
163 | #endif | ||
164 | |||
165 | #if LJ_TARGET_X64 | ||
166 | #define MCODE_JUMPRANGE 31 | ||
167 | #elif LJ_TARGET_ARM | ||
168 | #define MCODE_JUMPRANGE 26 | ||
169 | #else | ||
170 | #define MCODE_JUMPRANGE 32 | ||
171 | #endif | ||
172 | |||
173 | #if MCODE_JUMPRANGE == 32 | ||
174 | |||
175 | /* All 32 bit memory addresses are reachable by relative jumps. */ | ||
176 | #define mcode_alloc(J, sz) mcode_alloc_at((J), 0, (sz), MCPROT_GEN) | ||
177 | |||
178 | #else | ||
160 | 179 | ||
161 | /* Get memory within relative jump distance of our code in 64 bit mode. */ | 180 | /* Get memory within relative jump distance of our code in 64 bit mode. */ |
162 | static void *mcode_alloc(jit_State *J, size_t sz) | 181 | static void *mcode_alloc(jit_State *J, size_t sz) |
163 | { | 182 | { |
164 | /* Target an address in the static assembler code (64K aligned). | 183 | /* Target an address in the static assembler code (64K aligned). |
165 | ** Try addresses within a distance of target-1GB+1MB .. target+1GB-1MB. | 184 | ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB. |
166 | */ | 185 | */ |
167 | uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff; | 186 | uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff; |
168 | const uintptr_t range = (1u<<31) - (1u << 21); | 187 | const uintptr_t range = (1u << MCODE_JUMPRANGE) - (1u << 21); |
169 | /* First try a contiguous area below the last one. */ | 188 | /* First try a contiguous area below the last one. */ |
170 | uintptr_t hint = (uintptr_t)J->mcarea - sz; | 189 | uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0; |
171 | int i; | 190 | int i; |
172 | for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */ | 191 | for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */ |
173 | if (hint && hint < (uintptr_t)1<<47) { | 192 | if (mcode_validptr(hint)) { |
174 | void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN); | 193 | void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN); |
175 | if (p && (uintptr_t)p < (uintptr_t)1<<47) { | 194 | |
195 | if (mcode_validptr(p)) { | ||
176 | if ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range) | 196 | if ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range) |
177 | return p; | 197 | return p; |
178 | mcode_free(J, p, sz); /* Free badly placed area. */ | 198 | mcode_free(J, p, sz); /* Free badly placed area. */ |
@@ -188,11 +208,6 @@ static void *mcode_alloc(jit_State *J, size_t sz) | |||
188 | return NULL; | 208 | return NULL; |
189 | } | 209 | } |
190 | 210 | ||
191 | #else | ||
192 | |||
193 | /* All 32 bit memory addresses are reachable by relative jumps on x86. */ | ||
194 | #define mcode_alloc(J, sz) mcode_alloc_at((J), 0, (sz), MCPROT_GEN) | ||
195 | |||
196 | #endif | 211 | #endif |
197 | 212 | ||
198 | /* -- MCode area management ----------------------------------------------- */ | 213 | /* -- MCode area management ----------------------------------------------- */ |