From 4b437dc09e6404175ae0250dc63b2ce41a9fcd4c Mon Sep 17 00:00:00 2001 From: jcoomes Date: Wed, 6 Jul 2011 12:22:29 -0700 Subject: [PATCH] 7061197: ThreadLocalStorage sp map table should be optional Reviewed-by: dholmes, never, jwilhelm, kvn --- .../linux_x86/vm/assembler_linux_x86.cpp | 23 +++++++++++++++++++ .../linux_x86/vm/threadLS_linux_x86.cpp | 21 +++++++++++------ .../linux_x86/vm/threadLS_linux_x86.hpp | 20 +++++++++------- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/os_cpu/linux_x86/vm/assembler_linux_x86.cpp b/src/os_cpu/linux_x86/vm/assembler_linux_x86.cpp index 5cd941075..12275f55d 100644 --- a/src/os_cpu/linux_x86/vm/assembler_linux_x86.cpp +++ b/src/os_cpu/linux_x86/vm/assembler_linux_x86.cpp @@ -33,6 +33,28 @@ void MacroAssembler::int3() { call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); } +#ifdef MINIMIZE_RAM_USAGE + +void MacroAssembler::get_thread(Register thread) { + // call pthread_getspecific + // void * pthread_getspecific(pthread_key_t key); + if (thread != rax) push(rax); + push(rcx); + push(rdx); + + push(ThreadLocalStorage::thread_index()); + call(RuntimeAddress(CAST_FROM_FN_PTR(address, pthread_getspecific))); + increment(rsp, wordSize); + + pop(rdx); + pop(rcx); + if (thread != rax) { + mov(thread, rax); + pop(rax); + } +} + +#else void MacroAssembler::get_thread(Register thread) { movl(thread, rsp); shrl(thread, PAGE_SHIFT); @@ -43,6 +65,7 @@ void MacroAssembler::get_thread(Register thread) { movptr(thread, tls); } +#endif // MINIMIZE_RAM_USAGE #else void MacroAssembler::int3() { call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); diff --git a/src/os_cpu/linux_x86/vm/threadLS_linux_x86.cpp b/src/os_cpu/linux_x86/vm/threadLS_linux_x86.cpp index 66340de7d..45fcea9e0 100644 --- a/src/os_cpu/linux_x86/vm/threadLS_linux_x86.cpp +++ b/src/os_cpu/linux_x86/vm/threadLS_linux_x86.cpp @@ -52,25 +52,20 @@ // MADV_DONTNEED on Linux keeps the virtual memory mapping, but zaps the // physical memory page (i.e. similar to MADV_FREE on Solaris). -#ifndef AMD64 +#if !defined(AMD64) && !defined(MINIMIZE_RAM_USAGE) Thread* ThreadLocalStorage::_sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)]; -#endif // !AMD64 void ThreadLocalStorage::generate_code_for_get_thread() { // nothing we can do here for user-level thread } void ThreadLocalStorage::pd_init() { -#ifndef AMD64 assert(align_size_down(os::vm_page_size(), PAGE_SIZE) == os::vm_page_size(), "page size must be multiple of PAGE_SIZE"); -#endif // !AMD64 } void ThreadLocalStorage::pd_set_thread(Thread* thread) { os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); - -#ifndef AMD64 address stack_top = os::current_stack_base(); size_t stack_size = os::current_stack_size(); @@ -88,5 +83,17 @@ void ThreadLocalStorage::pd_set_thread(Thread* thread) { "thread exited without detaching from VM??"); _sp_map[(uintptr_t)p >> PAGE_SHIFT] = thread; } -#endif // !AMD64 } +#else + +void ThreadLocalStorage::generate_code_for_get_thread() { + // nothing we can do here for user-level thread +} + +void ThreadLocalStorage::pd_init() { +} + +void ThreadLocalStorage::pd_set_thread(Thread* thread) { + os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); +} +#endif // !AMD64 && !MINIMIZE_RAM_USAGE diff --git a/src/os_cpu/linux_x86/vm/threadLS_linux_x86.hpp b/src/os_cpu/linux_x86/vm/threadLS_linux_x86.hpp index 55da9c0ca..f3f2f26f8 100644 --- a/src/os_cpu/linux_x86/vm/threadLS_linux_x86.hpp +++ b/src/os_cpu/linux_x86/vm/threadLS_linux_x86.hpp @@ -27,28 +27,32 @@ // Processor dependent parts of ThreadLocalStorage -#ifndef AMD64 +#if !defined(AMD64) && !defined(MINIMIZE_RAM_USAGE) + // map stack pointer to thread pointer - see notes in threadLS_linux_x86.cpp #define SP_BITLENGTH 32 #define PAGE_SHIFT 12 #define PAGE_SIZE (1UL << PAGE_SHIFT) static Thread* _sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)]; -#endif // !AMD64 public: -#ifndef AMD64 static Thread** sp_map_addr() { return _sp_map; } -#endif // !AMD64 static Thread* thread() { -#ifdef AMD64 - return (Thread*) os::thread_local_storage_at(thread_index()); -#else uintptr_t sp; __asm__ volatile ("movl %%esp, %0" : "=r" (sp)); return _sp_map[sp >> PAGE_SHIFT]; -#endif // AMD64 } +#else + +public: + + static Thread* thread() { + return (Thread*) os::thread_local_storage_at(thread_index()); + } + +#endif // AMD64 || MINIMIZE_RAM_USAGE + #endif // OS_CPU_LINUX_X86_VM_THREADLS_LINUX_X86_HPP -- GitLab