Set up alloc of 32-bit-addressed gcchunks for win 64

This commit is contained in:
David Mandelin 2010-05-28 14:41:42 -07:00
parent 0c48e65da3
commit 0c6dd6c6e2
3 changed files with 52 additions and 0 deletions

View File

@ -911,6 +911,11 @@ struct JSGCLockHashEntry : public JSDHashEntryHdr
JSBool JSBool
js_InitGC(JSRuntime *rt, uint32 maxbytes) js_InitGC(JSRuntime *rt, uint32 maxbytes)
{ {
#if defined(XP_WIN) && defined(_M_X64)
if (!InitNtAllocAPIs())
return JS_FALSE;
#endif
InitGCArenaLists(rt); InitGCArenaLists(rt);
if (!rt->gcRootsHash.init(GC_ROOTS_SIZE)) if (!rt->gcRootsHash.init(GC_ROOTS_SIZE))
return false; return false;

View File

@ -140,6 +140,47 @@ UnmapPages(void *p, size_t size)
# else /* WINCE */ # else /* WINCE */
# ifdef _M_X64
typedef long (*ntavm_fun)(HANDLE handle, void **addr, ULONG zbits,
size_t *size, ULONG alloctype, ULONG prot);
typedef long (*ntfvm_fun)(HANDLE handle, void **addr, size_t *size,
ULONG freetype);
static ntavm_fun NtAllocateVirtualMemory;
static ntfvm_fun NtFreeVirtualMemory;
bool
js::InitNtAllocAPIs()
{
HMODULE h = GetModuleHandle("ntdll.dll");
if (!h)
return false;
NtAllocateVirtualMemory = ntavm_fun(GetProcAddress(h, "NtAllocateVirtualMemory"));
if (!NtAllocateVirtualMemory)
return false;
NtFreeVirtualMemory = ntfvm_fun(GetProcAddress(h, "NtFreeVirtualMemory"));
if (!NtFreeVirtualMemory)
return false;
}
// Allocate pages with 32-bit addresses (i.e., top 16 bits are all 0).
static void *
MapPages(void *addr, size_t size)
{
long rc = NtAllocateVirtualMemory(INVALID_HANDLE_VALUE, &addr, 1, &size,
MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
return rc ? NULL : addr;
}
static void
UnmapPages(void *addr, size_t size)
{
NtFreeVirtualMemory(INVALID_HANDLE_VALUE, &addr, &size, MEM_RELEASE);
}
# else /* _M_X64 */
static void * static void *
MapPages(void *addr, size_t size) MapPages(void *addr, size_t size)
{ {
@ -154,6 +195,8 @@ UnmapPages(void *addr, size_t size)
JS_ALWAYS_TRUE(VirtualFree(addr, 0, MEM_RELEASE)); JS_ALWAYS_TRUE(VirtualFree(addr, 0, MEM_RELEASE));
} }
# endif /* _M_X64 */
# endif /* !WINCE */ # endif /* !WINCE */
#elif defined(XP_MACOSX) || defined(DARWIN) #elif defined(XP_MACOSX) || defined(DARWIN)

View File

@ -55,6 +55,10 @@ const size_t GC_CHUNK_SHIFT = 20;
const size_t GC_CHUNK_SIZE = size_t(1) << GC_CHUNK_SHIFT; const size_t GC_CHUNK_SIZE = size_t(1) << GC_CHUNK_SHIFT;
const size_t GC_CHUNK_MASK = GC_CHUNK_SIZE - 1; const size_t GC_CHUNK_MASK = GC_CHUNK_SIZE - 1;
#if defined(XP_WIN) && defined(_M_X64)
bool InitNtAllocAPIs();
#endif
void * void *
AllocGCChunk(); AllocGCChunk();