提交 4b437dc0 编写于 作者: J jcoomes

7061197: ThreadLocalStorage sp map table should be optional

Reviewed-by: dholmes, never, jwilhelm, kvn
上级 349d9164
...@@ -33,6 +33,28 @@ void MacroAssembler::int3() { ...@@ -33,6 +33,28 @@ void MacroAssembler::int3() {
call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); 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) { void MacroAssembler::get_thread(Register thread) {
movl(thread, rsp); movl(thread, rsp);
shrl(thread, PAGE_SHIFT); shrl(thread, PAGE_SHIFT);
...@@ -43,6 +65,7 @@ void MacroAssembler::get_thread(Register thread) { ...@@ -43,6 +65,7 @@ void MacroAssembler::get_thread(Register thread) {
movptr(thread, tls); movptr(thread, tls);
} }
#endif // MINIMIZE_RAM_USAGE
#else #else
void MacroAssembler::int3() { void MacroAssembler::int3() {
call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
......
...@@ -52,25 +52,20 @@ ...@@ -52,25 +52,20 @@
// MADV_DONTNEED on Linux keeps the virtual memory mapping, but zaps the // MADV_DONTNEED on Linux keeps the virtual memory mapping, but zaps the
// physical memory page (i.e. similar to MADV_FREE on Solaris). // 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)]; Thread* ThreadLocalStorage::_sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)];
#endif // !AMD64
void ThreadLocalStorage::generate_code_for_get_thread() { void ThreadLocalStorage::generate_code_for_get_thread() {
// nothing we can do here for user-level thread // nothing we can do here for user-level thread
} }
void ThreadLocalStorage::pd_init() { void ThreadLocalStorage::pd_init() {
#ifndef AMD64
assert(align_size_down(os::vm_page_size(), PAGE_SIZE) == os::vm_page_size(), assert(align_size_down(os::vm_page_size(), PAGE_SIZE) == os::vm_page_size(),
"page size must be multiple of PAGE_SIZE"); "page size must be multiple of PAGE_SIZE");
#endif // !AMD64
} }
void ThreadLocalStorage::pd_set_thread(Thread* thread) { void ThreadLocalStorage::pd_set_thread(Thread* thread) {
os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread);
#ifndef AMD64
address stack_top = os::current_stack_base(); address stack_top = os::current_stack_base();
size_t stack_size = os::current_stack_size(); size_t stack_size = os::current_stack_size();
...@@ -88,5 +83,17 @@ void ThreadLocalStorage::pd_set_thread(Thread* thread) { ...@@ -88,5 +83,17 @@ void ThreadLocalStorage::pd_set_thread(Thread* thread) {
"thread exited without detaching from VM??"); "thread exited without detaching from VM??");
_sp_map[(uintptr_t)p >> PAGE_SHIFT] = thread; _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
...@@ -27,28 +27,32 @@ ...@@ -27,28 +27,32 @@
// Processor dependent parts of ThreadLocalStorage // 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 // map stack pointer to thread pointer - see notes in threadLS_linux_x86.cpp
#define SP_BITLENGTH 32 #define SP_BITLENGTH 32
#define PAGE_SHIFT 12 #define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_SIZE (1UL << PAGE_SHIFT)
static Thread* _sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)]; static Thread* _sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)];
#endif // !AMD64
public: public:
#ifndef AMD64
static Thread** sp_map_addr() { return _sp_map; } static Thread** sp_map_addr() { return _sp_map; }
#endif // !AMD64
static Thread* thread() { static Thread* thread() {
#ifdef AMD64
return (Thread*) os::thread_local_storage_at(thread_index());
#else
uintptr_t sp; uintptr_t sp;
__asm__ volatile ("movl %%esp, %0" : "=r" (sp)); __asm__ volatile ("movl %%esp, %0" : "=r" (sp));
return _sp_map[sp >> PAGE_SHIFT]; 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 #endif // OS_CPU_LINUX_X86_VM_THREADLS_LINUX_X86_HPP
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册