annotate src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp @ 4680:acf7d88327fa

Fixed two asserts in the implicit div exception handling for Windows that are not valid for Graal (as it deoptimizes to some place before the div instead of exactly to the div bytecode).
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 23 Feb 2012 23:06:28 +0100
parents 436b4a3231bf
children 5e9fba4e8718
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
2 * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * questions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
23 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
24
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
25 // no precompiled headers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
26 #include "assembler_x86.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 #include "classfile/classLoader.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28 #include "classfile/systemDictionary.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 #include "classfile/vmSymbols.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30 #include "code/icBuffer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 #include "code/vtableStubs.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 #include "interpreter/interpreter.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 #include "jvm_bsd.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 #include "memory/allocation.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 #include "mutex_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 #include "nativeInst_x86.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 #include "os_share_bsd.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 #include "prims/jniFastGetField.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 #include "prims/jvm.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 #include "prims/jvm_misc.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 #include "runtime/arguments.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 #include "runtime/extendedPC.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 #include "runtime/frame.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 #include "runtime/interfaceSupport.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 #include "runtime/java.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 #include "runtime/javaCalls.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 #include "runtime/mutexLocker.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 #include "runtime/osThread.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 #include "runtime/sharedRuntime.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 #include "runtime/stubRoutines.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 #include "runtime/timer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 #include "thread_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 #include "utilities/events.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 #include "utilities/vmError.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 #ifdef COMPILER1
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 #include "c1/c1_Runtime1.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
57 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 #ifdef COMPILER2
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 #include "opto/runtime.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 // put OS-includes here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 # include <sys/types.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 # include <sys/mman.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 # include <pthread.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66 # include <signal.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 # include <errno.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 # include <dlfcn.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
69 # include <stdlib.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 # include <stdio.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71 # include <unistd.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 # include <sys/resource.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 # include <pthread.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 # include <sys/stat.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 # include <sys/time.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 # include <sys/utsname.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 # include <sys/socket.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 # include <sys/wait.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 # include <pwd.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 # include <poll.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 #ifndef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 # include <ucontext.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 #if defined(_ALLBSD_SOURCE) && !defined(__APPLE__) && !defined(__NetBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86 # include <pthread_np.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 #define SPELL_REG_SP "rsp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 #define SPELL_REG_FP "rbp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 #define SPELL_REG_SP "esp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 #define SPELL_REG_FP "ebp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 #ifdef __FreeBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 # define context_trapno uc_mcontext.mc_trapno
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 # ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100 # define context_pc uc_mcontext.mc_rip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
101 # define context_sp uc_mcontext.mc_rsp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102 # define context_fp uc_mcontext.mc_rbp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 # define context_rip uc_mcontext.mc_rip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104 # define context_rsp uc_mcontext.mc_rsp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 # define context_rbp uc_mcontext.mc_rbp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 # define context_rax uc_mcontext.mc_rax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
107 # define context_rbx uc_mcontext.mc_rbx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 # define context_rcx uc_mcontext.mc_rcx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109 # define context_rdx uc_mcontext.mc_rdx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 # define context_rsi uc_mcontext.mc_rsi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 # define context_rdi uc_mcontext.mc_rdi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 # define context_r8 uc_mcontext.mc_r8
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113 # define context_r9 uc_mcontext.mc_r9
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
114 # define context_r10 uc_mcontext.mc_r10
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115 # define context_r11 uc_mcontext.mc_r11
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116 # define context_r12 uc_mcontext.mc_r12
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117 # define context_r13 uc_mcontext.mc_r13
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118 # define context_r14 uc_mcontext.mc_r14
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
119 # define context_r15 uc_mcontext.mc_r15
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 # define context_flags uc_mcontext.mc_flags
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121 # define context_err uc_mcontext.mc_err
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 # define context_pc uc_mcontext.mc_eip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 # define context_sp uc_mcontext.mc_esp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 # define context_fp uc_mcontext.mc_ebp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 # define context_eip uc_mcontext.mc_eip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 # define context_esp uc_mcontext.mc_esp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128 # define context_eax uc_mcontext.mc_eax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 # define context_ebx uc_mcontext.mc_ebx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130 # define context_ecx uc_mcontext.mc_ecx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 # define context_edx uc_mcontext.mc_edx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132 # define context_ebp uc_mcontext.mc_ebp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133 # define context_esi uc_mcontext.mc_esi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 # define context_edi uc_mcontext.mc_edi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 # define context_eflags uc_mcontext.mc_eflags
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 # define context_trapno uc_mcontext.mc_trapno
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 # if __DARWIN_UNIX03 && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 // 10.5 UNIX03 member name prefixes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 #define DU3_PREFIX(s, m) __ ## s.__ ## m
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145 #define DU3_PREFIX(s, m) s ## . ## m
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 # ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 # define context_pc context_rip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150 # define context_sp context_rsp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 # define context_fp context_rbp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 # define context_rip uc_mcontext->DU3_PREFIX(ss,rip)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 # define context_rsp uc_mcontext->DU3_PREFIX(ss,rsp)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154 # define context_rax uc_mcontext->DU3_PREFIX(ss,rax)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155 # define context_rbx uc_mcontext->DU3_PREFIX(ss,rbx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 # define context_rcx uc_mcontext->DU3_PREFIX(ss,rcx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 # define context_rdx uc_mcontext->DU3_PREFIX(ss,rdx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 # define context_rbp uc_mcontext->DU3_PREFIX(ss,rbp)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 # define context_rsi uc_mcontext->DU3_PREFIX(ss,rsi)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 # define context_rdi uc_mcontext->DU3_PREFIX(ss,rdi)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 # define context_r8 uc_mcontext->DU3_PREFIX(ss,r8)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 # define context_r9 uc_mcontext->DU3_PREFIX(ss,r9)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 # define context_r10 uc_mcontext->DU3_PREFIX(ss,r10)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164 # define context_r11 uc_mcontext->DU3_PREFIX(ss,r11)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 # define context_r12 uc_mcontext->DU3_PREFIX(ss,r12)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 # define context_r13 uc_mcontext->DU3_PREFIX(ss,r13)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167 # define context_r14 uc_mcontext->DU3_PREFIX(ss,r14)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168 # define context_r15 uc_mcontext->DU3_PREFIX(ss,r15)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 # define context_flags uc_mcontext->DU3_PREFIX(ss,rflags)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
170 # define context_trapno uc_mcontext->DU3_PREFIX(es,trapno)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171 # define context_err uc_mcontext->DU3_PREFIX(es,err)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 # define context_pc context_eip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 # define context_sp context_esp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 # define context_fp context_ebp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 # define context_eip uc_mcontext->DU3_PREFIX(ss,eip)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177 # define context_esp uc_mcontext->DU3_PREFIX(ss,esp)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 # define context_eax uc_mcontext->DU3_PREFIX(ss,eax)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 # define context_ebx uc_mcontext->DU3_PREFIX(ss,ebx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 # define context_ecx uc_mcontext->DU3_PREFIX(ss,ecx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181 # define context_edx uc_mcontext->DU3_PREFIX(ss,edx)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182 # define context_ebp uc_mcontext->DU3_PREFIX(ss,ebp)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 # define context_esi uc_mcontext->DU3_PREFIX(ss,esi)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 # define context_edi uc_mcontext->DU3_PREFIX(ss,edi)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185 # define context_eflags uc_mcontext->DU3_PREFIX(ss,eflags)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 # define context_trapno uc_mcontext->DU3_PREFIX(es,trapno)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 #ifdef __OpenBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 # define context_trapno sc_trapno
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 # ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 # define context_pc sc_rip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194 # define context_sp sc_rsp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195 # define context_fp sc_rbp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196 # define context_rip sc_rip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 # define context_rsp sc_rsp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 # define context_rbp sc_rbp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 # define context_rax sc_rax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 # define context_rbx sc_rbx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 # define context_rcx sc_rcx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 # define context_rdx sc_rdx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 # define context_rsi sc_rsi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204 # define context_rdi sc_rdi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 # define context_r8 sc_r8
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 # define context_r9 sc_r9
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 # define context_r10 sc_r10
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 # define context_r11 sc_r11
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
209 # define context_r12 sc_r12
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 # define context_r13 sc_r13
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 # define context_r14 sc_r14
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 # define context_r15 sc_r15
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 # define context_flags sc_rflags
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 # define context_err sc_err
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216 # define context_pc sc_eip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 # define context_sp sc_esp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218 # define context_fp sc_ebp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219 # define context_eip sc_eip
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
220 # define context_esp sc_esp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
221 # define context_eax sc_eax
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
222 # define context_ebx sc_ebx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
223 # define context_ecx sc_ecx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
224 # define context_edx sc_edx
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
225 # define context_ebp sc_ebp
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226 # define context_esi sc_esi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227 # define context_edi sc_edi
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 # define context_eflags sc_eflags
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229 # define context_trapno sc_trapno
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233 #ifdef __NetBSD__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 # define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 # ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 # define __register_t __greg_t
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 # define context_pc uc_mcontext.__gregs[_REG_RIP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 # define context_sp uc_mcontext.__gregs[_REG_URSP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 # define context_fp uc_mcontext.__gregs[_REG_RBP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240 # define context_rip uc_mcontext.__gregs[_REG_RIP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
241 # define context_rsp uc_mcontext.__gregs[_REG_URSP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
242 # define context_rax uc_mcontext.__gregs[_REG_RAX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
243 # define context_rbx uc_mcontext.__gregs[_REG_RBX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244 # define context_rcx uc_mcontext.__gregs[_REG_RCX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
245 # define context_rdx uc_mcontext.__gregs[_REG_RDX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246 # define context_rbp uc_mcontext.__gregs[_REG_RBP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
247 # define context_rsi uc_mcontext.__gregs[_REG_RSI]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 # define context_rdi uc_mcontext.__gregs[_REG_RDI]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249 # define context_r8 uc_mcontext.__gregs[_REG_R8]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 # define context_r9 uc_mcontext.__gregs[_REG_R9]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 # define context_r10 uc_mcontext.__gregs[_REG_R10]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 # define context_r11 uc_mcontext.__gregs[_REG_R11]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
253 # define context_r12 uc_mcontext.__gregs[_REG_R12]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254 # define context_r13 uc_mcontext.__gregs[_REG_R13]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
255 # define context_r14 uc_mcontext.__gregs[_REG_R14]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 # define context_r15 uc_mcontext.__gregs[_REG_R15]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 # define context_flags uc_mcontext.__gregs[_REG_RFL]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258 # define context_err uc_mcontext.__gregs[_REG_ERR]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 # define context_pc uc_mcontext.__gregs[_REG_EIP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261 # define context_sp uc_mcontext.__gregs[_REG_UESP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 # define context_fp uc_mcontext.__gregs[_REG_EBP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263 # define context_eip uc_mcontext.__gregs[_REG_EIP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 # define context_esp uc_mcontext.__gregs[_REG_UESP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 # define context_eax uc_mcontext.__gregs[_REG_EAX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 # define context_ebx uc_mcontext.__gregs[_REG_EBX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267 # define context_ecx uc_mcontext.__gregs[_REG_ECX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 # define context_edx uc_mcontext.__gregs[_REG_EDX]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 # define context_ebp uc_mcontext.__gregs[_REG_EBP]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270 # define context_esi uc_mcontext.__gregs[_REG_ESI]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
271 # define context_edi uc_mcontext.__gregs[_REG_EDI]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
272 # define context_eflags uc_mcontext.__gregs[_REG_EFL]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
273 # define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
274 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
275 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
276
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
277 address os::current_stack_pointer() {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
278 #if defined(__clang__) || defined(__llvm__)
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
279 register void *esp;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
280 __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
281 return (address) esp;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
282 #elif defined(SPARC_WORKS)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
283 register void *esp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
284 __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285 return (address) ((char*)esp + sizeof(long)*2);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287 register void *esp __asm__ (SPELL_REG_SP);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288 return (address) esp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
290 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
291
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
292 char* os::non_memory_address_word() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
293 // Must never look like an address returned by reserve_memory,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 // even in its subfields (as defined by the CPU immediate fields,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
295 // if the CPU splits constants across multiple instructions).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
296
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 return (char*) -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300 void os::initialize_thread() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 // Nothing to do.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 address os::Bsd::ucontext_get_pc(ucontext_t * uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
305 return (address)uc->context_pc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
306 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
307
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
308 intptr_t* os::Bsd::ucontext_get_sp(ucontext_t * uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309 return (intptr_t*)uc->context_sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
311
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
312 intptr_t* os::Bsd::ucontext_get_fp(ucontext_t * uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313 return (intptr_t*)uc->context_fp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
315
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
316 // For Forte Analyzer AsyncGetCallTrace profiling support - thread
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
317 // is currently interrupted by SIGPROF.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318 // os::Solaris::fetch_frame_from_ucontext() tries to skip nested signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319 // frames. Currently we don't do that on Bsd, so it's the same as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 // os::fetch_frame_from_context().
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321 ExtendedPC os::Bsd::fetch_frame_from_ucontext(Thread* thread,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322 ucontext_t* uc, intptr_t** ret_sp, intptr_t** ret_fp) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
323
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
324 assert(thread != NULL, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
325 assert(ret_sp != NULL, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
326 assert(ret_fp != NULL, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
327
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
328 return os::fetch_frame_from_context(uc, ret_sp, ret_fp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
329 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
330
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
331 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
332 intptr_t** ret_sp, intptr_t** ret_fp) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
333
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
334 ExtendedPC epc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
335 ucontext_t* uc = (ucontext_t*)ucVoid;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
336
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
337 if (uc != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
338 epc = ExtendedPC(os::Bsd::ucontext_get_pc(uc));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
339 if (ret_sp) *ret_sp = os::Bsd::ucontext_get_sp(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
340 if (ret_fp) *ret_fp = os::Bsd::ucontext_get_fp(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
341 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
342 // construct empty ExtendedPC for return value checking
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
343 epc = ExtendedPC(NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
344 if (ret_sp) *ret_sp = (intptr_t *)NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
345 if (ret_fp) *ret_fp = (intptr_t *)NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
346 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
347
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
348 return epc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
349 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
350
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
351 frame os::fetch_frame_from_context(void* ucVoid) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
352 intptr_t* sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
353 intptr_t* fp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
354 ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
355 return frame(sp, fp, epc.pc());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
356 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
357
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
358 // By default, gcc always save frame pointer (%ebp/%rbp) on stack. It may get
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
359 // turned off by -fomit-frame-pointer,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
360 frame os::get_sender_for_C_frame(frame* fr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
361 return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
362 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
363
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
364 intptr_t* _get_previous_fp() {
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
365 #if defined(SPARC_WORKS) || defined(__clang__)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
366 register intptr_t **ebp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
367 __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
368 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
369 register intptr_t **ebp __asm__ (SPELL_REG_FP);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
370 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
371 return (intptr_t*) *ebp; // we want what it points to.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
372 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
373
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
374
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
375 frame os::current_frame() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
376 intptr_t* fp = _get_previous_fp();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
377 frame myframe((intptr_t*)os::current_stack_pointer(),
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
378 (intptr_t*)fp,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
379 CAST_FROM_FN_PTR(address, os::current_frame));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
380 if (os::is_first_C_frame(&myframe)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
381 // stack is not walkable
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
382 return frame(NULL, NULL, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
383 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
384 return os::get_sender_for_C_frame(&myframe);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
385 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
386 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
387
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
388 // Utility functions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
389
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
390 // From IA32 System Programming Guide
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
391 enum {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
392 trap_page_fault = 0xE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
393 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
394
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
395 extern "C" void Fetch32PFI () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
396 extern "C" void Fetch32Resume () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
397 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
398 extern "C" void FetchNPFI () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
399 extern "C" void FetchNResume () ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
400 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
401
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
402 extern "C" JNIEXPORT int
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
403 JVM_handle_bsd_signal(int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
404 siginfo_t* info,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
405 void* ucVoid,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
406 int abort_if_unrecognized) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
407 ucontext_t* uc = (ucontext_t*) ucVoid;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
408
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
409 Thread* t = ThreadLocalStorage::get_thread_slow();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
410
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
411 SignalHandlerMark shm(t);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
412
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
413 // Note: it's not uncommon that JNI code uses signal/sigset to install
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
414 // then restore certain signal handler (e.g. to temporarily block SIGPIPE,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
415 // or have a SIGILL handler when detecting CPU type). When that happens,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
416 // JVM_handle_bsd_signal() might be invoked with junk info/ucVoid. To
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
417 // avoid unnecessary crash when libjsig is not preloaded, try handle signals
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
418 // that do not require siginfo/ucontext first.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
419
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
420 if (sig == SIGPIPE || sig == SIGXFSZ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
421 // allow chained handler to go first
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
422 if (os::Bsd::chained_handler(sig, info, ucVoid)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
423 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
424 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
425 if (PrintMiscellaneous && (WizardMode || Verbose)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
426 char buf[64];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
427 warning("Ignoring %s - see bugs 4229104 or 646499219",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
428 os::exception_name(sig, buf, sizeof(buf)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
429 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
430 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
431 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
432 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
433
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
434 JavaThread* thread = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
435 VMThread* vmthread = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
436 if (os::Bsd::signal_handlers_are_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
437 if (t != NULL ){
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
438 if(t->is_Java_thread()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
439 thread = (JavaThread*)t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
440 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
441 else if(t->is_VM_thread()){
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
442 vmthread = (VMThread *)t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
443 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
444 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
445 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
446 /*
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
447 NOTE: does not seem to work on bsd.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
448 if (info == NULL || info->si_code <= 0 || info->si_code == SI_NOINFO) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
449 // can't decode this kind of signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
450 info = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
451 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
452 assert(sig == info->si_signo, "bad siginfo");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
453 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
454 */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
455 // decide if this trap can be handled by a stub
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
456 address stub = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
457
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
458 address pc = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
459
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
460 //%note os_trap_1
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
461 if (info != NULL && uc != NULL && thread != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
462 pc = (address) os::Bsd::ucontext_get_pc(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
463
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
464 if (pc == (address) Fetch32PFI) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
465 uc->context_pc = intptr_t(Fetch32Resume) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
466 return 1 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
467 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
468 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
469 if (pc == (address) FetchNPFI) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
470 uc->context_pc = intptr_t (FetchNResume) ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
471 return 1 ;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
472 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
473 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
474
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
475 // Handle ALL stack overflow variations here
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
476 if (sig == SIGSEGV || sig == SIGBUS) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
477 address addr = (address) info->si_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
478
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
479 // check if fault address is within thread stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
480 if (addr < thread->stack_base() &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
481 addr >= thread->stack_base() - thread->stack_size()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
482 // stack overflow
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
483 if (thread->in_stack_yellow_zone(addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
484 thread->disable_stack_yellow_zone();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
485 if (thread->thread_state() == _thread_in_Java) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
486 // Throw a stack overflow exception. Guard pages will be reenabled
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
487 // while unwinding the stack.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
488 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
489 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
490 // Thread was in the vm or native code. Return and try to finish.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
491 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
492 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
493 } else if (thread->in_stack_red_zone(addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
494 // Fatal red zone violation. Disable the guard pages and fall through
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
495 // to handle_unexpected_exception way down below.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
496 thread->disable_stack_red_zone();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
497 tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
498 #ifndef _ALLBSD_SOURCE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
499 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
500 // Accessing stack address below sp may cause SEGV if current
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
501 // thread has MAP_GROWSDOWN stack. This should only happen when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
502 // current thread was created by user code with MAP_GROWSDOWN flag
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
503 // and then attached to VM. See notes in os_bsd.cpp.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
504 if (thread->osthread()->expanding_stack() == 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
505 thread->osthread()->set_expanding_stack();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
506 if (os::Bsd::manually_expand_stack(thread, addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
507 thread->osthread()->clear_expanding_stack();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
508 return 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
509 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
510 thread->osthread()->clear_expanding_stack();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
511 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
512 fatal("recursive segv. expanding stack.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
513 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
514 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
515 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
516 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
517 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
518
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
519 if (thread->thread_state() == _thread_in_Java) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
520 // Java thread running in Java code => find exception handler if any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
521 // a fault inside compiled code, the interpreter, or a stub
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
522
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
523 if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
524 stub = SharedRuntime::get_poll_stub(pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
525 #if defined(__APPLE__) && !defined(AMD64)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
526 // 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
527 // Catching SIGBUS here prevents the implicit SIGBUS NULL check below from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
528 // being called, so only do so if the implicit NULL check is not necessary.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
529 } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((int)info->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
530 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
531 } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
532 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
533 // BugId 4454115: A read from a MappedByteBuffer can fault
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
534 // here if the underlying file has been truncated.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
535 // Do not crash the VM in such a case.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
536 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
537 nmethod* nm = cb->is_nmethod() ? (nmethod*)cb : NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
538 if (nm != NULL && nm->has_unsafe_access()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
539 stub = StubRoutines::handler_for_unsafe_access();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
540 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
541 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
542 else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
543
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
544 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
545 if (sig == SIGFPE &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
546 (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
547 stub =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
548 SharedRuntime::
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
549 continuation_for_implicit_exception(thread,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
550 pc,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
551 SharedRuntime::
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
552 IMPLICIT_DIVIDE_BY_ZERO);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
553 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
554 } else if (sig == SIGFPE && info->si_code == FPE_NOOP) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
555 int op = pc[0];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
556
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
557 // Skip REX
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
558 if ((pc[0] & 0xf0) == 0x40) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
559 op = pc[1];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
560 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
561 op = pc[0];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
562 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
563
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
564 // Check for IDIV
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
565 if (op == 0xF7) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
566 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime:: IMPLICIT_DIVIDE_BY_ZERO);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
567 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
568 // TODO: handle more cases if we are using other x86 instructions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
569 // that can generate SIGFPE signal.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
570 tty->print_cr("unknown opcode 0x%X with SIGFPE.", op);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
571 fatal("please update this code.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
572 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
573 #endif /* __APPLE__ */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
574
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
575 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
576 if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
577 // HACK: si_code does not work on bsd 2.2.12-20!!!
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
578 int op = pc[0];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
579 if (op == 0xDB) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
580 // FIST
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
581 // TODO: The encoding of D2I in i486.ad can cause an exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
582 // prior to the fist instruction if there was an invalid operation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
583 // pending. We want to dismiss that exception. From the win_32
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
584 // side it also seems that if it really was the fist causing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
585 // the exception that we do the d2i by hand with different
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
586 // rounding. Seems kind of weird.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
587 // NOTE: that we take the exception at the NEXT floating point instruction.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
588 assert(pc[0] == 0xDB, "not a FIST opcode");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
589 assert(pc[1] == 0x14, "not a FIST opcode");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
590 assert(pc[2] == 0x24, "not a FIST opcode");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
591 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
592 } else if (op == 0xF7) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
593 // IDIV
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
594 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
595 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
596 // TODO: handle more cases if we are using other x86 instructions
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
597 // that can generate SIGFPE signal on bsd.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
598 tty->print_cr("unknown opcode 0x%X with SIGFPE.", op);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
599 fatal("please update this code.");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
600 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
601 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
602 } else if ((sig == SIGSEGV || sig == SIGBUS) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
603 !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
604 // Determination of interpreter/vtable stub/compiled code null exception
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
605 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
606 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
607 } else if (thread->thread_state() == _thread_in_vm &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
608 sig == SIGBUS && /* info->si_code == BUS_OBJERR && */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
609 thread->doing_unsafe_access()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
610 stub = StubRoutines::handler_for_unsafe_access();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
611 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
612
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
613 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
614 // and the heap gets shrunk before the field access.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
615 if ((sig == SIGSEGV) || (sig == SIGBUS)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
616 address addr = JNI_FastGetField::find_slowcase_pc(pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
617 if (addr != (address)-1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
618 stub = addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
619 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
620 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
621
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
622 // Check to see if we caught the safepoint code in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
623 // process of write protecting the memory serialization page.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
624 // It write enables the page immediately after protecting it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
625 // so we can just return to retry the write.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
626 if ((sig == SIGSEGV || sig == SIGBUS) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
627 os::is_memory_serialize_page(thread, (address) info->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
628 // Block current thread until the memory serialize page permission restored.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
629 os::block_on_serialize_page_trap();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
630 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
631 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
632 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
633
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
634 #ifndef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
635 // Execution protection violation
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
636 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
637 // This should be kept as the last step in the triage. We don't
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
638 // have a dedicated trap number for a no-execute fault, so be
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
639 // conservative and allow other handlers the first shot.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
640 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
641 // Note: We don't test that info->si_code == SEGV_ACCERR here.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
642 // this si_code is so generic that it is almost meaningless; and
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
643 // the si_code for this condition may change in the future.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
644 // Furthermore, a false-positive should be harmless.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
645 if (UnguardOnExecutionViolation > 0 &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
646 (sig == SIGSEGV || sig == SIGBUS) &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
647 uc->context_trapno == trap_page_fault) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
648 int page_size = os::vm_page_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
649 address addr = (address) info->si_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
650 address pc = os::Bsd::ucontext_get_pc(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
651 // Make sure the pc and the faulting address are sane.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
652 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
653 // If an instruction spans a page boundary, and the page containing
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
654 // the beginning of the instruction is executable but the following
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
655 // page is not, the pc and the faulting address might be slightly
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
656 // different - we still want to unguard the 2nd page in this case.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
657 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
658 // 15 bytes seems to be a (very) safe value for max instruction size.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
659 bool pc_is_near_addr =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
660 (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
661 bool instr_spans_page_boundary =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
662 (align_size_down((intptr_t) pc ^ (intptr_t) addr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
663 (intptr_t) page_size) > 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
664
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
665 if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
666 static volatile address last_addr =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
667 (address) os::non_memory_address_word();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
668
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
669 // In conservative mode, don't unguard unless the address is in the VM
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
670 if (addr != last_addr &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
671 (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
672
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
673 // Set memory to RWX and retry
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
674 address page_start =
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
675 (address) align_size_down((intptr_t) addr, (intptr_t) page_size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
676 bool res = os::protect_memory((char*) page_start, page_size,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
677 os::MEM_PROT_RWX);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
678
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
679 if (PrintMiscellaneous && Verbose) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
680 char buf[256];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
681 jio_snprintf(buf, sizeof(buf), "Execution protection violation "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
682 "at " INTPTR_FORMAT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
683 ", unguarding " INTPTR_FORMAT ": %s, errno=%d", addr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
684 page_start, (res ? "success" : "failed"), errno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
685 tty->print_raw_cr(buf);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
686 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
687 stub = pc;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
688
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
689 // Set last_addr so if we fault again at the same address, we don't end
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
690 // up in an endless loop.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
691 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
692 // There are two potential complications here. Two threads trapping at
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
693 // the same address at the same time could cause one of the threads to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
694 // think it already unguarded, and abort the VM. Likely very rare.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
695 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
696 // The other race involves two threads alternately trapping at
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
697 // different addresses and failing to unguard the page, resulting in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
698 // an endless loop. This condition is probably even more unlikely than
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
699 // the first.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
700 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
701 // Although both cases could be avoided by using locks or thread local
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
702 // last_addr, these solutions are unnecessary complication: this
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
703 // handler is a best-effort safety net, not a complete solution. It is
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
704 // disabled by default and should only be used as a workaround in case
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
705 // we missed any no-execute-unsafe VM code.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
706
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
707 last_addr = addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
708 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
709 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
710 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
711 #endif // !AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
712
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
713 if (stub != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
714 // save all thread context in case we need to restore it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
715 if (thread != NULL) thread->set_saved_exception_pc(pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
716
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
717 uc->context_pc = (intptr_t)stub;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
718 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
719 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
720
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
721 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
722 if (os::Bsd::chained_handler(sig, info, ucVoid)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
723 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
724 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
725
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
726 if (!abort_if_unrecognized) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
727 // caller wants another chance, so give it to him
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
728 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
729 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
730
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
731 if (pc == NULL && uc != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
732 pc = os::Bsd::ucontext_get_pc(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
733 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
734
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
735 // unmask current signal
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
736 sigset_t newset;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
737 sigemptyset(&newset);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
738 sigaddset(&newset, sig);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
739 sigprocmask(SIG_UNBLOCK, &newset, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
740
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
741 VMError err(t, sig, pc, info, ucVoid);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
742 err.report_and_die();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
743
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
744 ShouldNotReachHere();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
745 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
746
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
747 #ifdef _ALLBSD_SOURCE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
748 // From solaris_i486.s ported to bsd_i486.s
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
749 extern "C" void fixcw();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
750 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
751
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
752 void os::Bsd::init_thread_fpu_state(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
753 #ifndef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
754 # ifdef _ALLBSD_SOURCE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
755 // Set fpu to 53 bit precision. This happens too early to use a stub.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
756 fixcw();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
757 # else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
758 // set fpu to 53 bit precision
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
759 set_fpu_control_word(0x27f);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
760 # endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
761 #endif // !AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
762 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
763
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
764 #ifndef _ALLBSD_SOURCE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
765 int os::Bsd::get_fpu_control_word(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
766 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
767 return 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
768 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
769 int fpu_control;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
770 _FPU_GETCW(fpu_control);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
771 return fpu_control & 0xffff;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
772 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
773 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
774
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
775 void os::Bsd::set_fpu_control_word(int fpu_control) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
776 #ifndef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
777 _FPU_SETCW(fpu_control);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
778 #endif // !AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
779 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
780 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
781
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
782 // Check that the bsd kernel version is 2.4 or higher since earlier
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
783 // versions do not support SSE without patches.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
784 bool os::supports_sse() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
785 #if defined(AMD64) || defined(_ALLBSD_SOURCE)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
786 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
787 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
788 struct utsname uts;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
789 if( uname(&uts) != 0 ) return false; // uname fails?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
790 char *minor_string;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
791 int major = strtol(uts.release,&minor_string,10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
792 int minor = strtol(minor_string+1,NULL,10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
793 bool result = (major > 2 || (major==2 && minor >= 4));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
794 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
795 if (PrintMiscellaneous && Verbose) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
796 tty->print("OS version is %d.%d, which %s support SSE/SSE2\n",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
797 major,minor, result ? "DOES" : "does NOT");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
798 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
799 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
800 return result;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
801 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
802 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
803
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
804 bool os::is_allocatable(size_t bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
805 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
806 // unused on amd64?
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
807 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
808 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
809
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
810 if (bytes < 2 * G) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
811 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
812 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
813
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
814 char* addr = reserve_memory(bytes, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
815
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
816 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
817 release_memory(addr, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
818 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
819
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
820 return addr != NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
821 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
822 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
823
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
824 ////////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
825 // thread stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
826
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
827 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
828 size_t os::Bsd::min_stack_allowed = 64 * K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
829
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
830 // amd64: pthread on amd64 is always in floating stack mode
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
831 bool os::Bsd::supports_variable_stack_size() { return true; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
832 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
833 size_t os::Bsd::min_stack_allowed = (48 DEBUG_ONLY(+4))*K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
834
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
835 #ifdef __GNUC__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
836 #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
837 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
838
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
839 #ifdef _ALLBSD_SOURCE
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
840 bool os::Bsd::supports_variable_stack_size() { return true; }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
841 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
842 // Test if pthread library can support variable thread stack size. BsdThreads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
843 // in fixed stack mode allocates 2M fixed slot for each thread. BsdThreads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
844 // in floating stack mode and NPTL support variable stack size.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
845 bool os::Bsd::supports_variable_stack_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
846 if (os::Bsd::is_NPTL()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
847 // NPTL, yes
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
848 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
849
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
850 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
851 // Note: We can't control default stack size when creating a thread.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
852 // If we use non-default stack size (pthread_attr_setstacksize), both
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
853 // floating stack and non-floating stack BsdThreads will return the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
854 // same value. This makes it impossible to implement this function by
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
855 // detecting thread stack size directly.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
856 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
857 // An alternative approach is to check %gs. Fixed-stack BsdThreads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
858 // do not use %gs, so its value is 0. Floating-stack BsdThreads use
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
859 // %gs (either as LDT selector or GDT selector, depending on kernel)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
860 // to access thread specific data.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
861 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
862 // Note that %gs is a reserved glibc register since early 2001, so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
863 // applications are not allowed to change its value (Ulrich Drepper from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
864 // Redhat confirmed that all known offenders have been modified to use
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
865 // either %fs or TSD). In the worst case scenario, when VM is embedded in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
866 // a native application that plays with %gs, we might see non-zero %gs
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
867 // even BsdThreads is running in fixed stack mode. As the result, we'll
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
868 // return true and skip _thread_safety_check(), so we may not be able to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
869 // detect stack-heap collisions. But otherwise it's harmless.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
870 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
871 #ifdef __GNUC__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
872 return (GET_GS() != 0);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
873 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
874 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
875 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
876 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
877 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
878 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
879 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
880
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
881 // return default stack size for thr_type
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
882 size_t os::Bsd::default_stack_size(os::ThreadType thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
883 // default stack size (compiler thread needs larger stack)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
884 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
885 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
886 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
887 size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
888 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
889 return s;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
890 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
891
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
892 size_t os::Bsd::default_guard_size(os::ThreadType thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
893 // Creating guard page is very expensive. Java thread has HotSpot
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
894 // guard page, only enable glibc guard page for non-Java threads.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
895 return (thr_type == java_thread ? 0 : page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
896 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
897
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
898 // Java thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
899 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
900 // Low memory addresses
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
901 // +------------------------+
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
902 // | |\ JavaThread created by VM does not have glibc
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
903 // | glibc guard page | - guard, attached Java thread usually has
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
904 // | |/ 1 page glibc guard.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
905 // P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
906 // | |\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
907 // | HotSpot Guard Pages | - red and yellow pages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
908 // | |/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
909 // +------------------------+ JavaThread::stack_yellow_zone_base()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
910 // | |\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
911 // | Normal Stack | -
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
912 // | |/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
913 // P2 +------------------------+ Thread::stack_base()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
914 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
915 // Non-Java thread:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
916 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
917 // Low memory addresses
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
918 // +------------------------+
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
919 // | |\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
920 // | glibc guard page | - usually 1 page
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
921 // | |/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
922 // P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
923 // | |\
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
924 // | Normal Stack | -
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
925 // | |/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
926 // P2 +------------------------+ Thread::stack_base()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
927 //
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
928 // ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
929 // pthread_attr_getstack()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
930
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
931 static void current_stack_region(address * bottom, size_t * size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
932 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
933 pthread_t self = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
934 void *stacktop = pthread_get_stackaddr_np(self);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
935 *size = pthread_get_stacksize_np(self);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
936 *bottom = (address) stacktop - *size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
937 #elif defined(__OpenBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
938 stack_t ss;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
939 int rslt = pthread_stackseg_np(pthread_self(), &ss);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
940
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
941 if (rslt != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
942 fatal(err_msg("pthread_stackseg_np failed with err = %d", rslt));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
943
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
944 *bottom = (address)((char *)ss.ss_sp - ss.ss_size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
945 *size = ss.ss_size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
946 #elif defined(_ALLBSD_SOURCE)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
947 pthread_attr_t attr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
948
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
949 int rslt = pthread_attr_init(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
950
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
951 // JVM needs to know exact stack location, abort if it fails
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
952 if (rslt != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
953 fatal(err_msg("pthread_attr_init failed with err = %d", rslt));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
954
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
955 rslt = pthread_attr_get_np(pthread_self(), &attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
956
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
957 if (rslt != 0)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
958 fatal(err_msg("pthread_attr_get_np failed with err = %d", rslt));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
959
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
960 if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
961 pthread_attr_getstacksize(&attr, size) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
962 fatal("Can not locate current stack attributes!");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
963 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
964
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
965 pthread_attr_destroy(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
966 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
967 if (os::Bsd::is_initial_thread()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
968 // initial thread needs special handling because pthread_getattr_np()
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
969 // may return bogus value.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
970 *bottom = os::Bsd::initial_thread_stack_bottom();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
971 *size = os::Bsd::initial_thread_stack_size();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
972 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
973 pthread_attr_t attr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
974
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
975 int rslt = pthread_getattr_np(pthread_self(), &attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
976
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
977 // JVM needs to know exact stack location, abort if it fails
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
978 if (rslt != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
979 if (rslt == ENOMEM) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
980 vm_exit_out_of_memory(0, "pthread_getattr_np");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
981 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
982 fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
983 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
984 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
985
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
986 if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
987 fatal("Can not locate current stack attributes!");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
988 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
989
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
990 pthread_attr_destroy(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
991
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
992 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
993 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
994 assert(os::current_stack_pointer() >= *bottom &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
995 os::current_stack_pointer() < *bottom + *size, "just checking");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
996 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
997
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
998 address os::current_stack_base() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
999 address bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1000 size_t size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1001 current_stack_region(&bottom, &size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1002 return (bottom + size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1003 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1004
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1005 size_t os::current_stack_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1006 // stack size includes normal stack and HotSpot guard pages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1007 address bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1008 size_t size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1009 current_stack_region(&bottom, &size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1010 return size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1011 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1012
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1013 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1014 // helper functions for fatal error handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1015
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1016 void os::print_context(outputStream *st, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1017 if (context == NULL) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1018
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1019 ucontext_t *uc = (ucontext_t*)context;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1020 st->print_cr("Registers:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1021 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1022 st->print( "RAX=" INTPTR_FORMAT, uc->context_rax);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1023 st->print(", RBX=" INTPTR_FORMAT, uc->context_rbx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1024 st->print(", RCX=" INTPTR_FORMAT, uc->context_rcx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1025 st->print(", RDX=" INTPTR_FORMAT, uc->context_rdx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1026 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1027 st->print( "RSP=" INTPTR_FORMAT, uc->context_rsp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1028 st->print(", RBP=" INTPTR_FORMAT, uc->context_rbp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1029 st->print(", RSI=" INTPTR_FORMAT, uc->context_rsi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1030 st->print(", RDI=" INTPTR_FORMAT, uc->context_rdi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1031 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1032 st->print( "R8 =" INTPTR_FORMAT, uc->context_r8);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1033 st->print(", R9 =" INTPTR_FORMAT, uc->context_r9);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1034 st->print(", R10=" INTPTR_FORMAT, uc->context_r10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1035 st->print(", R11=" INTPTR_FORMAT, uc->context_r11);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1036 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1037 st->print( "R12=" INTPTR_FORMAT, uc->context_r12);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1038 st->print(", R13=" INTPTR_FORMAT, uc->context_r13);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1039 st->print(", R14=" INTPTR_FORMAT, uc->context_r14);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1040 st->print(", R15=" INTPTR_FORMAT, uc->context_r15);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1041 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1042 st->print( "RIP=" INTPTR_FORMAT, uc->context_rip);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1043 st->print(", EFLAGS=" INTPTR_FORMAT, uc->context_flags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1044 st->print(", ERR=" INTPTR_FORMAT, uc->context_err);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1045 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1046 st->print(" TRAPNO=" INTPTR_FORMAT, uc->context_trapno);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1047 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1048 st->print( "EAX=" INTPTR_FORMAT, uc->context_eax);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1049 st->print(", EBX=" INTPTR_FORMAT, uc->context_ebx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1050 st->print(", ECX=" INTPTR_FORMAT, uc->context_ecx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1051 st->print(", EDX=" INTPTR_FORMAT, uc->context_edx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1052 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1053 st->print( "ESP=" INTPTR_FORMAT, uc->context_esp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1054 st->print(", EBP=" INTPTR_FORMAT, uc->context_ebp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1055 st->print(", ESI=" INTPTR_FORMAT, uc->context_esi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1056 st->print(", EDI=" INTPTR_FORMAT, uc->context_edi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1057 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1058 st->print( "EIP=" INTPTR_FORMAT, uc->context_eip);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1059 st->print(", EFLAGS=" INTPTR_FORMAT, uc->context_eflags);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1060 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1061 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1062 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1063
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1064 intptr_t *sp = (intptr_t *)os::Bsd::ucontext_get_sp(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1065 st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1066 print_hex_dump(st, (address)sp, (address)(sp + 8*sizeof(intptr_t)), sizeof(intptr_t));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1067 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1068
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1069 // Note: it may be unsafe to inspect memory near pc. For example, pc may
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1070 // point to garbage if entry point in an nmethod is corrupted. Leave
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1071 // this at the end, and hope for the best.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1072 address pc = os::Bsd::ucontext_get_pc(uc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1073 st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1074 print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1075 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1076
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1077 void os::print_register_info(outputStream *st, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1078 if (context == NULL) return;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1079
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1080 ucontext_t *uc = (ucontext_t*)context;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1081
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1082 st->print_cr("Register to memory mapping:");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1083 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1084
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1085 // this is horrendously verbose but the layout of the registers in the
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1086 // context does not match how we defined our abstract Register set, so
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1087 // we can't just iterate through the gregs area
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1088
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1089 // this is only for the "general purpose" registers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1090
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1091 #ifdef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1092 st->print("RAX="); print_location(st, uc->context_rax);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1093 st->print("RBX="); print_location(st, uc->context_rbx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1094 st->print("RCX="); print_location(st, uc->context_rcx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1095 st->print("RDX="); print_location(st, uc->context_rdx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1096 st->print("RSP="); print_location(st, uc->context_rsp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1097 st->print("RBP="); print_location(st, uc->context_rbp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1098 st->print("RSI="); print_location(st, uc->context_rsi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1099 st->print("RDI="); print_location(st, uc->context_rdi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1100 st->print("R8 ="); print_location(st, uc->context_r8);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1101 st->print("R9 ="); print_location(st, uc->context_r9);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1102 st->print("R10="); print_location(st, uc->context_r10);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1103 st->print("R11="); print_location(st, uc->context_r11);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1104 st->print("R12="); print_location(st, uc->context_r12);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1105 st->print("R13="); print_location(st, uc->context_r13);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1106 st->print("R14="); print_location(st, uc->context_r14);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1107 st->print("R15="); print_location(st, uc->context_r15);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1108 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1109 st->print("EAX="); print_location(st, uc->context_eax);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1110 st->print("EBX="); print_location(st, uc->context_ebx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1111 st->print("ECX="); print_location(st, uc->context_ecx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1112 st->print("EDX="); print_location(st, uc->context_edx);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1113 st->print("ESP="); print_location(st, uc->context_esp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1114 st->print("EBP="); print_location(st, uc->context_ebp);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1115 st->print("ESI="); print_location(st, uc->context_esi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1116 st->print("EDI="); print_location(st, uc->context_edi);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1117 #endif // AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1118
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1119 st->cr();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1120 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1121
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1122 void os::setup_fpu() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1123 #ifndef AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1124 address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1125 __asm__ volatile ( "fldcw (%0)" :
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1126 : "r" (fpu_cntrl) : "memory");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1127 #endif // !AMD64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
1128 }