src/os_cpu/bsd_x86/vm/assembler_bsd_x86.cpp

Fri, 08 Feb 2013 12:48:24 +0100

author
sla
date
Fri, 08 Feb 2013 12:48:24 +0100
changeset 4564
758935f7c23f
parent 4318
cd3d6a6b95d9
child 6876
710a3c8b516e
permissions
-rw-r--r--

8006423: SA: NullPointerException in sun.jvm.hotspot.debugger.bsd.BsdThread.getContext(BsdThread.java:67)
Summary: Do not rely on mach thread port names to identify threads from SA
Reviewed-by: dholmes, minqi, rbackman

     1 /*
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "asm/macroAssembler.hpp"
    27 #include "asm/macroAssembler.inline.hpp"
    28 #include "runtime/os.hpp"
    29 #include "runtime/threadLocalStorage.hpp"
    31 #ifndef _LP64
    32 void MacroAssembler::int3() {
    33   call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
    34 }
    36 void MacroAssembler::get_thread(Register thread) {
    37   movl(thread, rsp);
    38   shrl(thread, PAGE_SHIFT);
    40   ExternalAddress tls_base((address)ThreadLocalStorage::sp_map_addr());
    41   Address index(noreg, thread, Address::times_4);
    42   ArrayAddress tls(tls_base, index);
    44   movptr(thread, tls);
    45 }
    46 #else
    47 void MacroAssembler::int3() {
    48   call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
    49 }
    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);
    70    movl(rdi, ThreadLocalStorage::thread_index());
    71    call(RuntimeAddress(CAST_FROM_FN_PTR(address, pthread_getspecific)));
    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

mercurial