hotspot/src/os_cpu/bsd_x86/vm/assembler_bsd_x86.cpp
changeset 34633 2a6c7c7b30a7
parent 14626 0cf4eccf130f
equal deleted inserted replaced
34632:bf3518bba285 34633:2a6c7c7b30a7
     1 /*
     1 /*
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "asm/macroAssembler.hpp"
    26 #include "asm/macroAssembler.hpp"
    27 #include "asm/macroAssembler.inline.hpp"
    27 #include "asm/macroAssembler.inline.hpp"
    28 #include "runtime/os.hpp"
    28 #include "runtime/os.hpp"
    29 #include "runtime/threadLocalStorage.hpp"
       
    30 
    29 
    31 #ifndef _LP64
       
    32 void MacroAssembler::int3() {
    30 void MacroAssembler::int3() {
    33   call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
    31   call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
    34 }
    32 }
    35 
       
    36 void MacroAssembler::get_thread(Register thread) {
       
    37   movl(thread, rsp);
       
    38   shrl(thread, PAGE_SHIFT);
       
    39 
       
    40   ExternalAddress tls_base((address)ThreadLocalStorage::sp_map_addr());
       
    41   Address index(noreg, thread, Address::times_4);
       
    42   ArrayAddress tls(tls_base, index);
       
    43 
       
    44   movptr(thread, tls);
       
    45 }
       
    46 #else
       
    47 void MacroAssembler::int3() {
       
    48   call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
       
    49 }
       
    50 
       
    51 void MacroAssembler::get_thread(Register thread) {
       
    52   // call pthread_getspecific
       
    53   // void * pthread_getspecific(pthread_key_t key);
       
    54    if (thread != rax) {
       
    55      push(rax);
       
    56    }
       
    57    push(rdi);
       
    58    push(rsi);
       
    59    push(rdx);
       
    60    push(rcx);
       
    61    push(r8);
       
    62    push(r9);
       
    63    push(r10);
       
    64    // XXX
       
    65    mov(r10, rsp);
       
    66    andq(rsp, -16);
       
    67    push(r10);
       
    68    push(r11);
       
    69 
       
    70    movl(rdi, ThreadLocalStorage::thread_index());
       
    71    call(RuntimeAddress(CAST_FROM_FN_PTR(address, pthread_getspecific)));
       
    72 
       
    73    pop(r11);
       
    74    pop(rsp);
       
    75    pop(r10);
       
    76    pop(r9);
       
    77    pop(r8);
       
    78    pop(rcx);
       
    79    pop(rdx);
       
    80    pop(rsi);
       
    81    pop(rdi);
       
    82    if (thread != rax) {
       
    83        mov(thread, rax);
       
    84        pop(rax);
       
    85    }
       
    86 }
       
    87 #endif