Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 471622 | Differences between
and this patch

Collapse All | Expand All

(-)a/js/src/jsgcchunk.cpp (+33 lines)
Lines 236-260 MapAlignedPages(size_t size, size_t alig Link Here
236
    return p;
236
    return p;
237
}
237
}
238
238
239
# else /* JS_GC_HAS_MAP_ALIGN */
239
# else /* JS_GC_HAS_MAP_ALIGN */
240
240
241
static void *
241
static void *
242
MapPages(void *addr, size_t size)
242
MapPages(void *addr, size_t size)
243
{
243
{
244
#if defined(__ia64__)
245
    /*
246
     * The JS engine assumes that all allocated pointers have their high 17 bits clear,
247
     * which ia64's mmap doesn't support directly. However, we can emulate it by passing
248
     * mmap an "addr" parameter with those bits clear. The mmap will return that address,
249
     * or the nearest available memory above that address, providing a near-guarantee
250
     * that those bits are clear. If they are not, we return NULL below to indicate
251
     * out-of-memory.
252
     * 
253
     * The addr is chosen as 0x0000070000000000, which still allows about 120TB of virtual 
254
     * address space.
255
     * 
256
     * See Bug 589735 for more information.
257
     */
258
#endif
259
244
    /*
260
    /*
245
     * We don't use MAP_FIXED here, because it can cause the *replacement*
261
     * We don't use MAP_FIXED here, because it can cause the *replacement*
246
     * of existing mappings, and we only want to create new mappings.
262
     * of existing mappings, and we only want to create new mappings.
247
     */
263
     */
264
#if defined(__ia64__)
265
    void *p = mmap(addr ? addr : (void*)0x0000070000000000,
266
                   size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
267
                   -1, 0);
268
#else
248
    void *p = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
269
    void *p = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
249
                   -1, 0);
270
                   -1, 0);
271
#endif
250
    if (p == MAP_FAILED)
272
    if (p == MAP_FAILED)
251
        return NULL;
273
        return NULL;
274
#if defined(__ia64__)
275
    /* 
276
     * If the caller requested a specific memory location, verify that's what mmap returned.
277
     * Otherwise: If the allocated memory doesn't have its upper 17 bits clear, consider it 
278
     * as out of memory.
279
     */
280
    if (addr && p != addr
281
        || !addr && ((long long)p & 0xffff800000000000)) {
282
#else
283
    /* If the caller requested a specific memory location, verify that's what mmap returned. */
252
    if (addr && p != addr) {
284
    if (addr && p != addr) {
285
#endif
253
        /* We succeeded in mapping memory, but not in the right place. */
286
        /* We succeeded in mapping memory, but not in the right place. */
254
        JS_ALWAYS_TRUE(munmap(p, size) == 0);
287
        JS_ALWAYS_TRUE(munmap(p, size) == 0);
255
        return NULL;
288
        return NULL;
256
    }
289
    }
257
    return p;
290
    return p;
258
}
291
}
259
292
260
# endif /* !JS_GC_HAS_MAP_ALIGN */
293
# endif /* !JS_GC_HAS_MAP_ALIGN */

Return to bug 471622