$NetBSD: patch-hotspot_src_os__cpu_solaris__x86_vm_os__solaris__x86.cpp,v 1.1 2015/07/03 20:40:59 fhajny Exp $
|
|
GCC support.
|
|
--- hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp.orig 2015-06-10 10:31:53.000000000 +0000
|
+++ hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp
|
@@ -234,13 +234,43 @@ frame os::get_sender_for_C_frame(frame*
|
return frame(fr->sender_sp(), fr->link(), fr->sender_pc());
|
}
|
|
+#ifdef AMD64
|
+#define SPELL_REG_SP "rsp"
|
+#else
|
+#define SPELL_REG_SP "esp"
|
+#endif
|
+
|
+#ifdef SPARC_WORKS
|
extern "C" intptr_t *_get_current_sp(); // in .il file
|
+#else
|
+#ifdef _GNU_SOURCE
|
+extern "C" intptr_t *_get_current_sp() {
|
+ register intptr_t *rsp __asm__ (SPELL_REG_SP);
|
+ return rsp;
|
+}
|
+#endif // _GNU_SOURCE
|
+#endif // SPARC_WORKS
|
|
address os::current_stack_pointer() {
|
return (address)_get_current_sp();
|
}
|
|
+#ifdef AMD64
|
+#define SPELL_REG_FP "rbp"
|
+#else
|
+#define SPELL_REG_FP "ebp"
|
+#endif
|
+
|
+#ifdef SPARC_WORKS
|
extern "C" intptr_t *_get_current_fp(); // in .il file
|
+#else
|
+#ifdef _GNU_SOURCE
|
+extern "C" intptr_t *_get_current_fp() {
|
+ register intptr_t **rbp __asm__ (SPELL_REG_FP);
|
+ return (intptr_t*) *rbp; // we want what it points to.
|
+}
|
+#endif // _GNU_SOURCE
|
+#endif // SPARC_WORKS
|
|
frame os::current_frame() {
|
intptr_t* fp = _get_current_fp(); // it's inlined so want current fp
|
@@ -930,7 +960,12 @@ add_func_t* os::atomic_add_func
|
extern "C" void _solaris_raw_setup_fpu(address ptr);
|
void os::setup_fpu() {
|
address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std();
|
+#ifndef _GNU_SOURCE
|
_solaris_raw_setup_fpu(fpu_cntrl);
|
+#else
|
+ // same as hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp : os::setup_fpu()
|
+ __asm__ volatile("fldcw (%0)"::"r"(fpu_cntrl):"memory");
|
+#endif
|
}
|
#endif // AMD64
|
|