annotate src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 55fb97c4c58d
children 4ca6dc0799b6
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 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 12077
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
3 * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
5 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
8 * published by the Free Software Foundation.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
9 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
14 * accompanied this code).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
15 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
19 *
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
22 * questions.
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
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6842
diff changeset
26 #if !defined(__APPLE__) && !defined(__NetBSD__)
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
27 #include <pthread.h>
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
28 # include <pthread_np.h> /* For pthread_attr_get_np */
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
29 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
30
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
31 // no precompiled headers
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
32 #include "assembler_zero.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
33 #include "classfile/classLoader.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
34 #include "classfile/systemDictionary.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
35 #include "classfile/vmSymbols.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
36 #include "code/icBuffer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
37 #include "code/vtableStubs.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
38 #include "interpreter/interpreter.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
39 #include "jvm_bsd.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
40 #include "memory/allocation.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
41 #include "mutex_bsd.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
42 #include "nativeInst_zero.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
43 #include "os_share_bsd.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
44 #include "prims/jniFastGetField.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
45 #include "prims/jvm.h"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
46 #include "prims/jvm_misc.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
47 #include "runtime/arguments.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
48 #include "runtime/extendedPC.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
49 #include "runtime/frame.inline.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
50 #include "runtime/interfaceSupport.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
51 #include "runtime/java.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
52 #include "runtime/javaCalls.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
53 #include "runtime/mutexLocker.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
54 #include "runtime/osThread.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
55 #include "runtime/sharedRuntime.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
56 #include "runtime/stubRoutines.hpp"
7180
f34d701e952e 8003935: Simplify the needed includes for using Thread::current()
stefank
parents: 6918
diff changeset
57 #include "runtime/thread.inline.hpp"
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
58 #include "runtime/timer.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
59 #include "utilities/events.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
60 #include "utilities/vmError.hpp"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
61
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
62 address os::current_stack_pointer() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
63 address dummy = (address) &dummy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
64 return dummy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
65 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
66
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
67 frame os::get_sender_for_C_frame(frame* fr) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
68 ShouldNotCallThis();
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
69 return frame();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
70 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
71
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
72 frame os::current_frame() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
73 // The only thing that calls this is the stack printing code in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
74 // VMError::report:
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
75 // - Step 110 (printing stack bounds) uses the sp in the frame
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
76 // to determine the amount of free space on the stack. We
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
77 // set the sp to a close approximation of the real value in
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
78 // order to allow this step to complete.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
79 // - Step 120 (printing native stack) tries to walk the stack.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
80 // The frame we create has a NULL pc, which is ignored as an
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
81 // invalid frame.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
82 frame dummy = frame();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
83 dummy.set_sp((intptr_t *) current_stack_pointer());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
84 return dummy;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
85 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
86
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
87 char* os::non_memory_address_word() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
88 // Must never look like an address returned by reserve_memory,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
89 // even in its subfields (as defined by the CPU immediate fields,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
90 // if the CPU splits constants across multiple instructions).
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
91 #ifdef SPARC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
92 // On SPARC, 0 != %hi(any real address), because there is no
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
93 // allocation in the first 1Kb of the virtual address space.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
94 return (char *) 0;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
95 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
96 // This is the value for x86; works pretty well for PPC too.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
97 return (char *) -1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
98 #endif // SPARC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
99 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
100
6768
716e6ef4482a 7190089: NMT ON: NMT failed assertion on thread's stack base address
zgu
parents: 5903
diff changeset
101 void os::initialize_thread(Thread* thr) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
102 // Nothing to do.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
103 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
104
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
105 address os::Bsd::ucontext_get_pc(ucontext_t* uc) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
106 ShouldNotCallThis();
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
107 return NULL;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
108 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
109
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
110 ExtendedPC os::fetch_frame_from_context(void* ucVoid,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
111 intptr_t** ret_sp,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
112 intptr_t** ret_fp) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
113 ShouldNotCallThis();
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
114 return ExtendedPC();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
115 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
116
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
117 frame os::fetch_frame_from_context(void* ucVoid) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
118 ShouldNotCallThis();
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
119 return frame();
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
120 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
121
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
122 extern "C" JNIEXPORT int
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
123 JVM_handle_bsd_signal(int sig,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
124 siginfo_t* info,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
125 void* ucVoid,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
126 int abort_if_unrecognized) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
127 ucontext_t* uc = (ucontext_t*) ucVoid;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
128
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
129 Thread* t = ThreadLocalStorage::get_thread_slow();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
130
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
131 SignalHandlerMark shm(t);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
132
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
133 // Note: it's not uncommon that JNI code uses signal/sigset to
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
134 // install then restore certain signal handler (e.g. to temporarily
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
135 // block SIGPIPE, or have a SIGILL handler when detecting CPU
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
136 // type). When that happens, JVM_handle_bsd_signal() might be
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
137 // invoked with junk info/ucVoid. To avoid unnecessary crash when
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
138 // libjsig is not preloaded, try handle signals that do not require
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
139 // siginfo/ucontext first.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
140
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
141 if (sig == SIGPIPE || sig == SIGXFSZ) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
142 // allow chained handler to go first
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
143 if (os::Bsd::chained_handler(sig, info, ucVoid)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
144 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
145 } else {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
146 if (PrintMiscellaneous && (WizardMode || Verbose)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
147 char buf[64];
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
148 warning("Ignoring %s - see bugs 4229104 or 646499219",
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
149 os::exception_name(sig, buf, sizeof(buf)));
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
150 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
151 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
152 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
153 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
154
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
155 JavaThread* thread = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
156 VMThread* vmthread = NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
157 if (os::Bsd::signal_handlers_are_installed) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
158 if (t != NULL ){
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
159 if(t->is_Java_thread()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
160 thread = (JavaThread*)t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
161 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
162 else if(t->is_VM_thread()){
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
163 vmthread = (VMThread *)t;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
164 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
165 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
166 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
167
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
168 if (info != NULL && thread != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
169 // Handle ALL stack overflow variations here
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
170 if (sig == SIGSEGV || sig == SIGBUS) {
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
171 address addr = (address) info->si_addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
172
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
173 // check if fault address is within thread stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
174 if (addr < thread->stack_base() &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
175 addr >= thread->stack_base() - thread->stack_size()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
176 // stack overflow
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
177 if (thread->in_stack_yellow_zone(addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
178 thread->disable_stack_yellow_zone();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
179 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
180 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
181 else if (thread->in_stack_red_zone(addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
182 thread->disable_stack_red_zone();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
183 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
184 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
185 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
186 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
187
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
188 /*if (thread->thread_state() == _thread_in_Java) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
189 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
190 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
191 else*/ if (thread->thread_state() == _thread_in_vm &&
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
192 sig == SIGBUS && thread->doing_unsafe_access()) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
193 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
194 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
195
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
196 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
197 // kicks in and the heap gets shrunk before the field access.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
198 /*if (sig == SIGSEGV || sig == SIGBUS) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
199 address addr = JNI_FastGetField::find_slowcase_pc(pc);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
200 if (addr != (address)-1) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
201 stub = addr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
202 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
203 }*/
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
204
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
205 // Check to see if we caught the safepoint code in the process
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
206 // of write protecting the memory serialization page. It write
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
207 // enables the page immediately after protecting it so we can
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
208 // just return to retry the write.
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
209 if ((sig == SIGSEGV || sig == SIGBUS) &&
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
210 os::is_memory_serialize_page(thread, (address) info->si_addr)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
211 // Block current thread until permission is restored.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
212 os::block_on_serialize_page_trap();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
213 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
214 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
215 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
216
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
217 // signal-chaining
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
218 if (os::Bsd::chained_handler(sig, info, ucVoid)) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
219 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
220 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
221
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
222 if (!abort_if_unrecognized) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
223 // caller wants another chance, so give it to him
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
224 return false;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
225 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
226
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
227 #ifndef PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
228 if (sig == SIGSEGV) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
229 fatal("\n#"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
230 "\n# /--------------------\\"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
231 "\n# | segmentation fault |"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
232 "\n# \\---\\ /--------------/"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
233 "\n# /"
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
234 "\n# [-] |\\_/| "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
235 "\n# (+)=C |o o|__ "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
236 "\n# | | =-*-=__\\ "
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
237 "\n# OOO c_c_(___)");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
238 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
239 #endif // !PRODUCT
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
240
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
241 const char *fmt =
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
242 "caught unhandled signal " INT32_FORMAT " at address " PTR_FORMAT;
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
243 char buf[128];
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
244
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
245 sprintf(buf, fmt, sig, info->si_addr);
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
246 fatal(buf);
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
247 return false;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
248 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
249
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
250 void os::Bsd::init_thread_fpu_state(void) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
251 // Nothing to do
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
252 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
253
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
254 bool os::is_allocatable(size_t bytes) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
255 #ifdef _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
256 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
257 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
258 if (bytes < 2 * G) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
259 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
260 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
261
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
262 char* addr = reserve_memory(bytes, NULL);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
263
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
264 if (addr != NULL) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
265 release_memory(addr, bytes);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
266 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
267
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
268 return addr != NULL;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
269 #endif // _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
270 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
271
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
272 ///////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
273 // thread stack
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
274
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
275 size_t os::Bsd::min_stack_allowed = 64 * K;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
276
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
277 bool os::Bsd::supports_variable_stack_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
278 return true;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
279 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
280
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
281 size_t os::Bsd::default_stack_size(os::ThreadType thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
282 #ifdef _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
283 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
284 #else
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
285 size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
286 #endif // _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
287 return s;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
288 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
289
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
290 size_t os::Bsd::default_guard_size(os::ThreadType thr_type) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
291 // Only enable glibc guard pages for non-Java threads
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
292 // (Java threads have HotSpot guard pages)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
293 return (thr_type == java_thread ? 0 : page_size());
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
294 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
295
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
296 static void current_stack_region(address *bottom, size_t *size) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
297 address stack_bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
298 address stack_top;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
299 size_t stack_bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
300
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
301 #ifdef __APPLE__
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
302 pthread_t self = pthread_self();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
303 stack_top = (address) pthread_get_stackaddr_np(self);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
304 stack_bytes = pthread_get_stacksize_np(self);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
305 stack_bottom = stack_top - stack_bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
306 #elif defined(__OpenBSD__)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
307 stack_t ss;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
308 int rslt = pthread_stackseg_np(pthread_self(), &ss);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
309
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
310 if (rslt != 0)
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
311 fatal(err_msg("pthread_stackseg_np failed with err = " INT32_FORMAT,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
312 rslt));
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
313
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
314 stack_top = (address) ss.ss_sp;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
315 stack_bytes = ss.ss_size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
316 stack_bottom = stack_top - stack_bytes;
6918
0af5da0c9d9d 8001619: Remove usage of _ALLBSD_SOURCE in bsd files
sla
parents: 6842
diff changeset
317 #else
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
318 pthread_attr_t attr;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
319
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
320 int rslt = pthread_attr_init(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
321
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
322 // JVM needs to know exact stack location, abort if it fails
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
323 if (rslt != 0)
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
324 fatal(err_msg("pthread_attr_init failed with err = " INT32_FORMAT, rslt));
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
325
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
326 rslt = pthread_attr_get_np(pthread_self(), &attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
327
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
328 if (rslt != 0)
4006
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
329 fatal(err_msg("pthread_attr_get_np failed with err = " INT32_FORMAT,
436b4a3231bf 7098194: integrate macosx-port changes
dcubed
parents: 3960
diff changeset
330 rslt));
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
331
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
332 if (pthread_attr_getstackaddr(&attr, (void **) &stack_bottom) != 0 ||
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
333 pthread_attr_getstacksize(&attr, &stack_bytes) != 0) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
334 fatal("Can not locate current stack attributes!");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
335 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
336
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
337 pthread_attr_destroy(&attr);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
338
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
339 stack_top = stack_bottom + stack_bytes;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
340 #endif
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
341
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
342 assert(os::current_stack_pointer() >= stack_bottom, "should do");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
343 assert(os::current_stack_pointer() < stack_top, "should do");
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
344
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
345 *bottom = stack_bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
346 *size = stack_top - stack_bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
347 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
348
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
349 address os::current_stack_base() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
350 address bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
351 size_t size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
352 current_stack_region(&bottom, &size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
353 return bottom + size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
354 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
355
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
356 size_t os::current_stack_size() {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
357 // stack size includes normal stack and HotSpot guard pages
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
358 address bottom;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
359 size_t size;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
360 current_stack_region(&bottom, &size);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
361 return size;
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 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
365 // helper functions for fatal error handler
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
366
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
367 void os::print_context(outputStream* st, void* context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
368 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
369 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
370
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
371 void os::print_register_info(outputStream *st, void *context) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
372 ShouldNotCallThis();
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 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
376 // Stubs for things that would be in bsd_zero.s if it existed.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
377 // You probably want to disassemble these monkeys to check they're ok.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
378
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
379 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
380 int SpinPause() {
12077
e16282db4946 8022956: Clang: enable return type warnings on BSD
twisti
parents: 7180
diff changeset
381 return 1;
3960
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
382 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
383
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
384 void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
385 if (from > to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
386 jshort *end = from + count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
387 while (from < end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
388 *(to++) = *(from++);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
389 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
390 else if (from < to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
391 jshort *end = from;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
392 from += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
393 to += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
394 while (from >= end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
395 *(to--) = *(from--);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
396 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
397 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
398 void _Copy_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
399 if (from > to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
400 jint *end = from + count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
401 while (from < end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
402 *(to++) = *(from++);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
403 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
404 else if (from < to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
405 jint *end = from;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
406 from += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
407 to += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
408 while (from >= end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
409 *(to--) = *(from--);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
410 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
411 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
412 void _Copy_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
413 if (from > to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
414 jlong *end = from + count;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
415 while (from < end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
416 os::atomic_copy64(from++, to++);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
417 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
418 else if (from < to) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
419 jlong *end = from;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
420 from += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
421 to += count - 1;
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
422 while (from >= end)
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
423 os::atomic_copy64(from--, to--);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
424 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
425 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
426
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
427 void _Copy_arrayof_conjoint_bytes(HeapWord* from,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
428 HeapWord* to,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
429 size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
430 memmove(to, from, count);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
431 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
432 void _Copy_arrayof_conjoint_jshorts(HeapWord* from,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
433 HeapWord* to,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
434 size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
435 memmove(to, from, count * 2);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
436 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
437 void _Copy_arrayof_conjoint_jints(HeapWord* from,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
438 HeapWord* to,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
439 size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
440 memmove(to, from, count * 4);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
441 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
442 void _Copy_arrayof_conjoint_jlongs(HeapWord* from,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
443 HeapWord* to,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
444 size_t count) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
445 memmove(to, from, count * 8);
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
446 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
447 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
448
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
449 /////////////////////////////////////////////////////////////////////////////
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
450 // Implementations of atomic operations not supported by processors.
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
451 // -- http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Atomic-Builtins.html
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
452
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
453 #ifndef _LP64
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
454 extern "C" {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
455 long long unsigned int __sync_val_compare_and_swap_8(
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
456 volatile void *ptr,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
457 long long unsigned int oldval,
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
458 long long unsigned int newval) {
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
459 ShouldNotCallThis();
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
460 }
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
461 };
f08d439fab8c 7089790: integrate bsd-port changes
never
parents:
diff changeset
462 #endif // !_LP64
5903
da4be62fb889 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 4006
diff changeset
463
da4be62fb889 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 4006
diff changeset
464 #ifndef PRODUCT
da4be62fb889 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 4006
diff changeset
465 void os::verify_stack_alignment() {
da4be62fb889 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 4006
diff changeset
466 }
da4be62fb889 7147740: add assertions to check stack alignment on VM entry from generated code (x64)
roland
parents: 4006
diff changeset
467 #endif