summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/patch-set
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2013-10-09 20:36:06 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2013-10-09 20:36:06 +0000
commitf78b1b9ba06ffbbdecee2801917443f79011f134 (patch)
treefc3ef7699ec2d5dff96245bc6d90117d597fb678 /java/openjdk6/files/patch-set
parentBump PORTREVISION after plist change (diff)
Update to Build b28.
Diffstat (limited to 'java/openjdk6/files/patch-set')
-rw-r--r--java/openjdk6/files/patch-set8189
1 files changed, 227 insertions, 7962 deletions
diff --git a/java/openjdk6/files/patch-set b/java/openjdk6/files/patch-set
index 8e6ee44230ae..6b6f7f744d96 100644
--- a/java/openjdk6/files/patch-set
+++ b/java/openjdk6/files/patch-set
@@ -10,8 +10,8 @@
+ OTHER_LDLIBS += -liconv
+ else
+ ifneq ($(OS_NAME), netbsd)
-+ CPPFLAGS += -I$(PACKAGE_PATH)/include
-+ OTHER_LDLIBS += -L$(PACKAGE_PATH)/lib -liconv
++ CPPFLAGS += %%ICONV_INC%%
++ OTHER_LDLIBS += %%ICONV_LIB%%
+ endif
+ endif
+endif
@@ -430,383 +430,20 @@
fi)
MIN_VM_MEMORY := $(shell \
if [ $(MAX_VM_MEMORY) -le 128 ] ; then \
---- hotspot/agent/make/Makefile
-+++ hotspot/agent/make/Makefile
-@@ -52,6 +52,9 @@
- sun.jvm.hotspot.compiler \
- sun.jvm.hotspot.debugger \
- sun.jvm.hotspot.debugger.amd64 \
-+sun.jvm.hotspot.debugger.bsd \
-+sun.jvm.hotspot.debugger.bsd.amd64 \
-+sun.jvm.hotspot.debugger.bsd.x86 \
- sun.jvm.hotspot.debugger.cdbg \
- sun.jvm.hotspot.debugger.cdbg.basic \
- sun.jvm.hotspot.debugger.cdbg.basic.amd64 \
-@@ -94,6 +97,9 @@
- sun.jvm.hotspot.oops \
- sun.jvm.hotspot.runtime \
- sun.jvm.hotspot.runtime.amd64 \
-+sun.jvm.hotspot.runtime.bsd \
-+sun.jvm.hotspot.runtime.bsd_amd64 \
-+sun.jvm.hotspot.runtime.bsd_x86 \
- sun.jvm.hotspot.runtime.ia64 \
- sun.jvm.hotspot.runtime.linux \
- sun.jvm.hotspot.runtime.linux_amd64 \
-@@ -143,6 +149,9 @@
- sun/jvm/hotspot/compiler/*.java \
- sun/jvm/hotspot/debugger/*.java \
- sun/jvm/hotspot/debugger/amd64/*.java \
-+sun/jvm/hotspot/debugger/bsd/*.java \
-+sun/jvm/hotspot/debugger/bsd/amd64/*.java \
-+sun/jvm/hotspot/debugger/bsd/x86/*.java \
- sun/jvm/hotspot/debugger/cdbg/*.java \
- sun/jvm/hotspot/debugger/cdbg/basic/*.java \
- sun/jvm/hotspot/debugger/cdbg/basic/amd64/*.java \
-@@ -178,6 +187,9 @@
- sun/jvm/hotspot/oops/*.java \
- sun/jvm/hotspot/runtime/*.java \
- sun/jvm/hotspot/runtime/amd64/*.java \
-+sun/jvm/hotspot/runtime/bsd/*.java \
-+sun/jvm/hotspot/runtime/bsd_amd64/*.java \
-+sun/jvm/hotspot/runtime/bsd_x86/*.java \
- sun/jvm/hotspot/runtime/ia64/*.java \
- sun/jvm/hotspot/runtime/linux/*.java \
- sun/jvm/hotspot/runtime/linux_amd64/*.java \
---- hotspot/agent/src/os/bsd/BsdDebuggerLocal.c
-+++ hotspot/agent/src/os/bsd/BsdDebuggerLocal.c
-@@ -22,6 +22,7 @@
- *
- */
-
-+#include <stdlib.h>
- #include <jni.h>
- #include "libproc.h"
-
-@@ -73,7 +74,7 @@
- (JNIEnv *env, jclass cls) {
- jclass listClass;
-
-- if (init_libproc(getenv("LIBSAPROC_DEBUG")) != true) {
-+ if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
- THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
- }
-
-@@ -275,7 +276,7 @@
- bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
- CHECK_EXCEPTION_(0);
-
-- err = ps_pdread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
-+ err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
- (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
- return (err == PS_OK)? array : 0;
- }
-@@ -283,11 +284,10 @@
- JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
- (JNIEnv *env, jobject this_obj, jint lwp_id) {
-
-- struct user_regs_struct gregs;
-+ struct reg gregs;
- jboolean isCopy;
- jlongArray array;
- jlong *regs;
-- int i;
-
- struct ps_prochandle* ph = get_proc_handle(env, this_obj);
- if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
-@@ -317,26 +317,27 @@
- #ifdef i386
- #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
-
-- regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
-- regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
-- regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
-- regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds;
-- regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi;
-- regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi;
-- regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp;
-- regs[REG_INDEX(SP)] = (uintptr_t) gregs.esp;
-- regs[REG_INDEX(EBX)] = (uintptr_t) gregs.ebx;
-- regs[REG_INDEX(EDX)] = (uintptr_t) gregs.edx;
-- regs[REG_INDEX(ECX)] = (uintptr_t) gregs.ecx;
-- regs[REG_INDEX(EAX)] = (uintptr_t) gregs.eax;
-- regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip;
-- regs[REG_INDEX(CS)] = (uintptr_t) gregs.xcs;
-- regs[REG_INDEX(SS)] = (uintptr_t) gregs.xss;
-+ regs[REG_INDEX(GS)] = (uintptr_t) gregs.r_gs;
-+ regs[REG_INDEX(FS)] = (uintptr_t) gregs.r_fs;
-+ regs[REG_INDEX(ES)] = (uintptr_t) gregs.r_es;
-+ regs[REG_INDEX(DS)] = (uintptr_t) gregs.r_ds;
-+ regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi;
-+ regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi;
-+ regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp;
-+ regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp;
-+ regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx;
-+ regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx;
-+ regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx;
-+ regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax;
-+ regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip;
-+ regs[REG_INDEX(CS)] = (uintptr_t) gregs.r_cs;
-+ regs[REG_INDEX(SS)] = (uintptr_t) gregs.r_ss;
-
- #endif /* i386 */
-
- #if ia64
- regs = (*env)->GetLongArrayElements(env, array, &isCopy);
-+ int i;
- for (i = 0; i < NPRGREG; i++ ) {
- regs[i] = 0xDEADDEAD;
- }
-@@ -345,31 +346,31 @@
- #ifdef amd64
- #define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
-
-- regs[REG_INDEX(R15)] = gregs.r15;
-- regs[REG_INDEX(R14)] = gregs.r14;
-- regs[REG_INDEX(R13)] = gregs.r13;
-- regs[REG_INDEX(R12)] = gregs.r12;
-- regs[REG_INDEX(RBP)] = gregs.rbp;
-- regs[REG_INDEX(RBX)] = gregs.rbx;
-- regs[REG_INDEX(R11)] = gregs.r11;
-- regs[REG_INDEX(R10)] = gregs.r10;
-- regs[REG_INDEX(R9)] = gregs.r9;
-- regs[REG_INDEX(R8)] = gregs.r8;
-- regs[REG_INDEX(RAX)] = gregs.rax;
-- regs[REG_INDEX(RCX)] = gregs.rcx;
-- regs[REG_INDEX(RDX)] = gregs.rdx;
-- regs[REG_INDEX(RSI)] = gregs.rsi;
-- regs[REG_INDEX(RDI)] = gregs.rdi;
-- regs[REG_INDEX(RIP)] = gregs.rip;
-- regs[REG_INDEX(CS)] = gregs.cs;
-- regs[REG_INDEX(RSP)] = gregs.rsp;
-- regs[REG_INDEX(SS)] = gregs.ss;
-- regs[REG_INDEX(FSBASE)] = gregs.fs_base;
-- regs[REG_INDEX(GSBASE)] = gregs.gs_base;
-- regs[REG_INDEX(DS)] = gregs.ds;
-- regs[REG_INDEX(ES)] = gregs.es;
-- regs[REG_INDEX(FS)] = gregs.fs;
-- regs[REG_INDEX(GS)] = gregs.gs;
-+ regs[REG_INDEX(R15)] = gregs.r_r15;
-+ regs[REG_INDEX(R14)] = gregs.r_r14;
-+ regs[REG_INDEX(R13)] = gregs.r_r13;
-+ regs[REG_INDEX(R12)] = gregs.r_r12;
-+ regs[REG_INDEX(RBP)] = gregs.r_rbp;
-+ regs[REG_INDEX(RBX)] = gregs.r_rbx;
-+ regs[REG_INDEX(R11)] = gregs.r_r11;
-+ regs[REG_INDEX(R10)] = gregs.r_r10;
-+ regs[REG_INDEX(R9)] = gregs.r_r9;
-+ regs[REG_INDEX(R8)] = gregs.r_r8;
-+ regs[REG_INDEX(RAX)] = gregs.r_rax;
-+ regs[REG_INDEX(RCX)] = gregs.r_rcx;
-+ regs[REG_INDEX(RDX)] = gregs.r_rdx;
-+ regs[REG_INDEX(RSI)] = gregs.r_rsi;
-+ regs[REG_INDEX(RDI)] = gregs.r_rdi;
-+ regs[REG_INDEX(RIP)] = gregs.r_rip;
-+ regs[REG_INDEX(CS)] = gregs.r_cs;
-+ regs[REG_INDEX(RSP)] = gregs.r_rsp;
-+ regs[REG_INDEX(SS)] = gregs.r_ss;
-+// regs[REG_INDEX(FSBASE)] = gregs.fs_base;
-+// regs[REG_INDEX(GSBASE)] = gregs.gs_base;
-+// regs[REG_INDEX(DS)] = gregs.ds;
-+// regs[REG_INDEX(ES)] = gregs.es;
-+// regs[REG_INDEX(FS)] = gregs.fs;
-+// regs[REG_INDEX(GS)] = gregs.gs;
-
- #endif /* amd64 */
-
--- hotspot/agent/src/os/bsd/Makefile
+++ hotspot/agent/src/os/bsd/Makefile
-@@ -22,8 +22,8 @@
- #
+@@ -23,7 +23,7 @@
#
--ARCH := $(shell if ([ `uname -m` = "ia64" ]) ; then echo ia64 ; elif ([ `uname -m` = "x86_64" ]) ; then echo amd64; elif ([ `uname -m` = "sparc64" ]) ; then echo sparc; else echo i386 ; fi )
+ ARCH := $(shell if ([ `uname -m` = "ia64" ]) ; then echo ia64 ; elif ([ `uname -m` = "amd64" ]) ; then echo amd64; elif ([ `uname -m` = "sparc64" ]) ; then echo sparc; else echo i386 ; fi )
-GCC = gcc
-+ARCH := $(shell if ([ `uname -m` = "ia64" ]) ; then echo ia64 ; elif ([ `uname -m` = "amd64" ]) ; then echo amd64; elif ([ `uname -m` = "sparc64" ]) ; then echo sparc; else echo i386 ; fi )
+GCC ?= gcc
JAVAH = ${JAVA_HOME}/bin/javah
-@@ -32,25 +32,24 @@
- libproc_impl.c \
- ps_proc.c \
- ps_core.c \
-- BsdDebuggerLocal.c
-+ BsdDebuggerLocal.c
-
--INCLUDES = -I${JAVA_HOME}/include -I${JAVA_HOME}/include/bsd
-+INCLUDES = -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(shell uname -s | tr "[:upper:]" "[:lower:]")
-
- OBJS = $(SOURCES:.c=.o)
-
--LIBS = -lthread_db
-+LIBS = -lutil -lthread_db
-
--CFLAGS = -c -fPIC -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES)
-+CFLAGS = -c -fPIC -g -Wall -D_ALLBSD_SOURCE -D_GNU_SOURCE -D$(ARCH) $(INCLUDES)
-
- LIBSA = $(ARCH)/libsaproc.so
-
- all: $(LIBSA)
-
- BsdDebuggerLocal.o: BsdDebuggerLocal.c
-- $(JAVAH) -jni -classpath ../../../build/classes \
-+ $(JAVAH) -jni -classpath ../../../../../build/bsd-i586/hotspot/outputdir/bsd_i486_compiler2/generated/saclasses \
- sun.jvm.hotspot.debugger.x86.X86ThreadContext \
-- sun.jvm.hotspot.debugger.sparc.SPARCThreadContext \
-- sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
-+ sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
- $(GCC) $(CFLAGS) $<
-
- .c.obj:
-@@ -60,26 +59,19 @@
- LFLAGS_LIBSA = -Xlinker --version-script=mapfile
- endif
-
--# If this is a --hash-style=gnu system, use --hash-style=both
--# The gnu .hash section won't work on some Bsd systems like SuSE 10.
--_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
--ifneq ($(_HAS_HASH_STYLE_GNU),)
-- LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
--endif
--LFLAGS_LIBSA += $(LDFLAGS_HASH_STYLE)
--
- $(LIBSA): $(OBJS) mapfile
- if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) ; fi
- $(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
-
--test.o: test.c
-+test.o: $(LIBSA) test.c
- $(GCC) -c -o test.o -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES) test.c
-
- test: test.o
- $(GCC) -o test test.o -L$(ARCH) -lsaproc $(LIBS)
-
- clean:
-- rm -rf $(LIBSA)
-- rm -rf $(OBJS)
-- rmdir $(ARCH)
-+ rm -f $(LIBSA)
-+ rm -f $(OBJS)
-+ rm -f test.o
-+ -rmdir $(ARCH)
-
---- hotspot/agent/src/os/bsd/elfmacros.h
-+++ hotspot/agent/src/os/bsd/elfmacros.h
-@@ -25,16 +25,19 @@
- #ifndef _ELFMACROS_H_
- #define _ELFMACROS_H_
-
-+#define ELF_NHDR Elf_Note
-+
- #if defined(_LP64)
- #define ELF_EHDR Elf64_Ehdr
- #define ELF_SHDR Elf64_Shdr
- #define ELF_PHDR Elf64_Phdr
- #define ELF_SYM Elf64_Sym
--#define ELF_NHDR Elf64_Nhdr
- #define ELF_DYN Elf64_Dyn
- #define ELF_ADDR Elf64_Addr
-
-+#ifndef ELF_ST_TYPE
- #define ELF_ST_TYPE ELF64_ST_TYPE
-+#endif
-
- #else
-
-@@ -42,11 +45,12 @@
- #define ELF_SHDR Elf32_Shdr
- #define ELF_PHDR Elf32_Phdr
- #define ELF_SYM Elf32_Sym
--#define ELF_NHDR Elf32_Nhdr
- #define ELF_DYN Elf32_Dyn
- #define ELF_ADDR Elf32_Addr
-
-+#ifndef ELF_ST_TYPE
- #define ELF_ST_TYPE ELF32_ST_TYPE
-+#endif
-
- #endif
-
---- hotspot/agent/src/os/bsd/libproc.h
-+++ hotspot/agent/src/os/bsd/libproc.h
-@@ -27,7 +27,8 @@
-
- #include <unistd.h>
- #include <stdint.h>
--#include "proc_service.h"
-+#include <machine/reg.h>
-+#include <proc_service.h>
-
- #if defined(sparc) || defined(sparcv9)
- /*
-@@ -50,14 +51,11 @@
- adds Pgrab__ and some missing stuff. We hide the difference b/w live process and core
- file by this interface.
-
--1. pthread_id unique in both NPTL & BsdThreads. We store this in
--OSThread::_pthread_id in JVM code.
-+1. pthread_id is unique. We store this in OSThread::_pthread_id in JVM code.
-
--2. All threads see the same pid when they call getpid() under NPTL.
--Threads receive different pid under BsdThreads. We used to save the result of
--::getpid() call in OSThread::_thread_id. This way uniqueness of OSThread::_thread_id
--was lost under NPTL. Now, we store the result of ::gettid() call in
--OSThread::_thread_id. Because gettid returns actual pid of thread (lwp id), this is
-+2. All threads see the same pid when they call getpid().
-+We used to save the result of ::getpid() call in OSThread::_thread_id.
-+Because gettid returns actual pid of thread (lwp id), this is
- unique again. We therefore use OSThread::_thread_id as unique identifier.
-
- 3. There is a unique LWP id under both thread libraries. libthread_db maps pthread_id
-@@ -74,20 +72,7 @@
-
- *************************************************************************************/
-
--#ifdef ia64
--struct user_regs_struct {
--/* copied from user.h which doesn't define this in a struct */
--
--#define IA64_REG_COUNT (EF_SIZE/8+32) /* integer and fp regs */
--unsigned long regs[IA64_REG_COUNT]; /* integer and fp regs */
--};
--#endif
--
--#if defined(sparc) || defined(sparcv9)
--#define user_regs_struct pt_regs
--#endif
--
--// This C bool type must be int for compatibility with Bsd calls and
-+// This C bool type must be int for compatibility with BSD calls and
- // it would be a mistake to equivalence it to C++ bool on many platforms
-
- typedef int bool;
-@@ -118,7 +103,7 @@
- lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
-
- // get regs for a given lwp
--bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct user_regs_struct* regs);
-+bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct reg* regs);
-
- // get number of shared objects
- int get_num_libs(struct ps_prochandle* ph);
--- hotspot/agent/src/os/bsd/libproc_impl.c
+++ hotspot/agent/src/os/bsd/libproc_impl.c
-@@ -174,10 +174,13 @@
- return NULL;
- }
-
-- newlib->symtab = build_symtab(newlib->fd, libname);
-+ newlib->symtab = build_symtab(newlib->fd);
- if (newlib->symtab == NULL) {
- print_debug("symbol table build failed for %s\n", newlib->name);
- }
-+ else {
-+ print_debug("built symbol table for %s\n", newlib->name);
-+ }
-
- // even if symbol table building fails, we add the lib_info.
- // This is because we may need to read from the ELF file for core file
-@@ -232,6 +235,24 @@
+@@ -235,6 +235,24 @@
}
// add a thread to ps_prochandle
@@ -831,7 +468,7 @@
thread_info* add_thread_info(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
thread_info* newthr;
if ( (newthr = (thread_info*) calloc(1, sizeof(thread_info))) == NULL) {
-@@ -249,6 +270,7 @@
+@@ -252,6 +270,7 @@
ph->num_threads++;
return newthr;
}
@@ -839,7 +476,7 @@
// struct used for client data from thread_db callback
-@@ -270,10 +292,17 @@
+@@ -273,10 +292,17 @@
return err;
}
@@ -851,120 +488,15 @@
+#else
print_debug("thread_db : pthread %d (lwp %d)\n", ti.ti_tid, ti.ti_lid);
-- if (ptr->callback(ptr->ph, ti.ti_tid, ti.ti_lid) != true)
-+ if (ptr->callback(ptr->ph, (pthread_t)ti.ti_tid, ti.ti_lid) != true)
+ if (ptr->callback(ptr->ph, (pthread_t)ti.ti_tid, ti.ti_lid) != true)
return TD_ERR;
+#endif
return TD_OK;
}
-@@ -324,7 +353,7 @@
- }
-
- // get regs for a given lwp
--bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id, struct user_regs_struct* regs) {
-+bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs) {
- return ph->ops->get_lwp_regs(ph, lwp_id, regs);
- }
-
-@@ -375,11 +404,6 @@
- //--------------------------------------------------------------------------
- // proc service functions
-
--// get process id
--pid_t ps_getpid(struct ps_prochandle *ph) {
-- return ph->pid;
--}
--
- // ps_pglobal_lookup() looks up the symbol sym_name in the symbol table
- // of the load object object_name in the target process identified by ph.
- // It returns the symbol's value as an address in the target process in
-@@ -392,17 +416,33 @@
- }
-
- // read "size" bytes info "buf" from address "addr"
--ps_err_e ps_pdread(struct ps_prochandle *ph, psaddr_t addr,
-- void *buf, size_t size) {
-+ps_err_e ps_pread(struct ps_prochandle *ph, psaddr_t addr,
-+ void *buf, size_t size) {
- return ph->ops->p_pread(ph, (uintptr_t) addr, buf, size)? PS_OK: PS_ERR;
- }
-
- // write "size" bytes of data to debuggee at address "addr"
--ps_err_e ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr,
-- const void *buf, size_t size) {
-+ps_err_e ps_pwrite(struct ps_prochandle *ph, psaddr_t addr,
-+ const void *buf, size_t size) {
- return ph->ops->p_pwrite(ph, (uintptr_t)addr, buf, size)? PS_OK: PS_ERR;
- }
-
-+// fill in ptrace_lwpinfo for lid
-+ps_err_e ps_linfo(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-+ return ph->ops->get_lwp_info(ph, lwp_id, linfo)? PS_OK: PS_ERR;
-+}
-+
-+// needed for when libthread_db is compiled with TD_DEBUG defined
-+void
-+ps_plog (const char *format, ...)
-+{
-+ va_list alist;
-+
-+ va_start(alist, format);
-+ vfprintf(stderr, format, alist);
-+ va_end(alist);
-+}
-+
- // ------------------------------------------------------------------------
- // Functions below this point are not yet implemented. They are here only
- // to make the linker happy.
-@@ -427,8 +467,12 @@
- return PS_OK;
- }
-
--// new libthread_db of NPTL seem to require this symbol
--ps_err_e ps_get_thread_area() {
-- print_debug("ps_get_thread_area not implemented\n");
-+ps_err_e ps_lstop(struct ps_prochandle *ph, lwpid_t lid) {
-+ print_debug("ps_lstop not implemented\n");
-+ return PS_OK;
-+}
-+
-+ps_err_e ps_pcontinue(struct ps_prochandle *ph) {
-+ print_debug("ps_pcontinue not implemented\n");
- return PS_OK;
- }
--- hotspot/agent/src/os/bsd/libproc_impl.h
+++ hotspot/agent/src/os/bsd/libproc_impl.h
-@@ -47,7 +47,7 @@
- typedef struct thread_info {
- lwpid_t lwp_id;
- pthread_t pthread_id; // not used cores, always -1
-- struct user_regs_struct regs; // not for process, core uses for caching regset
-+ struct reg regs; // not for process, core uses for caching regset
- struct thread_info* next;
- } thread_info;
-
-@@ -71,7 +71,9 @@
- bool (*p_pwrite)(struct ps_prochandle *ph,
- uintptr_t addr, const char *buf , size_t size);
- // get integer regset of a thread
-- bool (*get_lwp_regs)(struct ps_prochandle* ph, lwpid_t lwp_id, struct user_regs_struct* regs);
-+ bool (*get_lwp_regs)(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs);
-+ // get info on thread
-+ bool (*get_lwp_info)(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo);
- } ps_prochandle_ops;
-
- // the ps_prochandle
-@@ -79,7 +81,7 @@
- struct core_data {
- int core_fd; // file descriptor of core file
- int exec_fd; // file descriptor of exec file
-- int interp_fd; // file descriptor of interpreter (ld-bsd.so.2)
-+ int interp_fd; // file descriptor of interpreter (ld-elf.so.1)
- // part of the class sharing workaround
- int classes_jsa_fd; // file descriptor of class share archive
- uintptr_t dynamic_addr; // address of dynamic section of a.out
-@@ -107,7 +109,11 @@
+@@ -109,7 +109,11 @@
void print_debug(const char* format,...);
bool is_debug();
@@ -976,7 +508,7 @@
// reads thread info using libthread_db and calls above callback for each thread
bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb);
-@@ -120,7 +126,11 @@
+@@ -122,7 +126,11 @@
uintptr_t base);
// adds a new thread to threads list, returns NULL on failure
@@ -988,212 +520,9 @@
// a test for ELF signature without using libelf
bool is_elf_file(int fd);
---- hotspot/agent/src/os/bsd/mapfile
-+++ hotspot/agent/src/os/bsd/mapfile
-@@ -43,13 +43,17 @@
- # proc_service.h functions - to be used by libthread_db
- ps_getpid;
- ps_pglobal_lookup;
-- ps_pdread;
-- ps_pdwrite;
-+ ps_pread;
-+ ps_pwrite;
- ps_lsetfpregs;
- ps_lsetregs;
- ps_lgetfpregs;
- ps_lgetregs;
-- ps_get_thread_area;
-+ ps_lcontinue;
-+ ps_lgetxmmregs;
-+ ps_lsetxmmregs;
-+ ps_lstop;
-+ ps_linfo;
-
- # used by attach test program
- init_libproc;
---- hotspot/agent/src/os/bsd/proc_service.h
-+++ hotspot/agent/src/os/bsd/proc_service.h 1969-12-31 19:00:00.000000000 -0500
-@@ -1,76 +0,0 @@
--/*
-- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
-- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-- *
-- * This code is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License version 2 only, as
-- * published by the Free Software Foundation.
-- *
-- * This code is distributed in the hope that it will be useful, but WITHOUT
-- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- * version 2 for more details (a copy is included in the LICENSE file that
-- * accompanied this code).
-- *
-- * You should have received a copy of the GNU General Public License version
-- * 2 along with this work; if not, write to the Free Software Foundation,
-- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-- *
-- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-- * or visit www.oracle.com if you need additional information or have any
-- * questions.
-- *
-- */
--
--#ifndef _PROC_SERVICE_H_
--#define _PROC_SERVICE_H_
--
--#include <stdio.h>
--#include <thread_db.h>
--
--// Bsd does not have the proc service library, though it does provide the
--// thread_db library which can be used to manipulate threads without having
--// to know the details of BsdThreads or NPTL
--
--// copied from Solaris "proc_service.h"
--typedef enum {
-- PS_OK, /* generic "call succeeded" */
-- PS_ERR, /* generic error */
-- PS_BADPID, /* bad process handle */
-- PS_BADLID, /* bad lwp identifier */
-- PS_BADADDR, /* bad address */
-- PS_NOSYM, /* p_lookup() could not find given symbol */
-- PS_NOFREGS /* FPU register set not available for given lwp */
--} ps_err_e;
--
--// ps_getpid() is only defined on Bsd to return a thread's process ID
--pid_t ps_getpid(struct ps_prochandle *ph);
--
--// ps_pglobal_lookup() looks up the symbol sym_name in the symbol table
--// of the load object object_name in the target process identified by ph.
--// It returns the symbol's value as an address in the target process in
--// *sym_addr.
--
--ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name,
-- const char *sym_name, psaddr_t *sym_addr);
--
--// read "size" bytes of data from debuggee at address "addr"
--ps_err_e ps_pdread(struct ps_prochandle *ph, psaddr_t addr,
-- void *buf, size_t size);
--
--// write "size" bytes of data to debuggee at address "addr"
--ps_err_e ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr,
-- const void *buf, size_t size);
--
--ps_err_e ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lid, const prfpregset_t *fpregs);
--
--ps_err_e ps_lsetregs(struct ps_prochandle *ph, lwpid_t lid, const prgregset_t gregset);
--
--ps_err_e ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lid, prfpregset_t *fpregs);
--
--ps_err_e ps_lgetregs(struct ps_prochandle *ph, lwpid_t lid, prgregset_t gregset);
--
--// new libthread_db of NPTL seem to require this symbol
--ps_err_e ps_get_thread_area();
--
--#endif /* _PROC_SERVICE_H_ */
--- hotspot/agent/src/os/bsd/ps_core.c
+++ hotspot/agent/src/os/bsd/ps_core.c
-@@ -142,6 +142,7 @@
-
- map->next = ph->core->class_share_maps;
- ph->core->class_share_maps = map;
-+ return map;
- }
-
- // Return the map_info for the given virtual address. We keep a sorted
-@@ -228,8 +229,8 @@
-
- // 4991491 NOTICE These are C++ bool's in filemap.hpp and must match up with
- // the C type matching the C++ bool type on any given platform. For
-- // Hotspot on Bsd we assume the corresponding C type is char but
-- // licensees on Bsd versions may need to adjust the type of these fields.
-+ // Hotspot on BSD we assume the corresponding C type is char but
-+ // licensees on BSD versions may need to adjust the type of these fields.
- char _read_only; // read only space?
- char _allow_exec; // executable code in space?
-
-@@ -240,7 +241,7 @@
-
- static bool read_jboolean(struct ps_prochandle* ph, uintptr_t addr, jboolean* pvalue) {
- jboolean i;
-- if (ps_pdread(ph, (psaddr_t) addr, &i, sizeof(i)) == PS_OK) {
-+ if (ps_pread(ph, (psaddr_t) addr, &i, sizeof(i)) == PS_OK) {
- *pvalue = i;
- return true;
- } else {
-@@ -250,7 +251,7 @@
-
- static bool read_pointer(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* pvalue) {
- uintptr_t uip;
-- if (ps_pdread(ph, (psaddr_t) addr, &uip, sizeof(uip)) == PS_OK) {
-+ if (ps_pread(ph, (psaddr_t) addr, &uip, sizeof(uip)) == PS_OK) {
- *pvalue = uip;
- return true;
- } else {
-@@ -264,7 +265,7 @@
- char c = ' ';
-
- while (c != '\0') {
-- if (ps_pdread(ph, (psaddr_t) addr, &c, sizeof(char)) != PS_OK)
-+ if (ps_pread(ph, (psaddr_t) addr, &c, sizeof(char)) != PS_OK)
- return false;
- if (i < size - 1)
- buf[i] = c;
-@@ -296,7 +297,6 @@
- uintptr_t base = 0, useSharedSpacesAddr = 0;
- uintptr_t sharedArchivePathAddrAddr = 0, sharedArchivePathAddr = 0;
- jboolean useSharedSpaces = 0;
-- map_info* mi = 0;
-
- memset(classes_jsa, 0, sizeof(classes_jsa));
- jvm_name = lib->name;
-@@ -306,9 +306,9 @@
- return false;
- }
-
-- // Hotspot vm types are not exported to build this library. So
-- // using equivalent type jboolean to read the value of
-- // UseSharedSpaces which is same as hotspot type "bool".
-+ // Hotspot vm types are not exported to build this library. So
-+ // using equivalent type jboolean to read the value of
-+ // UseSharedSpaces which is same as hotspot type "bool".
- if (read_jboolean(ph, useSharedSpacesAddr, &useSharedSpaces) != true) {
- print_debug("can't read the value of 'UseSharedSpaces' flag\n");
- return false;
-@@ -507,12 +507,12 @@
- }
-
- static bool core_get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id,
-- struct user_regs_struct* regs) {
-+ struct reg* regs) {
- // for core we have cached the lwp regs from NOTE section
- thread_info* thr = ph->threads;
- while (thr) {
- if (thr->lwp_id == lwp_id) {
-- memcpy(regs, &thr->regs, sizeof(struct user_regs_struct));
-+ memcpy(regs, &thr->regs, sizeof(struct reg));
- return true;
- }
- thr = thr->next;
-@@ -520,11 +520,17 @@
- return false;
- }
-
-+static bool core_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-+ print_debug("core_get_lwp_info not implemented\n");
-+ return false;
-+}
-+
- static ps_prochandle_ops core_ops = {
- .release= core_release,
- .p_pread= core_read_data,
- .p_pwrite= core_write_data,
-- .get_lwp_regs= core_get_lwp_regs
-+ .get_lwp_regs= core_get_lwp_regs,
-+ .get_lwp_info= core_get_lwp_info
- };
-
- // read regs and create thread from NT_PRSTATUS entries from core file
-@@ -534,57 +540,62 @@
+@@ -540,9 +540,14 @@
prstatus_t* prstat = (prstatus_t*) buf;
thread_info* newthr;
print_debug("got integer regset for lwp %d\n", prstat->pr_pid);
@@ -1207,1566 +536,34 @@
+#endif
// copy regs
-- memcpy(&newthr->regs, prstat->pr_reg, sizeof(struct user_regs_struct));
-+ memcpy(&newthr->regs, &prstat->pr_reg, sizeof(struct reg));
-
- if (is_debug()) {
- print_debug("integer regset\n");
- #ifdef i386
- // print the regset
-- print_debug("\teax = 0x%x\n", newthr->regs.eax);
-- print_debug("\tebx = 0x%x\n", newthr->regs.ebx);
-- print_debug("\tecx = 0x%x\n", newthr->regs.ecx);
-- print_debug("\tedx = 0x%x\n", newthr->regs.edx);
-- print_debug("\tesp = 0x%x\n", newthr->regs.esp);
-- print_debug("\tebp = 0x%x\n", newthr->regs.ebp);
-- print_debug("\tesi = 0x%x\n", newthr->regs.esi);
-- print_debug("\tedi = 0x%x\n", newthr->regs.edi);
-- print_debug("\teip = 0x%x\n", newthr->regs.eip);
-+ print_debug("\teax = 0x%x\n", newthr->regs.r_eax);
-+ print_debug("\tebx = 0x%x\n", newthr->regs.r_ebx);
-+ print_debug("\tecx = 0x%x\n", newthr->regs.r_ecx);
-+ print_debug("\tedx = 0x%x\n", newthr->regs.r_edx);
-+ print_debug("\tesp = 0x%x\n", newthr->regs.r_esp);
-+ print_debug("\tebp = 0x%x\n", newthr->regs.r_ebp);
-+ print_debug("\tesi = 0x%x\n", newthr->regs.r_esi);
-+ print_debug("\tedi = 0x%x\n", newthr->regs.r_edi);
-+ print_debug("\teip = 0x%x\n", newthr->regs.r_eip);
- #endif
-
- #if defined(amd64) || defined(x86_64)
- // print the regset
-- print_debug("\tr15 = 0x%lx\n", newthr->regs.r15);
-- print_debug("\tr14 = 0x%lx\n", newthr->regs.r14);
-- print_debug("\tr13 = 0x%lx\n", newthr->regs.r13);
-- print_debug("\tr12 = 0x%lx\n", newthr->regs.r12);
-- print_debug("\trbp = 0x%lx\n", newthr->regs.rbp);
-- print_debug("\trbx = 0x%lx\n", newthr->regs.rbx);
-- print_debug("\tr11 = 0x%lx\n", newthr->regs.r11);
-- print_debug("\tr10 = 0x%lx\n", newthr->regs.r10);
-- print_debug("\tr9 = 0x%lx\n", newthr->regs.r9);
-- print_debug("\tr8 = 0x%lx\n", newthr->regs.r8);
-- print_debug("\trax = 0x%lx\n", newthr->regs.rax);
-- print_debug("\trcx = 0x%lx\n", newthr->regs.rcx);
-- print_debug("\trdx = 0x%lx\n", newthr->regs.rdx);
-- print_debug("\trsi = 0x%lx\n", newthr->regs.rsi);
-- print_debug("\trdi = 0x%lx\n", newthr->regs.rdi);
-- print_debug("\torig_rax = 0x%lx\n", newthr->regs.orig_rax);
-- print_debug("\trip = 0x%lx\n", newthr->regs.rip);
-- print_debug("\tcs = 0x%lx\n", newthr->regs.cs);
-- print_debug("\teflags = 0x%lx\n", newthr->regs.eflags);
-- print_debug("\trsp = 0x%lx\n", newthr->regs.rsp);
-- print_debug("\tss = 0x%lx\n", newthr->regs.ss);
-- print_debug("\tfs_base = 0x%lx\n", newthr->regs.fs_base);
-- print_debug("\tgs_base = 0x%lx\n", newthr->regs.gs_base);
-- print_debug("\tds = 0x%lx\n", newthr->regs.ds);
-- print_debug("\tes = 0x%lx\n", newthr->regs.es);
-- print_debug("\tfs = 0x%lx\n", newthr->regs.fs);
-- print_debug("\tgs = 0x%lx\n", newthr->regs.gs);
-+ print_debug("\tr15 = 0x%lx\n", newthr->regs.r_r15);
-+ print_debug("\tr14 = 0x%lx\n", newthr->regs.r_r14);
-+ print_debug("\tr13 = 0x%lx\n", newthr->regs.r_r13);
-+ print_debug("\tr12 = 0x%lx\n", newthr->regs.r_r12);
-+ print_debug("\trbp = 0x%lx\n", newthr->regs.r_rbp);
-+ print_debug("\trbx = 0x%lx\n", newthr->regs.r_rbx);
-+ print_debug("\tr11 = 0x%lx\n", newthr->regs.r_r11);
-+ print_debug("\tr10 = 0x%lx\n", newthr->regs.r_r10);
-+ print_debug("\tr9 = 0x%lx\n", newthr->regs.r_r9);
-+ print_debug("\tr8 = 0x%lx\n", newthr->regs.r_r8);
-+ print_debug("\trax = 0x%lx\n", newthr->regs.r_rax);
-+ print_debug("\trcx = 0x%lx\n", newthr->regs.r_rcx);
-+ print_debug("\trdx = 0x%lx\n", newthr->regs.r_rdx);
-+ print_debug("\trsi = 0x%lx\n", newthr->regs.r_rsi);
-+ print_debug("\trdi = 0x%lx\n", newthr->regs.r_rdi);
-+ //print_debug("\torig_rax = 0x%lx\n", newthr->regs.orig_rax);
-+ print_debug("\trip = 0x%lx\n", newthr->regs.r_rip);
-+ print_debug("\tcs = 0x%lx\n", newthr->regs.r_cs);
-+ //print_debug("\teflags = 0x%lx\n", newthr->regs.eflags);
-+ print_debug("\trsp = 0x%lx\n", newthr->regs.r_rsp);
-+ print_debug("\tss = 0x%lx\n", newthr->regs.r_ss);
-+ //print_debug("\tfs_base = 0x%lx\n", newthr->regs.fs_base);
-+ //print_debug("\tgs_base = 0x%lx\n", newthr->regs.gs_base);
-+ //print_debug("\tds = 0x%lx\n", newthr->regs.ds);
-+ //print_debug("\tes = 0x%lx\n", newthr->regs.es);
-+ //print_debug("\tfs = 0x%lx\n", newthr->regs.fs);
-+ //print_debug("\tgs = 0x%lx\n", newthr->regs.gs);
- #endif
- }
-
-@@ -656,7 +667,7 @@
- * contains a set of saved /proc structures), and PT_LOAD (which
- * represents a memory mapping from the process's address space).
- *
-- * Difference b/w Solaris PT_NOTE and Bsd PT_NOTE:
-+ * Difference b/w Solaris PT_NOTE and BSD PT_NOTE:
- *
- * In Solaris there are two PT_NOTE segments the first PT_NOTE (if present)
- * contains /proc structs in the pre-2.6 unstructured /proc format. the last
-@@ -666,10 +677,10 @@
- * integer register set among other stuff. For each LWP, we have one lwpstatus
- * entry that has integer regset for that LWP.
- *
-- * Bsd threads are actually 'clone'd processes. To support core analysis
-- * of "multithreaded" process, Bsd creates more than one pstatus (called
-+ * Linux threads are actually 'clone'd processes. To support core analysis
-+ * of "multithreaded" process, Linux creates more than one pstatus (called
- * "prstatus") entry in PT_NOTE. Each prstatus entry has integer regset for one
-- * "thread". Please refer to Bsd kernel src file 'fs/binfmt_elf.c', in particular
-+ * "thread". Please refer to Linux kernel src file 'fs/binfmt_elf.c', in particular
- * function "elf_core_dump".
- */
-
-@@ -725,7 +736,7 @@
- return false;
- }
-
--// process segments from interpreter (ld.so or ld-bsd.so)
-+// process segments from interpreter (ld-elf.so.1)
- static bool read_interp_segments(struct ps_prochandle* ph) {
- ELF_EHDR interp_ehdr;
-
-@@ -826,7 +837,7 @@
-
- dyn.d_tag = DT_NULL;
- while (dyn.d_tag != DT_DEBUG) {
-- if (ps_pdread(ph, (psaddr_t) addr, &dyn, sizeof(ELF_DYN)) != PS_OK) {
-+ if (ps_pread(ph, (psaddr_t) addr, &dyn, sizeof(ELF_DYN)) != PS_OK) {
- print_debug("can't read debug info from _DYNAMIC\n");
- return false;
- }
-@@ -836,23 +847,27 @@
- // we have got Dyn entry with DT_DEBUG
- debug_base = dyn.d_un.d_ptr;
- // at debug_base we have struct r_debug. This has first link map in r_map field
-- if (ps_pdread(ph, (psaddr_t) debug_base + FIRST_LINK_MAP_OFFSET,
-+ if (ps_pread(ph, (psaddr_t) debug_base + FIRST_LINK_MAP_OFFSET,
- &first_link_map_addr, sizeof(uintptr_t)) != PS_OK) {
- print_debug("can't read first link map address\n");
- return false;
- }
-
- // read ld_base address from struct r_debug
-- if (ps_pdread(ph, (psaddr_t) debug_base + LD_BASE_OFFSET, &ld_base_addr,
-+ // XXX: There is no r_ldbase member on BSD
-+/*
-+ if (ps_pread(ph, (psaddr_t) debug_base + LD_BASE_OFFSET, &ld_base_addr,
- sizeof(uintptr_t)) != PS_OK) {
- print_debug("can't read ld base address\n");
- return false;
- }
- ph->core->ld_base_addr = ld_base_addr;
-+*/
-+ ph->core->ld_base_addr = 0;
-
- print_debug("interpreter base address is 0x%lx\n", ld_base_addr);
-
-- // now read segments from interp (i.e ld.so or ld-bsd.so)
-+ // now read segments from interp (i.e ld-elf.so.1)
- if (read_interp_segments(ph) != true)
- return false;
-
-@@ -870,26 +885,23 @@
- // address mentioned in shared object and the actual virtual base where runtime
- // linker loaded it. We use "base diff" in read_lib_segments call below.
-
-- if (ps_pdread(ph, (psaddr_t) link_map_addr + LINK_MAP_ADDR_OFFSET,
-+ if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_ADDR_OFFSET,
- &lib_base_diff, sizeof(uintptr_t)) != PS_OK) {
- print_debug("can't read shared object base address diff\n");
- return false;
- }
-
- // read address of the name
-- if (ps_pdread(ph, (psaddr_t) link_map_addr + LINK_MAP_NAME_OFFSET,
-+ if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_NAME_OFFSET,
- &lib_name_addr, sizeof(uintptr_t)) != PS_OK) {
- print_debug("can't read address of shared object name\n");
- return false;
- }
-
- // read name of the shared object
-- lib_name[0] = '\0';
-- if (lib_name_addr != 0 &&
-- read_string(ph, (uintptr_t) lib_name_addr, lib_name, sizeof(lib_name)) != true) {
-+ if (read_string(ph, (uintptr_t) lib_name_addr, lib_name, sizeof(lib_name)) != true) {
- print_debug("can't read shared object name\n");
-- // don't let failure to read the name stop opening the file. If something is really wrong
-- // it will fail later.
-+ return false;
- }
-
- if (lib_name[0] != '\0') {
-@@ -924,7 +936,7 @@
- }
-
- // read next link_map address
-- if (ps_pdread(ph, (psaddr_t) link_map_addr + LINK_MAP_NEXT_OFFSET,
-+ if (ps_pread(ph, (psaddr_t) link_map_addr + LINK_MAP_NEXT_OFFSET,
- &link_map_addr, sizeof(uintptr_t)) != PS_OK) {
- print_debug("can't read next link in link_map\n");
- return false;
-@@ -938,7 +950,6 @@
- struct ps_prochandle* Pgrab_core(const char* exec_file, const char* core_file) {
- ELF_EHDR core_ehdr;
- ELF_EHDR exec_ehdr;
-- ELF_EHDR lib_ehdr;
-
- struct ps_prochandle* ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle));
- if (ph == NULL) {
+ memcpy(&newthr->regs, &prstat->pr_reg, sizeof(struct reg));
--- hotspot/agent/src/os/bsd/ps_proc.c
+++ hotspot/agent/src/os/bsd/ps_proc.c
-@@ -22,20 +22,22 @@
- *
- */
-
-+#include <limits.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
-+#include <sys/types.h>
-+#include <sys/wait.h>
- #include <sys/ptrace.h>
-+#include <sys/param.h>
-+#include <sys/user.h>
-+#include <elf.h>
-+#include <sys/elf_common.h>
-+#include <sys/link_elf.h>
-+#include <libutil.h>
- #include "libproc_impl.h"
--
--#if defined(x86_64) && !defined(amd64)
--#define amd64 1
--#endif
--
--#ifndef __WALL
--#define __WALL 0x40000000 // Copied from /usr/include/bsd/wait.h
--#endif
-+#include "elfmacros.h"
-
- // This file has the libproc implementation specific to live process
- // For core files, refer to ps_core.c
-@@ -50,253 +52,365 @@
-
- // read "size" bytes of data from "addr" within the target process.
- // unlike the standard ptrace() function, process_read_data() can handle
--// unaligned address - alignment check, if required, should be done
-+// unaligned address - alignment check, if required, should be done
- // before calling process_read_data.
-
- static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
-- long rslt;
-+ int rslt;
- size_t i, words;
- uintptr_t end_addr = addr + size;
-- uintptr_t aligned_addr = align(addr, sizeof(long));
-+ uintptr_t aligned_addr = align(addr, sizeof(int));
-
- if (aligned_addr != addr) {
- char *ptr = (char *)&rslt;
- errno = 0;
-- rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
-+ rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
-- print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
-+ print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
- for (; aligned_addr != addr; aligned_addr++, ptr++);
-- for (; ((intptr_t)aligned_addr % sizeof(long)) && aligned_addr < end_addr;
-- aligned_addr++)
-+ for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
-+ aligned_addr++)
- *(buf++) = *(ptr++);
- }
-
-- words = (end_addr - aligned_addr) / sizeof(long);
-+ words = (end_addr - aligned_addr) / sizeof(int);
-
-- // assert((intptr_t)aligned_addr % sizeof(long) == 0);
-+ // assert((intptr_t)aligned_addr % sizeof(int) == 0);
- for (i = 0; i < words; i++) {
- errno = 0;
-- rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
-+ rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
-- print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
-+ print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
-- *(long *)buf = rslt;
-- buf += sizeof(long);
-- aligned_addr += sizeof(long);
-+ *(int *)buf = rslt;
-+ buf += sizeof(int);
-+ aligned_addr += sizeof(int);
- }
-
- if (aligned_addr != end_addr) {
- char *ptr = (char *)&rslt;
- errno = 0;
-- rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
-+ rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
- if (errno) {
-- print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
-+ print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
- return false;
- }
-- for (; aligned_addr != end_addr; aligned_addr++)
-+ for (; aligned_addr != end_addr; aligned_addr++)
- *(buf++) = *(ptr++);
- }
- return true;
- }
-
- // null implementation for write
--static bool process_write_data(struct ps_prochandle* ph,
-+static bool process_write_data(struct ps_prochandle* ph,
- uintptr_t addr, const char *buf , size_t size) {
- return false;
- }
-
--// "user" should be a pointer to a user_regs_struct
--static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct user_regs_struct *user) {
-+// "user" should be a pointer to a reg
-+static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) {
- // we have already attached to all thread 'pid's, just use ptrace call
- // to get regset now. Note that we don't cache regset upfront for processes.
--// Bsd on x86 and sparc are different. On x86 ptrace(PTRACE_GETREGS, ...)
--// uses pointer from 4th argument and ignores 3rd argument. On sparc it uses
--// pointer from 3rd argument and ignores 4th argument
--#if defined(sparc) || defined(sparcv9)
--#define ptrace_getregs(request, pid, addr, data) ptrace(request, pid, addr, data)
--#else
--#define ptrace_getregs(request, pid, addr, data) ptrace(request, pid, data, addr)
--#endif
--
--#if defined(_LP64) && defined(PTRACE_GETREGS64)
--#define PTRACE_GETREGS_REQ PTRACE_GETREGS64
--#elif defined(PTRACE_GETREGS)
--#define PTRACE_GETREGS_REQ PTRACE_GETREGS
--#elif defined(PT_GETREGS)
--#define PTRACE_GETREGS_REQ PT_GETREGS
--#endif
--
--#ifdef PTRACE_GETREGS_REQ
-- if (ptrace_getregs(PTRACE_GETREGS_REQ, pid, user, NULL) < 0) {
-+ if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) {
- print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
- return false;
- }
- return true;
--#else
-- print_debug("ptrace(PTRACE_GETREGS, ...) not supported\n");
-- return false;
--#endif
-+}
-+
-+// fill in ptrace_lwpinfo for lid
-+static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
-+ errno = 0;
-+ ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo));
-
-+ return (errno == 0)? true: false;
- }
-
- // attach to a process/thread specified by "pid"
- static bool ptrace_attach(pid_t pid) {
-- if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0) {
-+ if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) {
- print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
- return false;
- } else {
- int ret;
- int status;
- do {
-- // Wait for debuggee to stop.
-+ // Wait for debuggee to stop.
- ret = waitpid(pid, &status, 0);
-- if (ret == -1 && errno == ECHILD) {
-- // try cloned process.
-- ret = waitpid(pid, &status, __WALL);
-- }
- if (ret >= 0) {
-- if (WIFSTOPPED(status)) {
-- // Debuggee stopped.
-- return true;
-+ if (WIFSTOPPED(status)) {
-+ // Debuggee stopped.
-+ return true;
- } else {
-- print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
-- return false;
-- }
-+ print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
-+ return false;
-+ }
- } else {
-- switch (errno) {
-- case EINTR:
-+ switch (errno) {
-+ case EINTR:
- continue;
-- break;
-- case ECHILD:
-- print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
-- break;
-- case EINVAL:
-- print_debug("waitpid() failed. Invalid options argument.\n");
-- break;
-- default:
-- print_debug("waitpid() failed. Unexpected error %d\n",errno);
-+ break;
-+ case ECHILD:
-+ print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
-+ break;
-+ case EINVAL:
-+ print_debug("waitpid() failed. Invalid options argument.\n");
-+ break;
-+ default:
-+ print_debug("waitpid() failed. Unexpected error %d\n",errno);
- }
- return false;
-- }
-+ }
- } while(true);
-- }
--}
--
-+ }
-+}
-+
- // -------------------------------------------------------
- // functions for obtaining library information
+@@ -173,9 +173,15 @@
// -------------------------------------------------------
--/*
-- * splits a string _str_ into substrings with delimiter _delim_ by replacing old * delimiters with _new_delim_ (ideally, '\0'). the address of each substring
-- * is stored in array _ptrs_ as the return value. the maximum capacity of _ptrs_ * array is specified by parameter _n_.
-- * RETURN VALUE: total number of substrings (always <= _n_)
-- * NOTE: string _str_ is modified if _delim_!=_new_delim_
-- */
--static int split_n_str(char * str, int n, char ** ptrs, char delim, char new_delim)
--{
-- int i;
-- for(i = 0; i < n; i++) ptrs[i] = NULL;
-- if (str == NULL || n < 1 ) return 0;
--
-- i = 0;
--
-- // skipping leading blanks
-- while(*str&&*str==delim) str++;
--
-- while(*str&&i<n){
-- ptrs[i++] = str;
-- while(*str&&*str!=delim) str++;
-- while(*str&&*str==delim) *(str++) = new_delim;
-- }
--
-- return i;
-+// callback for read_thread_info
+ // callback for read_thread_info
+#ifdef __FreeBSD__
+static bool add_new_thread(struct ps_prochandle* ph, lwpid_t lwp_id) {
+ return add_thread_info(ph, lwp_id) != NULL;
+}
+#else
-+static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
-+ return add_thread_info(ph, pthread_id, lwp_id) != NULL;
+ static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
+ return add_thread_info(ph, pthread_id, lwp_id) != NULL;
}
+#endif
-+#if defined(__FreeBSD__) && __FreeBSD_version < 701000
+ #if defined(__FreeBSD__) && __FreeBSD_version < 701000
/*
-- * fgets without storing '\n' at the end of the string
-+ * TEXT_START_ADDR from binutils/ld/emulparams/<arch_spec>.sh
-+ * Not the most robust but good enough.
- */
--static char * fgets_no_cr(char * buf, int n, FILE *fp)
--{
-- char * rslt = fgets(buf, n, fp);
-- if (rslt && buf && *buf){
-- char *p = strchr(buf, '\0');
-- if (*--p=='\n') *p='\0';
-- }
-- return rslt;
--}
-
--// callback for read_thread_info
--static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
-- return add_thread_info(ph, pthread_id, lwp_id) != NULL;
-+#if defined(amd64) || defined(x86_64)
-+#define TEXT_START_ADDR 0x400000
-+#elif defined(i386)
-+#define TEXT_START_ADDR 0x8048000
-+#else
-+#error TEXT_START_ADDR not defined
-+#endif
-+
-+#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
-+
-+uintptr_t linkmap_addr(struct ps_prochandle *ph) {
-+ uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr;
-+ ELF_EHDR ehdr;
-+ ELF_PHDR *phdrs, *phdr;
-+ ELF_DYN *dyns, *dyn;
-+ struct r_debug dmap;
-+ unsigned long hdrs_size;
-+ unsigned int i;
-+
-+ /* read ELF_EHDR at TEXT_START_ADDR and validate */
-+
-+ ehdr_addr = (uintptr_t)TEXT_START_ADDR;
-+
-+ if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) {
-+ print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr);
-+ return (0);
-+ }
-+
-+ if (!IS_ELF(ehdr) ||
-+ ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS ||
-+ ehdr.e_ident[EI_DATA] != ELF_TARG_DATA ||
-+ ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
-+ ehdr.e_phentsize != sizeof(ELF_PHDR) ||
-+ ehdr.e_version != ELF_TARG_VER ||
-+ ehdr.e_machine != ELF_TARG_MACH) {
-+ print_debug("not an ELF_EHDR at %p\n", ehdr_addr);
-+ return (0);
-+ }
-+
-+ /* allocate space for all ELF_PHDR's and read */
-+
-+ phdr_addr = ehdr_addr + ehdr.e_phoff;
-+ hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR);
-+
-+ if ((phdrs = malloc(hdrs_size)) == NULL)
-+ return (0);
-+
-+ if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) {
-+ print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr);
-+ return (0);
-+ }
-+
-+ /* find PT_DYNAMIC section */
-+
-+ for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) {
-+ if (phdr->p_type == PT_DYNAMIC)
-+ break;
-+ }
-+
-+ if (i >= ehdr.e_phnum) {
-+ print_debug("PT_DYNAMIC section not found!\n");
-+ free(phdrs);
-+ return (0);
-+ }
-+
-+ /* allocate space and read in ELF_DYN headers */
-+
-+ dyn_addr = phdr->p_vaddr;
-+ hdrs_size = phdr->p_memsz;
-+ free(phdrs);
-+
-+ if ((dyns = malloc(hdrs_size)) == NULL)
-+ return (0);
-+
-+ if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) {
-+ print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr);
-+ free(dyns);
-+ return (0);
-+ }
-+
-+ /* find DT_DEBUG */
-+
-+ dyn = dyns;
-+ while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) {
-+ dyn++;
-+ }
-+
-+ if (dyn->d_tag != DT_DEBUG) {
-+ print_debug("failed to find DT_DEBUG\n");
-+ free(dyns);
-+ return (0);
-+ }
-+
-+ /* read struct r_debug into dmap */
-+
-+ dmap_addr = (uintptr_t)dyn->d_un.d_ptr;
-+ free(dyns);
-+
-+ if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) {
-+ print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr);
-+ return (0);
-+ }
-+
-+ lmap_addr = (uintptr_t)dmap.r_map;
-+
-+ return (lmap_addr);
- }
-+#endif // __FreeBSD__ && __FreeBSD_version < 701000
-
- static bool read_lib_info(struct ps_prochandle* ph) {
-- char fname[32];
-- char buf[256];
-- FILE *fp = NULL;
--
-- sprintf(fname, "/proc/%d/maps", ph->pid);
-- fp = fopen(fname, "r");
-- if (fp == NULL) {
-- print_debug("can't open /proc/%d/maps file\n", ph->pid);
-- return false;
-+#if defined(__FreeBSD__) && __FreeBSD_version >= 701000
-+ struct kinfo_vmentry *freep, *kve;
-+ int i, cnt;
-+
-+ freep = kinfo_getvmmap(ph->pid, &cnt);
-+ if (freep == NULL) {
-+ print_debug("can't get vm map for pid\n", ph->pid);
-+ return false;
- }
-
-- while(fgets_no_cr(buf, 256, fp)){
-- char * word[6];
-- int nwords = split_n_str(buf, 6, word, ' ', '\0');
-- if (nwords > 5 && find_lib(ph, word[5]) == false) {
-- intptr_t base;
-- lib_info* lib;
--#ifdef _LP64
-- sscanf(word[0], "%lx", &base);
--#else
-- sscanf(word[0], "%x", &base);
--#endif
-- if ((lib = add_lib_info(ph, word[5], (uintptr_t)base)) == NULL)
-+ for (i = 0; i < cnt; i++) {
-+ kve = &freep[i];
-+ if ((kve->kve_flags & KVME_FLAG_COW) &&
-+ kve->kve_path != NULL &&
-+ strlen(kve->kve_path) > 0) {
-+
-+ if (find_lib(ph, kve->kve_path) == false) {
-+ lib_info* lib;
-+ if ((lib = add_lib_info(ph, kve->kve_path,
-+ (uintptr_t) kve->kve_start)) == NULL)
- continue; // ignore, add_lib_info prints error
-
-- // we don't need to keep the library open, symtab is already
-- // built. Only for core dump we need to keep the fd open.
-- close(lib->fd);
-- lib->fd = -1;
-+ // we don't need to keep the library open, symtab is already
-+ // built. Only for core dump we need to keep the fd open.
-+ close(lib->fd);
-+ lib->fd = -1;
-+ }
- }
- }
-- fclose(fp);
-+
-+ free(freep);
-+
-+ return true;
-+#else
-+ char *l_name;
-+ struct link_map *lmap;
-+ uintptr_t lmap_addr;
-+
-+ if ((l_name = malloc(BUF_SIZE)) == NULL)
-+ return false;
-+
-+ if ((lmap = malloc(sizeof(*lmap))) == NULL) {
-+ free(l_name);
-+ return false;
-+ }
-+
-+ lmap_addr = linkmap_addr(ph);
-+
-+ if (lmap_addr == 0) {
-+ free(l_name);
-+ free(lmap);
-+ return false;
-+ }
-+
-+ do {
-+ if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) {
-+ print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr);
-+ free (l_name);
-+ free (lmap);
-+ return false;
-+ }
-+
-+ if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name,
-+ BUF_SIZE) != true) {
-+ print_debug("process_read_data failed for lmap->l_name %p\n",
-+ lmap->l_name);
-+ free (l_name);
-+ free (lmap);
-+ return false;
-+ }
-+
-+ if (find_lib(ph, l_name) == false) {
-+ lib_info* lib;
-+ if ((lib = add_lib_info(ph, l_name,
-+ (uintptr_t) lmap->l_addr)) == NULL)
-+ continue; // ignore, add_lib_info prints error
-+
-+ // we don't need to keep the library open, symtab is already
-+ // built. Only for core dump we need to keep the fd open.
-+ close(lib->fd);
-+ lib->fd = -1;
-+ }
-+ lmap_addr = (uintptr_t)lmap->l_next;
-+ } while (lmap->l_next != NULL);
-+
-+ free (l_name);
-+ free (lmap);
-+
- return true;
-+#endif
- }
-
- // detach a given pid
- static bool ptrace_detach(pid_t pid) {
-- if (pid && ptrace(PTRACE_DETACH, pid, NULL, NULL) < 0) {
-+ if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) {
- print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
- return false;
- } else {
- return true;
-- }
--}
--
--// detach all pids of a ps_prochandle
--static void detach_all_pids(struct ps_prochandle* ph) {
-- thread_info* thr = ph->threads;
-- while (thr) {
-- ptrace_detach(thr->lwp_id);
-- thr = thr->next;
-- }
-+ }
- }
-
- static void process_cleanup(struct ps_prochandle* ph) {
-- detach_all_pids(ph);
-+ ptrace_detach(ph->pid);
- }
-
- static ps_prochandle_ops process_ops = {
- .release= process_cleanup,
- .p_pread= process_read_data,
- .p_pwrite= process_write_data,
-- .get_lwp_regs= process_get_lwp_regs
-+ .get_lwp_regs= process_get_lwp_regs,
-+ .get_lwp_info= process_get_lwp_info
- };
-
- // attach to the process. One and only one exposed stuff
-@@ -323,21 +437,14 @@
- // read library info and symbol tables, must do this before attaching threads,
- // as the symbols in the pthread library will be used to figure out
- // the list of threads within the same process.
-- read_lib_info(ph);
--
-+ if (read_lib_info(ph) != true) {
-+ ptrace_detach(pid);
-+ free(ph);
-+ return NULL;
-+ }
-+
- // read thread info
- read_thread_info(ph, add_new_thread);
-
-- // attach to the threads
-- thr = ph->threads;
-- while (thr) {
-- // don't attach to the main thread again
-- if (ph->pid != thr->lwp_id && ptrace_attach(thr->lwp_id) != true) {
-- // even if one attach fails, we get return NULL
-- Prelease(ph);
-- return NULL;
-- }
-- thr = thr->next;
-- }
- return ph;
- }
---- hotspot/agent/src/os/bsd/salibelf.c
-+++ hotspot/agent/src/os/bsd/salibelf.c
-@@ -25,6 +25,7 @@
- #include "salibelf.h"
- #include <stdlib.h>
- #include <unistd.h>
-+#include <string.h>
-
- extern void print_debug(const char*,...);
-
---- hotspot/agent/src/os/bsd/symtab.c
-+++ hotspot/agent/src/os/bsd/symtab.c
-@@ -23,10 +23,11 @@
- */
-
- #include <unistd.h>
--#include <sys/procfs.h>
- #include <search.h>
- #include <stdlib.h>
- #include <string.h>
-+#include <db.h>
-+#include <fcntl.h>
- #include "symtab.h"
- #include "salibelf.h"
-
-@@ -50,279 +51,12 @@
- char *strs;
- size_t num_symbols;
- struct elf_symbol *symbols;
-- struct hsearch_data *hash_table;
-+ DB* hash_table;
- } symtab_t;
-
--
--// Directory that contains global debuginfo files. In theory it
--// should be possible to change this, but in a Java environment there
--// is no obvious place to put a user interface to do it. Maybe this
--// could be set with an environment variable.
--static const char debug_file_directory[] = "/usr/lib/debug";
--
--/* The CRC used in gnu_debuglink, retrieved from
-- http://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html#Separate-Debug-Files. */
--unsigned int gnu_debuglink_crc32 (unsigned int crc,
-- unsigned char *buf, size_t len)
--{
-- static const unsigned int crc32_table[256] =
-- {
-- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
-- 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
-- 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
-- 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
-- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
-- 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
-- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
-- 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
-- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
-- 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
-- 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
-- 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
-- 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
-- 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
-- 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
-- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
-- 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
-- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
-- 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
-- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
-- 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
-- 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
-- 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
-- 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
-- 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
-- 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
-- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
-- 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
-- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
-- 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
-- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
-- 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
-- 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
-- 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
-- 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
-- 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
-- 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
-- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
-- 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
-- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
-- 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
-- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
-- 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
-- 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
-- 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
-- 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
-- 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
-- 0x2d02ef8d
-- };
-- unsigned char *end;
--
-- crc = ~crc & 0xffffffff;
-- for (end = buf + len; buf < end; ++buf)
-- crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
-- return ~crc & 0xffffffff;
--}
--
--/* Open a debuginfo file and check its CRC. If it exists and the CRC
-- matches return its fd. */
--static int
--open_debug_file (const char *pathname, unsigned int crc)
--{
-- unsigned int file_crc = 0;
-- unsigned char buffer[8 * 1024];
--
-- int fd = pathmap_open(pathname);
--
-- if (fd < 0)
-- return -1;
--
-- lseek(fd, 0, SEEK_SET);
--
-- for (;;) {
-- int len = read(fd, buffer, sizeof buffer);
-- if (len <= 0)
-- break;
-- file_crc = gnu_debuglink_crc32(file_crc, buffer, len);
-- }
--
-- if (crc == file_crc)
-- return fd;
-- else {
-- close(fd);
-- return -1;
-- }
--}
--
--/* Find an ELF section. */
--static struct elf_section *find_section_by_name(char *name,
-- int fd,
-- ELF_EHDR *ehdr,
-- ELF_SHDR *shbuf,
-- struct elf_section *scn_cache)
--{
-- ELF_SHDR* cursct = NULL;
-- char *strtab;
-- int cnt;
--
-- if (scn_cache[ehdr->e_shstrndx].c_data == NULL) {
-- if ((scn_cache[ehdr->e_shstrndx].c_data
-- = read_section_data(fd, ehdr, cursct)) == NULL) {
-- return NULL;
-- }
-- }
--
-- strtab = scn_cache[ehdr->e_shstrndx].c_data;
--
-- for (cursct = shbuf, cnt = 0;
-- cnt < ehdr->e_shnum;
-- cnt++, cursct++) {
-- if (strcmp(cursct->sh_name + strtab, name) == 0) {
-- scn_cache[cnt].c_data = read_section_data(fd, ehdr, cursct);
-- return &scn_cache[cnt];
-- }
-- }
--
-- return NULL;
--}
--
--/* Look for a ".gnu_debuglink" section. If one exists, try to open a
-- suitable debuginfo file. */
--static int open_file_from_debug_link(const char *name,
-- int fd,
-- ELF_EHDR *ehdr,
-- ELF_SHDR *shbuf,
-- struct elf_section *scn_cache)
--{
-- int debug_fd;
-- struct elf_section *debug_link = find_section_by_name(".gnu_debuglink", fd, ehdr,
-- shbuf, scn_cache);
-- if (debug_link == NULL)
-- return -1;
-- char *debug_filename = debug_link->c_data;
-- int offset = (strlen(debug_filename) + 4) >> 2;
-- static unsigned int crc;
-- crc = ((unsigned int*)debug_link->c_data)[offset];
-- char *debug_pathname = malloc(strlen(debug_filename)
-- + strlen(name)
-- + strlen(".debug/")
-- + strlen(debug_file_directory)
-- + 2);
-- strcpy(debug_pathname, name);
-- char *last_slash = strrchr(debug_pathname, '/');
-- if (last_slash == NULL)
-- return -1;
--
-- /* Look in the same directory as the object. */
-- strcpy(last_slash+1, debug_filename);
--
-- debug_fd = open_debug_file(debug_pathname, crc);
-- if (debug_fd >= 0) {
-- free(debug_pathname);
-- return debug_fd;
-- }
--
-- /* Look in a subdirectory named ".debug". */
-- strcpy(last_slash+1, ".debug/");
-- strcat(last_slash, debug_filename);
--
-- debug_fd = open_debug_file(debug_pathname, crc);
-- if (debug_fd >= 0) {
-- free(debug_pathname);
-- return debug_fd;
-- }
--
-- /* Look in /usr/lib/debug + the full pathname. */
-- strcpy(debug_pathname, debug_file_directory);
-- strcat(debug_pathname, name);
-- last_slash = strrchr(debug_pathname, '/');
-- strcpy(last_slash+1, debug_filename);
--
-- debug_fd = open_debug_file(debug_pathname, crc);
-- if (debug_fd >= 0) {
-- free(debug_pathname);
-- return debug_fd;
-- }
--
-- free(debug_pathname);
-- return -1;
--}
--
--static struct symtab* build_symtab_internal(int fd, const char *filename, bool try_debuginfo);
--
--/* Look for a ".gnu_debuglink" section. If one exists, try to open a
-- suitable debuginfo file and read a symbol table from it. */
--static struct symtab *build_symtab_from_debug_link(const char *name,
-- int fd,
-- ELF_EHDR *ehdr,
-- ELF_SHDR *shbuf,
-- struct elf_section *scn_cache)
--{
-- fd = open_file_from_debug_link(name, fd, ehdr, shbuf, scn_cache);
--
-- if (fd >= 0) {
-- struct symtab *symtab = build_symtab_internal(fd, NULL, /* try_debuginfo */ false);
-- close(fd);
-- return symtab;
-- }
--
-- return NULL;
--}
--
--// Given a build_id, find the associated debuginfo file
--static char *
--build_id_to_debug_filename (size_t size, unsigned char *data)
--{
-- char *filename, *s;
--
-- filename = malloc(strlen (debug_file_directory) + (sizeof "/.build-id/" - 1) + 1
-- + 2 * size + (sizeof ".debug" - 1) + 1);
-- s = filename + sprintf (filename, "%s/.build-id/", debug_file_directory);
-- if (size > 0)
-- {
-- size--;
-- s += sprintf (s, "%02x", *data++);
-- }
-- if (size > 0)
-- *s++ = '/';
-- while (size-- > 0)
-- s += sprintf (s, "%02x", *data++);
-- strcpy (s, ".debug");
--
-- return filename;
--}
--
--// Read a build ID note. Try to open any associated debuginfo file
--// and return its symtab
--static struct symtab* build_symtab_from_build_id(Elf64_Nhdr *note)
--{
-- int fd;
-- struct symtab *symtab = NULL;
--
-- unsigned char *bytes
-- = (unsigned char*)(note+1) + note->n_namesz;
-- unsigned char *filename
-- = (build_id_to_debug_filename (note->n_descsz, bytes));
--
-- fd = pathmap_open(filename);
-- if (fd >= 0) {
-- symtab = build_symtab_internal(fd, NULL, /* try_debuginfo */ false);
-- close(fd);
-- }
-- free(filename);
--
-- return symtab;
--}
--
--// read symbol table from given fd. If try_debuginfo) is true, also
--// try to open an associated debuginfo file
--static struct symtab* build_symtab_internal(int fd, const char *filename, bool try_debuginfo) {
-+// read symbol table from given fd.
-+struct symtab* build_symtab(int fd) {
- ELF_EHDR ehdr;
-- char *names = NULL;
- struct symtab* symtab = NULL;
-
- // Reading of elf header
-@@ -331,8 +65,9 @@
- ELF_SHDR* shbuf = NULL;
- ELF_SHDR* cursct = NULL;
- ELF_PHDR* phbuf = NULL;
-- ELF_PHDR* phdr = NULL;
-- int sym_section = SHT_DYNSYM;
-+ int symtab_found = 0;
-+ int dynsym_found = 0;
-+ uint32_t symsection = SHT_SYMTAB;
-
- uintptr_t baseaddr = (uintptr_t)-1;
-
-@@ -349,33 +84,39 @@
-
- baseaddr = find_base_address(fd, &ehdr);
-
-- scn_cache = (struct elf_section *)
-- calloc(ehdr.e_shnum * sizeof(struct elf_section), 1);
-+ scn_cache = calloc(ehdr.e_shnum, sizeof(*scn_cache));
- if (scn_cache == NULL) {
- goto quit;
- }
-
- for (cursct = shbuf, cnt = 0; cnt < ehdr.e_shnum; cnt++) {
- scn_cache[cnt].c_shdr = cursct;
-- if (cursct->sh_type == SHT_SYMTAB || cursct->sh_type == SHT_STRTAB
-- || cursct->sh_type == SHT_NOTE || cursct->sh_type == SHT_DYNSYM) {
-- if ( (scn_cache[cnt].c_data = read_section_data(fd, &ehdr, cursct)) == NULL) {
-+ if (cursct->sh_type == SHT_SYMTAB ||
-+ cursct->sh_type == SHT_STRTAB ||
-+ cursct->sh_type == SHT_DYNSYM) {
-+ if ((scn_cache[cnt].c_data = read_section_data(fd, &ehdr, cursct)) == NULL) {
- goto quit;
- }
- }
-- if (cursct->sh_type == SHT_SYMTAB) {
-- // Full symbol table available so use that
-- sym_section = cursct->sh_type;
-- }
-+
-+ if (cursct->sh_type == SHT_SYMTAB)
-+ symtab_found++;
-+
-+ if (cursct->sh_type == SHT_DYNSYM)
-+ dynsym_found++;
-+
- cursct++;
- }
-
-+ if (!symtab_found && dynsym_found)
-+ symsection = SHT_DYNSYM;
-+
- for (cnt = 1; cnt < ehdr.e_shnum; cnt++) {
- ELF_SHDR *shdr = scn_cache[cnt].c_shdr;
-
-- if (shdr->sh_type == sym_section) {
-+ if (shdr->sh_type == symsection) {
- ELF_SYM *syms;
-- int j, n, rslt;
-+ int j, n;
- size_t size;
-
- // FIXME: there could be multiple data buffers associated with the
-@@ -383,7 +124,7 @@
- // for elf_getdata on Solaris.
-
- // guarantee(symtab == NULL, "multiple symtab");
-- symtab = (struct symtab*)calloc(1, sizeof(struct symtab));
-+ symtab = calloc(1, sizeof(*symtab));
- if (symtab == NULL) {
- goto quit;
- }
-@@ -393,27 +134,32 @@
- // number of symbols
- n = shdr->sh_size / shdr->sh_entsize;
-
-- // create hash table, we use hcreate_r, hsearch_r and hdestroy_r to
-+ // create hash table, we use berkeley db to
- // manipulate the hash table.
-- symtab->hash_table = (struct hsearch_data*) calloc(1, sizeof(struct hsearch_data));
-- rslt = hcreate_r(n, symtab->hash_table);
-- // guarantee(rslt, "unexpected failure: hcreate_r");
-+ symtab->hash_table = dbopen(NULL, O_CREAT | O_RDWR, 0600, DB_HASH, NULL);
-+ // guarantee(symtab->hash_table, "unexpected failure: dbopen");
-+ if (symtab->hash_table == NULL)
-+ goto bad;
-
- // shdr->sh_link points to the section that contains the actual strings
- // for symbol names. the st_name field in ELF_SYM is just the
- // string table index. we make a copy of the string table so the
- // strings will not be destroyed by elf_end.
- size = scn_cache[shdr->sh_link].c_shdr->sh_size;
-- symtab->strs = (char *)malloc(size);
-+ symtab->strs = malloc(size);
-+ if (symtab->strs == NULL)
-+ goto bad;
- memcpy(symtab->strs, scn_cache[shdr->sh_link].c_data, size);
-
- // allocate memory for storing symbol offset and size;
- symtab->num_symbols = n;
-- symtab->symbols = (struct elf_symbol *)calloc(n , sizeof(struct elf_symbol));
-+ symtab->symbols = calloc(n , sizeof(*symtab->symbols));
-+ if (symtab->symbols == NULL)
-+ goto bad;
-
- // copy symbols info our symtab and enter them info the hash table
- for (j = 0; j < n; j++, syms++) {
-- ENTRY item, *ret;
-+ DBT key, value;
- char *sym_name = symtab->strs + syms->st_name;
-
- // skip non-object and non-function symbols
-@@ -427,52 +173,19 @@
- symtab->symbols[j].offset = syms->st_value - baseaddr;
- symtab->symbols[j].size = syms->st_size;
-
-- item.key = sym_name;
-- item.data = (void *)&(symtab->symbols[j]);
--
-- hsearch_r(item, ENTER, &ret, symtab->hash_table);
-+ key.data = sym_name;
-+ key.size = strlen(sym_name) + 1;
-+ value.data = &(symtab->symbols[j]);
-+ value.size = sizeof(void *);
-+ (*symtab->hash_table->put)(symtab->hash_table, &key, &value, 0);
- }
- }
- }
-+ goto quit;
-
-- // Look for a separate debuginfo file.
-- if (try_debuginfo) {
--
-- // We prefer a debug symtab to an object's own symtab, so look in
-- // the debuginfo file. We stash a copy of the old symtab in case
-- // there is no debuginfo.
-- struct symtab* prev_symtab = symtab;
-- symtab = NULL;
--
--#ifdef NT_GNU_BUILD_ID
-- // First we look for a Build ID
-- for (cursct = shbuf, cnt = 0;
-- symtab == NULL && cnt < ehdr.e_shnum;
-- cnt++) {
-- if (cursct->sh_type == SHT_NOTE) {
-- Elf64_Nhdr *note = (Elf64_Nhdr *)scn_cache[cnt].c_data;
-- if (note->n_type == NT_GNU_BUILD_ID) {
-- symtab = build_symtab_from_build_id(note);
-- }
-- }
-- cursct++;
-- }
--#endif
--
-- // Then, if that doesn't work, the debug link
-- if (symtab == NULL) {
-- symtab = build_symtab_from_debug_link(filename, fd, &ehdr, shbuf,
-- scn_cache);
-- }
--
-- // If we still haven't found a symtab, use the object's own symtab.
-- if (symtab != NULL) {
-- if (prev_symtab != NULL)
-- destroy_symtab(prev_symtab);
-- } else {
-- symtab = prev_symtab;
-- }
-- }
-+bad:
-+ destroy_symtab(symtab);
-+ symtab = NULL;
-
- quit:
- if (shbuf) free(shbuf);
-@@ -488,44 +201,36 @@
- return symtab;
- }
-
--struct symtab* build_symtab(int fd, const char *filename) {
-- return build_symtab_internal(fd, filename, /* try_debuginfo */ true);
--}
--
--
- void destroy_symtab(struct symtab* symtab) {
- if (!symtab) return;
- if (symtab->strs) free(symtab->strs);
- if (symtab->symbols) free(symtab->symbols);
- if (symtab->hash_table) {
-- hdestroy_r(symtab->hash_table);
-- free(symtab->hash_table);
-+ (*symtab->hash_table->close)(symtab->hash_table);
- }
- free(symtab);
- }
-
- uintptr_t search_symbol(struct symtab* symtab, uintptr_t base,
- const char *sym_name, int *sym_size) {
-- ENTRY item;
-- ENTRY* ret = NULL;
-+ DBT key, value;
-+ int ret;
-
- // library does not have symbol table
- if (!symtab || !symtab->hash_table)
-- return (uintptr_t)NULL;
-+ return 0;
-
-- item.key = (char*) strdup(sym_name);
-- hsearch_r(item, FIND, &ret, symtab->hash_table);
-- if (ret) {
-- struct elf_symbol * sym = (struct elf_symbol *)(ret->data);
-+ key.data = (char*)(uintptr_t)sym_name;
-+ key.size = strlen(sym_name) + 1;
-+ ret = (*symtab->hash_table->get)(symtab->hash_table, &key, &value, 0);
-+ if (ret == 0) {
-+ struct elf_symbol *sym = value.data;
- uintptr_t rslt = (uintptr_t) ((char*)base + sym->offset);
- if (sym_size) *sym_size = sym->size;
-- free(item.key);
- return rslt;
- }
-
--quit:
-- free(item.key);
-- return (uintptr_t) NULL;
-+ return 0;
- }
-
- const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
-@@ -533,12 +238,12 @@
- int n = 0;
- if (!symtab) return NULL;
- for (; n < symtab->num_symbols; n++) {
-- struct elf_symbol* sym = &(symtab->symbols[n]);
-- if (sym->name != NULL &&
-- offset >= sym->offset && offset < sym->offset + sym->size) {
-- if (poffset) *poffset = (offset - sym->offset);
-- return sym->name;
-- }
-+ struct elf_symbol* sym = &symtab->symbols[n];
-+ if (sym->name != NULL &&
-+ offset >= sym->offset && offset < sym->offset + sym->size) {
-+ if (poffset) *poffset = (offset - sym->offset);
-+ return sym->name;
-+ }
- }
- return NULL;
- }
---- hotspot/agent/src/os/bsd/symtab.h
-+++ hotspot/agent/src/os/bsd/symtab.h
-@@ -32,7 +32,7 @@
- struct symtab;
-
- // build symbol table for a given ELF file descriptor
--struct symtab* build_symtab(int fd, const char *filename);
-+struct symtab* build_symtab(int fd);
-
- // destroy the symbol table
- void destroy_symtab(struct symtab* symtab);
---- hotspot/agent/src/os/bsd/test.c
-+++ hotspot/agent/src/os/bsd/test.c
-@@ -44,7 +44,7 @@
- }
-
- default: {
-- printf("usage %s <pid> or %s <exec file> <core file>\n");
-+ fprintf(stderr, "usage %s <pid> or %s <exec file> <core file>\n", argv[0], argv[0]);
- return 1;
- }
- }
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java
-@@ -28,6 +28,7 @@
- import java.net.*;
- import java.rmi.*;
- import sun.jvm.hotspot.debugger.*;
-+import sun.jvm.hotspot.debugger.bsd.*;
- import sun.jvm.hotspot.debugger.dbx.*;
- import sun.jvm.hotspot.debugger.proc.*;
- import sun.jvm.hotspot.debugger.remote.*;
-@@ -337,6 +338,8 @@
- setupDebuggerWin32();
- } else if (os.equals("linux")) {
- setupDebuggerLinux();
-+ } else if (os.equals("bsd")) {
-+ setupDebuggerBsd();
- } else {
- // Add support for more operating systems here
- throw new DebuggerException("Operating system " + os + " not yet supported");
-@@ -392,6 +395,10 @@
- db = new HotSpotTypeDataBase(machDesc,
- new LinuxVtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
-+ } else if (os.equals("bsd")) {
-+ db = new HotSpotTypeDataBase(machDesc,
-+ new BsdVtblAccess(debugger, jvmLibNames),
-+ debugger, jvmLibNames);
- } else {
- throw new DebuggerException("OS \"" + os + "\" not yet supported (no VtblAccess yet)");
- }
-@@ -557,6 +564,8 @@
- setupJVMLibNamesWin32();
- } else if (os.equals("linux")) {
- setupJVMLibNamesLinux();
-+ } else if (os.equals("bsd")) {
-+ setupJVMLibNamesBsd();
- } else {
- throw new RuntimeException("Unknown OS type");
- }
-@@ -638,6 +647,31 @@
- jvmLibNames = new String[] { "libjvm.so", "libjvm_g.so" };
- }
-
-+ //
-+ // BSD
-+ //
-+
-+ private void setupDebuggerBsd() {
-+ setupJVMLibNamesBsd();
-+
-+ if (cpu.equals("x86")) {
-+ machDesc = new MachineDescriptionIntelX86();
-+ } else if (cpu.equals("amd64")) {
-+ machDesc = new MachineDescriptionAMD64();
-+ } else {
-+ throw new DebuggerException("BSD only supported on x86/amd64");
-+ }
-+
-+ BsdDebuggerLocal dbg = new BsdDebuggerLocal(machDesc, !isServer);
-+ debugger = dbg;
-+
-+ attachDebugger();
-+ }
-+
-+ private void setupJVMLibNamesBsd() {
-+ jvmLibNames = new String[] { "libjvm.so", "libjvm_g.so" };
-+ }
-+
- /** Convenience routine which should be called by per-platform
- debugger setup. Should not be called when startupMode is
- REMOTE_MODE. */
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java
-@@ -29,6 +29,7 @@
- import java.rmi.*;
- import sun.jvm.hotspot.*;
- import sun.jvm.hotspot.debugger.*;
-+import sun.jvm.hotspot.debugger.bsd.*;
- import sun.jvm.hotspot.debugger.dbx.*;
- import sun.jvm.hotspot.debugger.proc.*;
- import sun.jvm.hotspot.debugger.cdbg.*;
-@@ -516,6 +517,8 @@
- setupDebuggerWin32();
- } else if (os.equals("linux")) {
- setupDebuggerLinux();
-+ } else if (os.equals("bsd")) {
-+ setupDebuggerBsd();
- } else {
- // Add support for more operating systems here
- throw new DebuggerException("Operating system " + os + " not yet supported");
-@@ -567,6 +570,9 @@
- } else if (os.equals("linux")) {
- db = new HotSpotTypeDataBase(machDesc, new LinuxVtblAccess(debugger, jvmLibNames),
- debugger, jvmLibNames);
-+ } else if (os.equals("bsd")) {
-+ db = new HotSpotTypeDataBase(machDesc, new BsdVtblAccess(debugger, jvmLibNames),
-+ debugger, jvmLibNames);
- } else {
- throw new DebuggerException("OS \"" + os + "\" not yet supported (no VtblAccess implemented yet)");
- }
-@@ -739,6 +745,8 @@
- setupJVMLibNamesWin32();
- } else if (os.equals("linux")) {
- setupJVMLibNamesLinux();
-+ } else if (os.equals("bsd")) {
-+ setupJVMLibNamesBsd();
- } else {
- throw new RuntimeException("Unknown OS type");
- }
-@@ -822,6 +830,34 @@
- setupJVMLibNamesSolaris();
- }
-
-+ //
-+ // BSD
-+ //
-+
-+ private void setupDebuggerBsd() {
-+ setupJVMLibNamesBsd();
-+
-+ if (cpu.equals("x86")) {
-+ machDesc = new MachineDescriptionIntelX86();
-+ } else if (cpu.equals("amd64")) {
-+ machDesc = new MachineDescriptionAMD64();
-+ } else {
-+ throw new DebuggerException("BSD only supported on x86/amd64");
-+ }
-+
-+ // Note we do not use a cache for the local debugger in server
-+ // mode; it will be taken care of on the client side (once remote
-+ // debugging is implemented).
-+
-+ debugger = new BsdDebuggerLocal(machDesc, !isServer);
-+ attachDebugger();
-+ }
-+
-+ private void setupJVMLibNamesBsd() {
-+ // same as solaris
-+ setupJVMLibNamesSolaris();
-+ }
-+
- /** Convenience routine which should be called by per-platform
- debugger setup. Should not be called when startupMode is
- REMOTE_MODE. */
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java
-@@ -30,10 +30,8 @@
- import sun.jvm.hotspot.debugger.cdbg.*;
- import sun.jvm.hotspot.debugger.x86.*;
- import sun.jvm.hotspot.debugger.amd64.*;
--import sun.jvm.hotspot.debugger.sparc.*;
- import sun.jvm.hotspot.debugger.bsd.x86.*;
- import sun.jvm.hotspot.debugger.bsd.amd64.*;
--import sun.jvm.hotspot.debugger.bsd.sparc.*;
- import sun.jvm.hotspot.utilities.*;
-
- class BsdCDebugger implements CDebugger {
-@@ -99,13 +97,6 @@
- Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
- if (pc == null) return null;
- return new BsdAMD64CFrame(dbg, rbp, pc);
-- } else if (cpu.equals("sparc")) {
-- SPARCThreadContext context = (SPARCThreadContext) thread.getContext();
-- Address sp = context.getRegisterAsAddress(SPARCThreadContext.R_SP);
-- if (sp == null) return null;
-- Address pc = context.getRegisterAsAddress(SPARCThreadContext.R_O7);
-- if (pc == null) return null;
-- return new BsdSPARCCFrame(dbg, sp, pc, BsdDebuggerLocal.getAddressSize());
- } else {
- throw new DebuggerException(cpu + " is not yet supported");
- }
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java
-@@ -26,9 +26,7 @@
-
- import sun.jvm.hotspot.debugger.*;
- import sun.jvm.hotspot.debugger.bsd.amd64.*;
--import sun.jvm.hotspot.debugger.bsd.ia64.*;
- import sun.jvm.hotspot.debugger.bsd.x86.*;
--import sun.jvm.hotspot.debugger.bsd.sparc.*;
-
- class BsdThreadContextFactory {
- static ThreadContext createThreadContext(BsdDebugger dbg) {
-@@ -37,10 +35,6 @@
- return new BsdX86ThreadContext(dbg);
- } else if (cpu.equals("amd64")) {
- return new BsdAMD64ThreadContext(dbg);
-- } else if (cpu.equals("ia64")) {
-- return new BsdIA64ThreadContext(dbg);
-- } else if (cpu.equals("sparc")) {
-- return new BsdSPARCThreadContext(dbg);
- } else {
- throw new RuntimeException("cpu " + cpu + " is not yet supported");
- }
--- hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/ConnectorImpl.java
+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/ConnectorImpl.java
@@ -217,7 +217,7 @@
}
protected void checkNativeLink(SecurityManager sm, String os) {
-- if (os.equals("SunOS") || os.equals("Linux")) {
-+ if (os.equals("SunOS") || os.equals("Linux") || os.equals("FreeBSD")) {
- // link "saproc" - SA native library on SunOS and Linux?
+- if (os.equals("SunOS") || os.equals("Linux") || os.contains("OS X")) {
++ if (os.equals("SunOS") || os.equals("Linux") || os.equals("FreeBSD") || os.contains("OS X")) {
+ // link "saproc" - SA native library on SunOS, Linux, and Mac OS X
sm.checkLink("saproc");
} else if (os.startsWith("Windows")) {
--- hotspot/agent/src/share/classes/sun/jvm/hotspot/jdi/SAPIDAttachingConnector.java
@@ -2780,1335 +577,64 @@
// Whether the caller can read /proc/<pid> file?
sm.checkRead("/proc/" + pid);
}
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java
-@@ -37,6 +37,8 @@
- import sun.jvm.hotspot.runtime.linux_ia64.LinuxIA64JavaThreadPDAccess;
- import sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess;
- import sun.jvm.hotspot.runtime.linux_sparc.LinuxSPARCJavaThreadPDAccess;
-+import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
-+import sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess;
- import sun.jvm.hotspot.utilities.*;
-
- public class Threads {
-@@ -90,7 +92,12 @@
- } else if (cpu.equals("sparc")) {
- access = new LinuxSPARCJavaThreadPDAccess();
- }
--
-+ } else if (os.equals("bsd")) {
-+ if (cpu.equals("x86")) {
-+ access = new BsdX86JavaThreadPDAccess();
-+ } else if (cpu.equals("amd64")) {
-+ access = new BsdAMD64JavaThreadPDAccess();
-+ }
- }
-
- if (access == null) {
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd/BsdSignals.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd/BsdSignals.java
-@@ -28,37 +28,36 @@
- private static String[] signalNames = {
- "", /* No signal 0 */
- "SIGHUP", /* hangup */
-- "SIGINT", /* interrupt (rubout) */
-- "SIGQUIT", /* quit (ASCII FS) */
-- "SIGILL", /* illegal instruction (not reset when caught) */
-+ "SIGINT", /* interrupt */
-+ "SIGQUIT", /* quit */
-+ "SIGILL", /* illegal instr. (not reset when caught) */
- "SIGTRAP", /* trace trap (not reset when caught) */
-- "SIGABRT", /* used by abort, replace SIGIOT in the future */
-- "SIGIOT",
-- "SIGBUS",
-+ "SIGABRT", /* abort() */
-+ "SIGEMT", /* EMT instruction */
- "SIGFPE", /* floating point exception */
- "SIGKILL", /* kill (cannot be caught or ignored) */
-- "SIGUSR1", /* user defined signal 1 */
-+ "SIGBUS", /* bus error */
- "SIGSEGV", /* segmentation violation */
-- "SIGUSR2", /* user defined signal 2 */
-+ "SIGSYS", /* non-existent system call invoked */
- "SIGPIPE", /* write on a pipe with no one to read it */
- "SIGALRM", /* alarm clock */
- "SIGTERM", /* software termination signal from kill */
-- "SIGSTKFLT",
-- "SIGCHLD", /* child status change alias */
-- "SIGCONT", /* stopped process has been continued */
-- "SIGSTOP", /* stop (cannot be caught or ignored) */
-- "SIGTSTP", /* user stop requested from tty */
-- "SIGTTIN", /* background tty read attempted */
-- "SIGTTOU", /* background tty write attempted */
-- "SIGURG", /* urgent socket condition */
-- "SIGXCPU", /* exceeded cpu limit */
-+ "SIGURG", /* urgent condition on IO channel */
-+ "SIGSTOP", /* sendable stop signal not from tty */
-+ "SIGTSTP", /* stop signal from tty */
-+ "SIGCONT", /* continue a stopped process */
-+ "SIGCHLD", /* to parent on child stop or exit */
-+ "SIGTTIN", /* to readers pgrp upon background tty read */
-+ "SIGTTOU", /* like TTIN if (tp->t_local&LTOSTOP) */
-+ "SIGIO", /* input/output possible signal */
-+ "SIGXCPU", /* exceeded CPU time limit */
- "SIGXFSZ", /* exceeded file size limit */
-- "SIGVTALRM", /* virtual timer expired */
-- "SIGPROF", /* profiling timer expired */
-- "SIGWINCH", /* window size change */
-- "SIGPOLL", /* pollable event occured */
-- "SIGPWR", /* power-fail restart */
-- "SIGSYS"
-+ "SIGVTALRM", /* virtual time alarm */
-+ "SIGPROF", /* profiling time alarm */
-+ "SIGWINCH", /* window size changes */
-+ "SIGINFO", /* information request */
-+ "SIGUSR1", /* user defined signal 1 */
-+ "SIGUSR2" /* user defined signal 2 */
- };
-
- public static String getSignalName(int sigNum) {
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java
-@@ -28,37 +28,36 @@
- private static String[] signalNames = {
- "", /* No signal 0 */
- "SIGHUP", /* hangup */
-- "SIGINT", /* interrupt (rubout) */
-- "SIGQUIT", /* quit (ASCII FS) */
-- "SIGILL", /* illegal instruction (not reset when caught) */
-+ "SIGINT", /* interrupt */
-+ "SIGQUIT", /* quit */
-+ "SIGILL", /* illegal instr. (not reset when caught) */
- "SIGTRAP", /* trace trap (not reset when caught) */
-- "SIGABRT", /* used by abort, replace SIGIOT in the future */
-- "SIGIOT",
-- "SIGBUS",
-+ "SIGABRT", /* abort() */
-+ "SIGEMT", /* EMT instruction */
- "SIGFPE", /* floating point exception */
- "SIGKILL", /* kill (cannot be caught or ignored) */
-- "SIGUSR1", /* user defined signal 1 */
-+ "SIGBUS", /* bus error */
- "SIGSEGV", /* segmentation violation */
-- "SIGUSR2", /* user defined signal 2 */
-+ "SIGSYS", /* non-existent system call invoked */
- "SIGPIPE", /* write on a pipe with no one to read it */
- "SIGALRM", /* alarm clock */
- "SIGTERM", /* software termination signal from kill */
-- "SIGSTKFLT",
-- "SIGCHLD", /* child status change alias */
-- "SIGCONT", /* stopped process has been continued */
-- "SIGSTOP", /* stop (cannot be caught or ignored) */
-- "SIGTSTP", /* user stop requested from tty */
-- "SIGTTIN", /* background tty read attempted */
-- "SIGTTOU", /* background tty write attempted */
-- "SIGURG", /* urgent socket condition */
-- "SIGXCPU", /* exceeded cpu limit */
-+ "SIGURG", /* urgent condition on IO channel */
-+ "SIGSTOP", /* sendable stop signal not from tty */
-+ "SIGTSTP", /* stop signal from tty */
-+ "SIGCONT", /* continue a stopped process */
-+ "SIGCHLD", /* to parent on child stop or exit */
-+ "SIGTTIN", /* to readers pgrp upon background tty read */
-+ "SIGTTOU", /* like TTIN if (tp->t_local&LTOSTOP) */
-+ "SIGIO", /* input/output possible signal */
-+ "SIGXCPU", /* exceeded CPU time limit */
- "SIGXFSZ", /* exceeded file size limit */
-- "SIGVTALRM", /* virtual timer expired */
-- "SIGPROF", /* profiling timer expired */
-- "SIGWINCH", /* window size change */
-- "SIGPOLL", /* pollable event occured */
-- "SIGPWR", /* power-fail restart */
-- "SIGSYS"
-+ "SIGVTALRM", /* virtual time alarm */
-+ "SIGPROF", /* profiling time alarm */
-+ "SIGWINCH", /* window size changes */
-+ "SIGINFO", /* information request */
-+ "SIGUSR1", /* user defined signal 1 */
-+ "SIGUSR2" /* user defined signal 2 */
- };
-
- public static String getSignalName(int sigNum) {
---- hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java
-+++ hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java
-@@ -37,6 +37,14 @@
- return "solaris";
- } else if (os.equals("Linux")) {
- return "linux";
-+ } else if (os.equals("FreeBSD")) {
-+ return "bsd";
-+ } else if (os.equals("NetBSD")) {
-+ return "bsd";
-+ } else if (os.equals("OpenBSD")) {
-+ return "bsd";
-+ } else if (os.equals("Darwin")) {
-+ return "bsd";
- } else if (os.startsWith("Windows")) {
- return "win32";
- } else {
---- hotspot/make/Makefile
-+++ hotspot/make/Makefile
-@@ -321,28 +321,28 @@
- ifneq ($(OSNAME),windows)
- ifeq ($(ZERO_BUILD), true)
- ifeq ($(SHARK_BUILD), true)
--$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(SHARK_DIR)/%.so
-+$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_SERVER_DIR)/%.so: $(SHARK_DIR)/%.so
-+$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
- else
--$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(ZERO_DIR)/%.so
-+$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_SERVER_DIR)/%.so: $(ZERO_DIR)/%.so
-+$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
- endif
- else
--$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(C1_DIR)/%.so
-+$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(C2_DIR)/%.so
-+$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_CLIENT_DIR)/%.so: $(C1_DIR)/%.so
-+$(EXPORT_CLIENT_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_CLIENT_DIR)/64/%.so: $(C1_DIR)/%.so
-+$(EXPORT_CLIENT_DIR)/64/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_SERVER_DIR)/%.so: $(C2_DIR)/%.so
-+$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
--$(EXPORT_SERVER_DIR)/64/%.so: $(C2_DIR)/%.so
-+$(EXPORT_SERVER_DIR)/64/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
- $(install-file)
- endif
- endif
---- hotspot/make/bsd/Makefile
-+++ hotspot/make/bsd/Makefile
-@@ -230,7 +230,8 @@
- # Solaris 2.5.1, 2.6).
- # Disable this check by setting DISABLE_HOTSPOT_OS_VERSION_CHECK=ok.
-
--SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
-+#SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
-+DISABLE_HOTSPOT_OS_VERSION_CHECK = ok
- OS_VERSION := $(shell uname -r)
- EMPTY_IF_NOT_SUPPORTED = $(filter $(SUPPORTED_OS_VERSION),$(OS_VERSION))
-
---- hotspot/make/bsd/makefiles/adlc.make
-+++ hotspot/make/bsd/makefiles/adlc.make
-@@ -60,7 +60,8 @@
-
- # CFLAGS_WARN holds compiler options to suppress/enable warnings.
- # Compiler warnings are treated as errors
--CFLAGS_WARN = -Werror
-+WARNINGS_ARE_ERRORS ?= -Werror
-+CFLAGS_WARN = $(WARNINGS_ARE_ERRORS)
- CFLAGS += $(CFLAGS_WARN)
-
- OBJECTNAMES = \
---- hotspot/make/bsd/makefiles/buildtree.make
-+++ hotspot/make/bsd/makefiles/buildtree.make
-@@ -303,10 +303,11 @@
- [ -n "$$JAVA_HOME" ] && { echo ": \$${JAVA_HOME:=$${JAVA_HOME}}"; }; \
- { \
- echo "LD_LIBRARY_PATH=.:$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}\$${JAVA_HOME}/jre/lib/${LIBARCH}/native_threads:\$${JAVA_HOME}/jre/lib/${LIBARCH}:${GCC_LIB}"; \
-+ echo "DYLD_LIBRARY_PATH=.:$${DYLD_LIBRARY_PATH:+$$DYLD_LIBRARY_PATH:}\$${JAVA_HOME}/jre/lib/${LIBARCH}/native_threads:\$${JAVA_HOME}/jre/lib/${LIBARCH}:${GCC_LIB}"; \
- echo "CLASSPATH=$${CLASSPATH:+$$CLASSPATH:}.:\$${JAVA_HOME}/jre/lib/rt.jar:\$${JAVA_HOME}/jre/lib/i18n.jar"; \
- } | sed s:$${JAVA_HOME:--------}:\$${JAVA_HOME}:g; \
- echo "HOTSPOT_BUILD_USER=\"$${LOGNAME:-$$USER} in `basename $(GAMMADIR)`\""; \
-- echo "export JAVA_HOME LD_LIBRARY_PATH CLASSPATH HOTSPOT_BUILD_USER"; \
-+ echo "export JAVA_HOME LD_LIBRARY_PATH DYLD_LIBRARY_PATH CLASSPATH HOTSPOT_BUILD_USER"; \
- ) > $@
-
- env.csh: env.sh
---- hotspot/make/bsd/makefiles/cscope.make
-+++ hotspot/make/bsd/makefiles/cscope.make
-@@ -71,7 +71,7 @@
- # OS-specific files for other systems are excluded by default. Use CS_OS=yes
- # to include platform-specific files for other platforms.
- ifndef CS_OS
--CS_OS = bsd macos solaris win32
-+CS_OS = linux macos solaris win32 bsd
- CS_PRUNE_OS = $(patsubst %,-o -name '*%*',$(filter-out ${OS},${CS_OS}))
- endif
-
---- hotspot/make/bsd/makefiles/defs.make
-+++ hotspot/make/bsd/makefiles/defs.make
-@@ -72,8 +72,8 @@
- HS_ARCH = sparc
- endif
-
--# x86_64
--ifeq ($(ARCH), x86_64)
-+# amd64
-+ifeq ($(ARCH), amd64)
- ifeq ($(ARCH_DATA_MODEL), 64)
- ARCH_DATA_MODEL = 64
- MAKE_ARGS += LP64=1
-@@ -85,17 +85,27 @@
- PLATFORM = bsd-i586
- VM_PLATFORM = bsd_i486
- HS_ARCH = x86
-- # We have to reset ARCH to i686 since SRCARCH relies on it
-- ARCH = i686
-+ # We have to reset ARCH to i386 since SRCARCH relies on it
-+ ARCH = i386
- endif
- endif
-
--# i686
--ifeq ($(ARCH), i686)
-- ARCH_DATA_MODEL = 32
-- PLATFORM = bsd-i586
-- VM_PLATFORM = bsd_i486
-- HS_ARCH = x86
-+# i386
-+ifeq ($(ARCH), i386)
-+ ifeq ($(ARCH_DATA_MODEL), 64)
-+ ARCH_DATA_MODEL = 64
-+ MAKE_ARGS += LP64=1
-+ PLATFORM = bsd-amd64
-+ VM_PLATFORM = bsd_amd64
-+ HS_ARCH = x86
-+ # We have to reset ARCH to amd64 since SRCARCH relies on it
-+ ARCH = amd64
-+ else
-+ ARCH_DATA_MODEL = 32
-+ PLATFORM = bsd-i586
-+ VM_PLATFORM = bsd_i486
-+ HS_ARCH = x86
-+ endif
- endif
-
- # ARM
-@@ -116,39 +126,45 @@
-
- JDK_INCLUDE_SUBDIR=bsd
-
-+# Library suffix
-+OS_VENDOR:=$(shell uname -s)
-+ifeq ($(OS_VENDOR),Darwin)
-+ LIBRARY_SUFFIX=dylib
-+else
-+ LIBRARY_SUFFIX=so
-+endif
-+
- # FIXUP: The subdirectory for a debug build is NOT the same on all platforms
- VM_DEBUG=jvmg
-
- EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
-
- # client and server subdirectories have symbolic links to ../libjsig.so
--EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.so
-+EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX)
- EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
-
- ifndef BUILD_CLIENT_ONLY
- EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
--EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.so
-+EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
- endif
-
- ifneq ($(ZERO_BUILD), true)
- ifeq ($(ARCH_DATA_MODEL), 32)
- EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
- EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
-- EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.so
-+ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
- endif
- endif
-
- # Serviceability Binaries
- # No SA Support for PPC, IA64, ARM or zero
--ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so \
-- $(EXPORT_LIB_DIR)/sa-jdi.jar
--ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so \
-- $(EXPORT_LIB_DIR)/sa-jdi.jar
--ADD_SA_BINARIES/ppc =
--ADD_SA_BINARIES/ia64 =
--ADD_SA_BINARIES/arm =
--ADD_SA_BINARIES/zero =
-+ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
-+ $(EXPORT_LIB_DIR)/sa-jdi.jar
-+ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
-+ $(EXPORT_LIB_DIR)/sa-jdi.jar
-+ADD_SA_BINARIES/ppc =
-+ADD_SA_BINARIES/ia64 =
-+ADD_SA_BINARIES/arm =
-+ADD_SA_BINARIES/zero =
-
- EXPORT_LIST += $(ADD_SA_BINARIES/$(HS_ARCH))
--
--
--- hotspot/make/bsd/makefiles/gcc.make
+++ hotspot/make/bsd/makefiles/gcc.make
-@@ -22,20 +22,24 @@
- #
- #
-
-+OS_VENDOR = $(shell uname -s)
-+
- #------------------------------------------------------------------------
- # CC, CPP & AS
-
- # When cross-compiling the ALT_COMPILER_PATH points
- # to the cross-compilation toolset
- ifdef CROSS_COMPILE_ARCH
-+CXX = $(ALT_COMPILER_PATH)/g++
- CPP = $(ALT_COMPILER_PATH)/g++
- CC = $(ALT_COMPILER_PATH)/gcc
- else
--CPP = g++
--CC = gcc
-+CXX ?= g++
-+CPP = $(CXX)
-+CC ?= gcc
- endif
-
--AS = $(CC) -c
-+AS = $(CC) -c -x assembler-with-cpp
-
- # -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
- # prints the numbers (e.g. "2.95", "3.2.1")
-@@ -73,7 +77,7 @@
- CFLAGS += $(VM_PICFLAG)
- CFLAGS += -fno-rtti
- CFLAGS += -fno-exceptions
--CFLAGS += -D_REENTRANT
-+CFLAGS += -pthread
- CFLAGS += -fcheck-new
-
- ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
-@@ -82,10 +86,12 @@
- ARCHFLAG/ia64 =
- ARCHFLAG/sparc = -m32 -mcpu=v9
- ARCHFLAG/sparcv9 = -m64 -mcpu=v9
--ARCHFLAG/arm = -fsigned-char
- ARCHFLAG/zero = $(ZERO_ARCHFLAG)
--ifndef E500V2
--ARCHFLAG/ppc = -mcpu=powerpc
-+
-+# Darwin-specific build flags
-+ifeq ($(OS_VENDOR), Darwin)
-+ # Ineffecient 16-byte stack re-alignment on Darwin/IA32
-+ ARCHFLAG/i486 += -mstackrealign
+@@ -35,8 +35,8 @@
+ HOSTCXX = g++
+ HOSTCC = gcc
+ else ifneq ($(OS_VENDOR), Darwin)
+- CXX = g++
+- CC = gcc
++ CXX ?= g++
++ CC ?= gcc
+ HOSTCXX = $(CXX)
+ HOSTCC = $(CC)
endif
-
- CFLAGS += $(ARCHFLAG)
-@@ -115,7 +121,7 @@
- endif
-
- # Compiler warnings are treated as errors
--WARNINGS_ARE_ERRORS = -Werror
-+WARNINGS_ARE_ERRORS ?= -Werror
-
- # Except for a few acceptable ones
- # Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
-@@ -130,6 +136,11 @@
- CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS)
- # Special cases
- CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
-+# XXXDARWIN: for _dyld_bind_fully_image_containing_address
-+ifeq ($(OS_VENDOR), Darwin)
-+ CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
-+endif
-+
-
- # The flags to use for an Optimized g++ build
- OPT_CFLAGS += -O3
-@@ -175,28 +186,40 @@
- LFLAGS += -Wl,-relax
- endif
-
--# Enable linker optimization
--LFLAGS += -Xlinker -O1
--
--# If this is a --hash-style=gnu system, use --hash-style=both
--# The gnu .hash section won't work on some Bsd systems like SuSE 10.
--_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
--ifneq ($(_HAS_HASH_STYLE_GNU),)
-- LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
--endif
--LFLAGS += $(LDFLAGS_HASH_STYLE)
--
- # Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
- MAPFLAG = -Xlinker --version-script=FILENAME
-
--# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
--SONAMEFLAG = -Xlinker -soname=SONAME
-+#
-+# Shared Library
-+#
-+ifeq ($(OS_VENDOR), Darwin)
-+ # Standard linker flags
-+ LFLAGS +=
-+
-+ # Darwin doesn't use ELF and doesn't support version scripts
-+ LDNOMAP = true
-+
-+ # Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
-+ SONAMEFLAG =
-+
-+ # Build shared library
-+ SHARED_FLAG = -dynamiclib $(VM_PICFLAG)
-
--# Build shared library
--SHARED_FLAG = -shared
-+ # Keep symbols even they are not used
-+ #AOUT_FLAGS += -export-dynamic
-+else
-+ # Enable linker optimization
-+ LFLAGS += -Xlinker -O1
-+
-+ # Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
-+ SONAMEFLAG = -Xlinker -soname=SONAME
-
--# Keep symbols even they are not used
--AOUT_FLAGS += -export-dynamic
-+ # Build shared library
-+ SHARED_FLAG = -shared $(VM_PICFLAG)
-+
-+ # Keep symbols even they are not used
-+ AOUT_FLAGS += -export-dynamic
-+endif
-
- #------------------------------------------------------------------------
- # Debug flags
---- hotspot/make/bsd/makefiles/jsig.make
-+++ hotspot/make/bsd/makefiles/jsig.make
-@@ -25,11 +25,16 @@
- # Rules to build signal interposition library, used by vm.make
-
- # libjsig[_g].so: signal interposition library
--JSIG = jsig
--LIBJSIG = lib$(JSIG).so
-+JSIG = jsig
-+JSIG_G = $(JSIG)$(G_SUFFIX)
-
--JSIG_G = $(JSIG)$(G_SUFFIX)
--LIBJSIG_G = lib$(JSIG_G).so
-+ifeq ($(OS_VENDOR), Darwin)
-+ LIBJSIG = lib$(JSIG).dylib
-+ LIBJSIG_G = lib$(JSIG_G).dylib
-+else
-+ LIBJSIG = lib$(JSIG).so
-+ LIBJSIG_G = lib$(JSIG_G).so
-+endif
-
- JSIGSRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/vm
-
-@@ -42,7 +47,7 @@
- # cause problems with interposing. See CR: 6466665
- # LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE))
-
--LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE)
-+LFLAGS_JSIG += -D_GNU_SOURCE -pthread $(LDFLAGS_HASH_STYLE)
-
- # DEBUG_BINARIES overrides everything, use full -g debug information
- ifeq ($(DEBUG_BINARIES), true)
-@@ -52,7 +57,7 @@
- $(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
- @echo Making signal interposition lib...
- $(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
-- $(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $< -ldl
-+ $(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $<
- $(QUIETLY) [ -f $(LIBJSIG_G) ] || { ln -s $@ $(LIBJSIG_G); }
-
- install_jsig: $(LIBJSIG)
---- hotspot/make/bsd/makefiles/launcher.make
-+++ hotspot/make/bsd/makefiles/launcher.make
-@@ -50,7 +50,7 @@
- LIBS_LAUNCHER += $(STATIC_STDCXX) $(LIBS)
- else
- LAUNCHER.o = launcher.o
-- LFLAGS_LAUNCHER += -L `pwd`
-+ LFLAGS_LAUNCHER += -L`pwd`
- LIBS_LAUNCHER += -l$(JVM) $(LIBS)
- endif
-
---- hotspot/make/bsd/makefiles/sa.make
-+++ hotspot/make/bsd/makefiles/sa.make
-@@ -45,8 +45,8 @@
-
- # gnumake 3.78.1 does not accept the *s that
- # are in AGENT_FILES1 and AGENT_FILES2, so use the shell to expand them
--AGENT_FILES1 := $(shell /usr/bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES1))
--AGENT_FILES2 := $(shell /usr/bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES2))
-+AGENT_FILES1 := $(shell /bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES1))
-+AGENT_FILES2 := $(shell /bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES2))
-
- AGENT_FILES1_LIST := $(GENERATED)/agent1.classes.list
- AGENT_FILES2_LIST := $(GENERATED)/agent2.classes.list
---- hotspot/make/bsd/makefiles/saproc.make
-+++ hotspot/make/bsd/makefiles/saproc.make
-@@ -25,23 +25,33 @@
- # Rules to build serviceability agent library, used by vm.make
-
- # libsaproc[_g].so: serviceability agent
--
--SAPROC = saproc
--LIBSAPROC = lib$(SAPROC).so
--
-+SAPROC = saproc
- SAPROC_G = $(SAPROC)$(G_SUFFIX)
--LIBSAPROC_G = lib$(SAPROC_G).so
-+
-+ifeq ($(OS_VENDOR), Darwin)
-+ LIBSAPROC = lib$(SAPROC).dylib
-+ LIBSAPROC_G = lib$(SAPROC_G).dylib
-+else
-+ LIBSAPROC = lib$(SAPROC).so
-+ LIBSAPROC_G = lib$(SAPROC_G).so
-+endif
-
- AGENT_DIR = $(GAMMADIR)/agent
-
- SASRCDIR = $(AGENT_DIR)/src/os/$(Platform_os_family)
-
-+ifeq ($(OS_VENDOR), FreeBSD)
- SASRCFILES = $(SASRCDIR)/salibelf.c \
- $(SASRCDIR)/symtab.c \
- $(SASRCDIR)/libproc_impl.c \
- $(SASRCDIR)/ps_proc.c \
- $(SASRCDIR)/ps_core.c \
- $(SASRCDIR)/BsdDebuggerLocal.c
-+SALIBS = -lutil -lthread_db
-+else
-+SASRCFILES = $(SASRCDIR)/StubDebuggerLocal.c
-+SALIBS =
-+endif
-
- SAMAPFILE = $(SASRCDIR)/mapfile
-
-@@ -62,7 +72,10 @@
- endif
-
-
--SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) $(LDFLAGS_HASH_STYLE)
-+ifneq ($(OS_VENDOR), Darwin)
-+SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE))
-+endif
-+SA_LFLAGS += $(LDFLAGS_HASH_STYLE)
-
- $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
- $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
-@@ -75,12 +88,12 @@
- -I$(SASRCDIR) \
- -I$(GENERATED) \
- -I$(BOOT_JAVA_HOME)/include \
-- -I$(BOOT_JAVA_HOME)/include/$(Platform_os_family) \
-+ -I$(BOOT_JAVA_HOME)/include/$(shell uname -s | tr "[:upper:]" "[:lower:]") \
- $(SASRCFILES) \
- $(SA_LFLAGS) \
- $(SA_DEBUG_CFLAGS) \
- -o $@ \
-- -lthread_db
-+ $(SALIBS)
- $(QUIETLY) [ -f $(LIBSAPROC_G) ] || { ln -s $@ $(LIBSAPROC_G); }
-
- install_saproc: $(BUILDLIBSAPROC)
---- hotspot/make/bsd/makefiles/vm.make
-+++ hotspot/make/bsd/makefiles/vm.make
-@@ -91,6 +91,10 @@
- ${JRE_VERSION} \
- ${VM_DISTRO}
-
-+ifdef DEFAULT_LIBPATH
-+CPPFLAGS += -DDEFAULT_LIBPATH="\"$(DEFAULT_LIBPATH)\""
-+endif
-+
- # CFLAGS_WARN holds compiler options to suppress/enable warnings.
- CFLAGS += $(CFLAGS_WARN/BYFILE)
-
-@@ -101,7 +105,7 @@
- CFLAGS += $(EXTRA_CFLAGS)
- LFLAGS += $(EXTRA_CFLAGS)
-
--LIBS += -lm -ldl -lpthread
-+LIBS += -lm -pthread
-
- # By default, link the *.o into the library, not the executable.
- LINK_INTO$(LINK_INTO) = LIBJVM
-@@ -115,9 +119,15 @@
- #----------------------------------------------------------------------
- # JVM
-
--JVM = jvm
--LIBJVM = lib$(JVM).so
--LIBJVM_G = lib$(JVM)$(G_SUFFIX).so
-+JVM = jvm
-+ifeq ($(OS_VENDOR), Darwin)
-+ LIBJVM = lib$(JVM).dylib
-+ LIBJVM_G = lib$(JVM)$(G_SUFFIX).dylib
-+ CFLAGS += -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE
-+else
-+ LIBJVM = lib$(JVM).so
-+ LIBJVM_G = lib$(JVM)$(G_SUFFIX).so
-+endif
-
- CORE_PATHS := $(shell find $(GAMMADIR)/src/share/vm/* -type d \! \( -name adlc -o -name c1 -o -name gc_implementation -o -name opto -o -name shark -o -name libadt \))
- CORE_PATHS += $(GAMMADIR)/src/os/$(Platform_os_family)/vm
-@@ -196,15 +206,7 @@
- vm.def: $(Res_Files) $(Obj_Files)
- sh $(GAMMADIR)/make/bsd/makefiles/build_vm_def.sh *.o > $@
-
--ifeq ($(SHARK_BUILD), true)
-- STATIC_CXX = false
--else
-- ifeq ($(ZERO_LIBARCH), ppc64)
-- STATIC_CXX = false
-- else
-- STATIC_CXX = true
-- endif
--endif
-+STATIC_CXX = false
-
- ifeq ($(LINK_INTO),AOUT)
- LIBJVM.o =
-@@ -216,14 +218,21 @@
- LFLAGS_VM$(LDNOMAP) += $(MAPFLAG:FILENAME=$(LIBJVM_MAPFILE))
- LFLAGS_VM += $(SONAMEFLAG:SONAME=$(LIBJVM))
-
-+ ifeq ($(OS_VENDOR), Darwin)
-+ LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/.
-+ LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/..
-+ LFLAGS_VM += -Xlinker -install_name -Xlinker @rpath/$(@F)
-+ endif
-+
- # JVM is statically linked with libgcc[_s] and libstdc++; this is needed to
- # get around library dependency and compatibility issues. Must use gcc not
- # g++ to link.
- ifeq ($(STATIC_CXX), true)
- LFLAGS_VM += $(STATIC_LIBGCC)
- LIBS_VM += $(STATIC_STDCXX)
-+ LINK_VM = $(LINK_LIB.c)
- else
-- LIBS_VM += -lstdc++
-+ LINK_VM = $(LINK_LIB.CC)
- endif
-
- LIBS_VM += $(LIBS)
-@@ -236,7 +245,6 @@
- LIBS_VM += $(LLVM_LIBS)
- endif
-
--LINK_VM = $(LINK_LIB.c)
-
- # rule for building precompiled header
- $(PRECOMPILED_HEADER):
-@@ -264,11 +272,6 @@
- LD_SCRIPT_FLAG = -Wl,-T,$(LD_SCRIPT)
- endif
-
--# With more recent Redhat releases (or the cutting edge version Fedora), if
--# SEBsd is configured to be enabled, the runtime linker will fail to apply
--# the text relocation to libjvm.so considering that it is built as a non-PIC
--# DSO. To workaround that, we run chcon to libjvm.so after it is built. See
--# details in bug 6538311.
- $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT)
- $(QUIETLY) { \
- echo Linking vm...; \
-@@ -278,17 +281,6 @@
- $(LINK_LIB.CC/POST_HOOK) \
- rm -f $@.1; ln -s $@ $@.1; \
- [ -f $(LIBJVM_G) ] || { ln -s $@ $(LIBJVM_G); ln -s $@.1 $(LIBJVM_G).1; }; \
-- if [ \"$(CROSS_COMPILE_ARCH)\" = \"\" ] ; then \
-- if [ -x /usr/sbin/sebsdenabled ] ; then \
-- /usr/sbin/sebsdenabled; \
-- if [ $$? = 0 ] ; then \
-- /usr/bin/chcon -t textrel_shlib_t $@; \
-- if [ $$? != 0 ]; then \
-- echo "ERROR: Cannot chcon $@"; \
-- fi \
-- fi \
-- fi \
-- fi \
- }
-
- DEST_JVM = $(JDK_LIBDIR)/$(VM_SUBDIR)/$(LIBJVM)
---- hotspot/make/bsd/platform_amd64
-+++ hotspot/make/bsd/platform_amd64
-@@ -12,4 +12,4 @@
-
- compiler = gcc
-
--sysdefs = -DBSD -D_GNU_SOURCE -DAMD64
-+sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DAMD64
---- hotspot/make/bsd/platform_i486
-+++ hotspot/make/bsd/platform_i486
-@@ -12,4 +12,4 @@
-
- compiler = gcc
-
--sysdefs = -DBSD -D_GNU_SOURCE -DIA32
-+sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DIA32
---- hotspot/make/defs.make
-+++ hotspot/make/defs.make
-@@ -118,13 +118,23 @@
- # Windows should have OS predefined
- ifeq ($(OS),)
- OS := $(shell uname -s)
-+ ifneq ($(findstring BSD,$(OS)),)
-+ OS=bsd
-+ endif
-+ ifeq ($(OS), Darwin)
-+ OS=bsd
-+ endif
- HOST := $(shell uname -n)
- endif
-
--# If not SunOS and not Linux, assume Windows
-+# If not SunOS, not Linux and not BSD, assume Windows
- ifneq ($(OS), Linux)
- ifneq ($(OS), SunOS)
-- OSNAME=windows
-+ ifneq ($(OS), bsd)
-+ OSNAME=windows
-+ else
-+ OSNAME=bsd
-+ endif
- else
- OSNAME=solaris
- endif
---- hotspot/make/sa.files
-+++ hotspot/make/sa.files
-@@ -50,6 +50,9 @@
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/compiler/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/amd64/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/x86/*.java \
-@@ -95,6 +98,9 @@
- AGENT_FILES2 = \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/amd64/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_amd64/*.java \
-+$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_x86/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/ia64/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux/*.java \
- $(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_amd64/*.java \
---- hotspot/src/cpu/x86/vm/bytes_x86.hpp
-+++ hotspot/src/cpu/x86/vm/bytes_x86.hpp
-@@ -81,6 +81,9 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "bytes_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "bytes_bsd_x86.inline.hpp"
-+#endif
-
-
- #endif // CPU_X86_VM_BYTES_X86_HPP
---- hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
-+++ hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
-@@ -481,8 +481,8 @@
- // Fetch the exception from TLS and clear out exception related thread state
- __ get_thread(rsi);
- __ movptr(rax, Address(rsi, JavaThread::exception_oop_offset()));
-- __ movptr(Address(rsi, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD);
-- __ movptr(Address(rsi, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD);
-+ __ movptr(Address(rsi, JavaThread::exception_oop_offset()), (intptr_t)NULL_WORD);
-+ __ movptr(Address(rsi, JavaThread::exception_pc_offset()), (intptr_t)NULL_WORD);
-
- __ bind(_unwind_handler_entry);
- __ verify_not_null_oop(rax);
---- hotspot/src/cpu/x86/vm/copy_x86.hpp
-+++ hotspot/src/cpu/x86/vm/copy_x86.hpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "copy_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "copy_bsd_x86.inline.hpp"
-+#endif
-
-
- static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {
---- hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp
-+++ hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp
-@@ -45,6 +45,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- // Implementation of InterpreterMacroAssembler
-@@ -1170,7 +1173,7 @@
- int recvr_offset = in_bytes(VirtualCallData::receiver_offset(start_row));
- set_mdp_data_at(mdp, recvr_offset, receiver);
- int count_offset = in_bytes(VirtualCallData::receiver_count_offset(start_row));
-- movptr(reg2, (int32_t)DataLayout::counter_increment);
-+ movptr(reg2, (intptr_t)DataLayout::counter_increment);
- set_mdp_data_at(mdp, count_offset, reg2);
- if (start_row > 0) {
- jmp(done);
-@@ -1313,7 +1316,7 @@
- test_method_data_pointer(mdp, profile_continue);
-
- // Build the base (index * per_case_size_in_bytes()) + case_array_offset_in_bytes()
-- movptr(reg2, (int32_t)in_bytes(MultiBranchData::per_case_size()));
-+ movptr(reg2, (intptr_t)in_bytes(MultiBranchData::per_case_size()));
- // index is positive and so should have correct value if this code were
- // used on 64bits
- imulptr(index, reg2);
---- hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
-+++ hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
-@@ -45,6 +45,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- // Implementation of InterpreterMacroAssembler
---- hotspot/src/cpu/x86/vm/jni_x86.h
-+++ hotspot/src/cpu/x86/vm/jni_x86.h
-@@ -26,7 +26,7 @@
- #ifndef _JAVASOFT_JNI_MD_H_
- #define _JAVASOFT_JNI_MD_H_
-
--#if defined(SOLARIS) || defined(LINUX)
-+#if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE)
- #define JNIEXPORT
- #define JNIIMPORT
- #define JNICALL
---- hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
-+++ hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
-@@ -47,6 +47,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifdef COMPILER2
- #include "opto/runtime.hpp"
- #endif
---- hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
-+++ hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
-@@ -47,6 +47,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifdef COMPILER2
- #include "opto/runtime.hpp"
- #endif
---- hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp
-+++ hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Implementation of the platform-specific part of StubRoutines - for
- // a description of how to extend it, see the stubRoutines.hpp file.
---- hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp
-+++ hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Implementation of the platform-specific part of StubRoutines - for
- // a description of how to extend it, see the stubRoutines.hpp file.
---- hotspot/src/cpu/x86/vm/vm_version_x86.cpp
-+++ hotspot/src/cpu/x86/vm/vm_version_x86.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- int VM_Version::_cpu;
---- hotspot/src/cpu/zero/vm/bytes_zero.hpp
-+++ hotspot/src/cpu/zero/vm/bytes_zero.hpp
-@@ -168,6 +168,9 @@
- #ifdef TARGET_OS_ARCH_linux_zero
- # include "bytes_linux_zero.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "bytes_bsd_zero.inline.hpp"
-+#endif
-
- #endif // VM_LITTLE_ENDIAN
-
---- hotspot/src/cpu/zero/vm/interp_masm_zero.cpp
-+++ hotspot/src/cpu/zero/vm/interp_masm_zero.cpp
-@@ -40,5 +40,8 @@
- #ifdef TARGET_OS_FAMILY_linux
- # include "thread_linux.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // This file is intentionally empty
---- hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp
-+++ hotspot/src/cpu/zero/vm/stubGenerator_zero.cpp
-@@ -43,6 +43,9 @@
- #ifdef TARGET_OS_FAMILY_linux
- # include "thread_linux.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifdef COMPILER2
- #include "opto/runtime.hpp"
- #endif
---- hotspot/src/cpu/zero/vm/stubRoutines_zero.cpp
-+++ hotspot/src/cpu/zero/vm/stubRoutines_zero.cpp
-@@ -30,6 +30,9 @@
- #ifdef TARGET_OS_FAMILY_linux
- # include "thread_linux.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifdef IA32
- address StubRoutines::x86::_call_stub_compiled_return = NULL;
---- hotspot/src/cpu/zero/vm/vm_version_zero.cpp
-+++ hotspot/src/cpu/zero/vm/vm_version_zero.cpp
-@@ -32,5 +32,8 @@
- #ifdef TARGET_OS_FAMILY_linux
- # include "os_linux.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // This file is intentionally empty
---- hotspot/src/os/bsd/vm/attachListener_bsd.cpp
-+++ hotspot/src/os/bsd/vm/attachListener_bsd.cpp
-@@ -170,53 +170,41 @@
- // Initialization - create a listener socket and bind it to a file
-
- int BsdAttachListener::init() {
-- char path[UNIX_PATH_MAX]; // socket file
-- char initial_path[UNIX_PATH_MAX]; // socket file during setup
-- int listener; // listener socket (file descriptor)
-+ char path[UNIX_PATH_MAX]; // socket file
-+ int listener; // listener socket (file descriptor)
-
- // register function to cleanup
- ::atexit(listener_cleanup);
-
-- int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
-- os::get_temp_directory(), os::current_process_id());
-- if (n < (int)UNIX_PATH_MAX) {
-- n = snprintf(initial_path, UNIX_PATH_MAX, "%s.tmp", path);
-- }
-- if (n >= (int)UNIX_PATH_MAX) {
-- return -1;
-- }
--
- // create the listener socket
- listener = ::socket(PF_UNIX, SOCK_STREAM, 0);
- if (listener == -1) {
- return -1;
- }
-
-- // bind socket
-+ int res = -1;
- struct sockaddr_un addr;
- addr.sun_family = AF_UNIX;
-- strcpy(addr.sun_path, initial_path);
-- ::unlink(initial_path);
-- int res = ::bind(listener, (struct sockaddr*)&addr, sizeof(addr));
-+
-+ snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d",
-+ os::get_temp_directory(), os::current_process_id());
-+ strcpy(addr.sun_path, path);
-+ ::unlink(path);
-+ res = ::bind(listener, (struct sockaddr*)&addr, sizeof(addr));
- if (res == -1) {
- RESTARTABLE(::close(listener), res);
- return -1;
- }
-+ set_path(path);
-
-- // put in listen mode, set permissions, and rename into place
-- res = ::listen(listener, 5);
-- if (res == 0) {
-- RESTARTABLE(::chmod(initial_path, S_IREAD|S_IWRITE), res);
-- if (res == 0) {
-- res = ::rename(initial_path, path);
-- }
-- }
-- if (res == -1) {
-+ // put in listen mode and set permission and ownership
-+ if ((::listen(listener, 5) == -1) || (::chmod(path, S_IREAD|S_IWRITE) == -1) ||
-+ (::chown(path, geteuid(), getegid()) == -1)) {
- RESTARTABLE(::close(listener), res);
-- ::unlink(initial_path);
-+ ::unlink(path);
-+ set_path(NULL);
- return -1;
- }
-- set_path(path);
- set_listener(listener);
-
- return 0;
-@@ -337,6 +325,15 @@
-
- // get the credentials of the peer and check the effective uid/guid
- // - check with jeff on this.
-+#ifdef _ALLBSD_SOURCE
-+ uid_t puid;
-+ gid_t pgid;
-+ if (::getpeereid(s, &puid, &pgid) != 0) {
-+ int res;
-+ RESTARTABLE(::close(s), res);
-+ continue;
-+ }
-+#else
- struct ucred cred_info;
- socklen_t optlen = sizeof(cred_info);
- if (::getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void*)&cred_info, &optlen) == -1) {
-@@ -344,10 +341,13 @@
- RESTARTABLE(::close(s), res);
- continue;
- }
-+ uid_t puid = cred_info.uid;
-+ gid_t pgid = cred_info.gid;
-+#endif
- uid_t euid = geteuid();
- gid_t egid = getegid();
-
-- if (cred_info.uid != euid || cred_info.gid != egid) {
-+ if (puid != euid || pgid != egid) {
- int res;
- RESTARTABLE(::close(s), res);
- continue;
-@@ -467,16 +467,13 @@
- if (init_at_startup() || is_initialized()) {
- return false; // initialized at startup or already initialized
- }
-- char fn[PATH_MAX+1];
-- sprintf(fn, ".attach_pid%d", os::current_process_id());
-+ char path[PATH_MAX + 1];
- int ret;
-- struct stat64 st;
-- RESTARTABLE(::stat64(fn, &st), ret);
-- if (ret == -1) {
-- snprintf(fn, sizeof(fn), "%s/.attach_pid%d",
-- os::get_temp_directory(), os::current_process_id());
-- RESTARTABLE(::stat64(fn, &st), ret);
-- }
-+ struct stat st;
-+
-+ snprintf(path, PATH_MAX + 1, "%s/.attach_pid%d",
-+ os::get_temp_directory(), os::current_process_id());
-+ RESTARTABLE(::stat(path, &st), ret);
- if (ret == 0) {
- // simple check to avoid starting the attach mechanism when
- // a bogus user creates the file
---- hotspot/src/os/bsd/vm/jsig.c
-+++ hotspot/src/os/bsd/vm/jsig.c
-@@ -143,7 +143,8 @@
- }
-
- sa_handler_t sigset(int sig, sa_handler_t disp) {
-- return set_signal(sig, disp, true);
-+ printf("sigset() is not supported by BSD");
-+ exit(0);
- }
-
- static int call_os_sigaction(int sig, const struct sigaction *act,
---- hotspot/src/os/bsd/vm/jvm_bsd.cpp
-+++ hotspot/src/os/bsd/vm/jvm_bsd.cpp
-@@ -146,38 +146,31 @@
- "ILL", SIGILL, /* Illegal instruction (ANSI). */
- "TRAP", SIGTRAP, /* Trace trap (POSIX). */
- "ABRT", SIGABRT, /* Abort (ANSI). */
-- "IOT", SIGIOT, /* IOT trap (4.2 BSD). */
-- "BUS", SIGBUS, /* BUS error (4.2 BSD). */
-+ "EMT", SIGEMT, /* EMT trap */
- "FPE", SIGFPE, /* Floating-point exception (ANSI). */
- "KILL", SIGKILL, /* Kill, unblockable (POSIX). */
-- "USR1", SIGUSR1, /* User-defined signal 1 (POSIX). */
-+ "BUS", SIGBUS, /* BUS error (4.2 BSD). */
- "SEGV", SIGSEGV, /* Segmentation violation (ANSI). */
-- "USR2", SIGUSR2, /* User-defined signal 2 (POSIX). */
-+ "SYS", SIGSYS, /* Bad system call. Only on some Bsden! */
- "PIPE", SIGPIPE, /* Broken pipe (POSIX). */
- "ALRM", SIGALRM, /* Alarm clock (POSIX). */
- "TERM", SIGTERM, /* Termination (ANSI). */
--#ifdef SIGSTKFLT
-- "STKFLT", SIGSTKFLT, /* Stack fault. */
--#endif
-- "CLD", SIGCLD, /* Same as SIGCHLD (System V). */
-- "CHLD", SIGCHLD, /* Child status has changed (POSIX). */
-- "CONT", SIGCONT, /* Continue (POSIX). */
-+ "URG", SIGURG, /* Urgent condition on socket (4.2 BSD). */
- "STOP", SIGSTOP, /* Stop, unblockable (POSIX). */
- "TSTP", SIGTSTP, /* Keyboard stop (POSIX). */
-+ "CONT", SIGCONT, /* Continue (POSIX). */
-+ "CHLD", SIGCHLD, /* Child status has changed (POSIX). */
- "TTIN", SIGTTIN, /* Background read from tty (POSIX). */
- "TTOU", SIGTTOU, /* Background write to tty (POSIX). */
-- "URG", SIGURG, /* Urgent condition on socket (4.2 BSD). */
-+ "IO", SIGIO, /* I/O now possible (4.2 BSD). */
- "XCPU", SIGXCPU, /* CPU limit exceeded (4.2 BSD). */
- "XFSZ", SIGXFSZ, /* File size limit exceeded (4.2 BSD). */
- "VTALRM", SIGVTALRM, /* Virtual alarm clock (4.2 BSD). */
- "PROF", SIGPROF, /* Profiling alarm clock (4.2 BSD). */
- "WINCH", SIGWINCH, /* Window size change (4.3 BSD, Sun). */
-- "POLL", SIGPOLL, /* Pollable event occurred (System V). */
-- "IO", SIGIO, /* I/O now possible (4.2 BSD). */
-- "PWR", SIGPWR, /* Power failure restart (System V). */
--#ifdef SIGSYS
-- "SYS", SIGSYS /* Bad system call. Only on some Bsden! */
--#endif
-+ "INFO", SIGINFO, /* Information request. */
-+ "USR1", SIGUSR1, /* User-defined signal 1 (POSIX). */
-+ "USR2", SIGUSR2 /* User-defined signal 2 (POSIX). */
- };
-
- JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name))
---- hotspot/src/os/bsd/vm/jvm_bsd.h
-+++ hotspot/src/os/bsd/vm/jvm_bsd.h
-@@ -54,7 +54,11 @@
- #define AGENT_ONATTACH_SYMBOLS {"Agent_OnAttach"}
-
- #define JNI_LIB_PREFIX "lib"
-+#ifdef __APPLE__
-+#define JNI_LIB_SUFFIX ".dylib"
-+#else
- #define JNI_LIB_SUFFIX ".so"
-+#endif
-
- // Hack: MAXPATHLEN is 4095 on some Bsd and 4096 on others. This may
- // cause problems if JVM and the rest of JDK are built on different
-@@ -93,6 +97,20 @@
- #define SHUTDOWN2_SIGNAL SIGINT
- #define SHUTDOWN3_SIGNAL SIGTERM
-
-+#ifndef SIGRTMIN
-+#ifdef __OpenBSD__
-+#define SIGRTMIN 1
-+#else
-+#define SIGRTMIN 33
-+#endif
-+#endif
-+#ifndef SIGRTMAX
-+#ifdef __OpenBSD__
-+#define SIGRTMAX 31
-+#else
-+#define SIGRTMAX 63
-+#endif
-+#endif
- #endif /* JVM_MD_H */
-
- // Reconciliation History
---- hotspot/src/os/bsd/vm/osThread_bsd.cpp
-+++ hotspot/src/os/bsd/vm/osThread_bsd.cpp
-@@ -43,8 +43,12 @@
-
- void OSThread::pd_initialize() {
- assert(this != NULL, "check");
-+#ifdef __FreeBSD__
- _thread_id = 0;
-- _pthread_id = 0;
-+#else
-+ _thread_id = NULL;
-+#endif
-+ _pthread_id = NULL;
- _siginfo = NULL;
- _ucontext = NULL;
- _expanding_stack = 0;
--- hotspot/src/os/bsd/vm/osThread_bsd.hpp
+++ hotspot/src/os/bsd/vm/osThread_bsd.hpp
-@@ -39,6 +39,7 @@
+@@ -39,7 +39,7 @@
private:
-+#ifdef __FreeBSD__
- // _thread_id is kernel thread id (similar to LWP id on Solaris). Each
- // thread has a unique thread_id (BsdThreads or NPTL). It can be used
- // to access /proc.
-@@ -47,6 +48,12 @@
- // _pthread_id is the pthread id, which is used by library calls
- // (e.g. pthread_kill).
- pthread_t _pthread_id;
-+#else
-+ // _thread_id and _pthread_id are the same on BSD
-+ // keep both to minimize code divergence in os_bsd.cpp
-+ pthread_t _thread_id;
-+ pthread_t _pthread_id;
-+#endif
-
- sigset_t _caller_sigmask; // Caller's signal mask
+-#ifdef _ALLBSD_SOURCE
++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__)
-@@ -56,12 +63,22 @@
+ #ifdef __APPLE__
+ thread_t _thread_id;
+@@ -70,7 +70,7 @@
sigset_t caller_sigmask() const { return _caller_sigmask; }
void set_caller_sigmask(sigset_t sigmask) { _caller_sigmask = sigmask; }
-+#ifdef __FreeBSD__
- pid_t thread_id() const {
+-#ifdef _ALLBSD_SOURCE
++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__)
+ #ifdef __APPLE__
+ thread_t thread_id() const {
return _thread_id;
- }
-+#else
-+ pthread_t thread_id() const {
-+ return _thread_id;
-+ }
-+#endif
+@@ -87,8 +87,12 @@
+ #endif
#ifndef PRODUCT
// Used for debugging, return a unique integer for each thread.
+#ifdef __FreeBSD__
- int thread_identifier() const { return _thread_id; }
++ int thread_identifier() const { return _thread_id; }
+#else
-+ intptr_t thread_identifier() const { return (intptr_t)_pthread_id; }
-+#endif
+ intptr_t thread_identifier() const { return (intptr_t)_pthread_id; }
#endif
++#endif
#ifdef ASSERT
// We expect no reposition failures so kill vm if we get one.
-@@ -70,9 +87,15 @@
+ //
+@@ -96,7 +100,7 @@
return false;
}
#endif // ASSERT
-+#ifdef __FreeBSD__
- void set_thread_id(pid_t id) {
+-#ifdef _ALLBSD_SOURCE
++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__)
+ #ifdef __APPLE__
+ void set_thread_id(thread_t id) {
_thread_id = id;
- }
-+#else
-+ void set_thread_id(pthread_t id) {
-+ _thread_id = id;
-+ }
-+#endif
- pthread_t pthread_id() const {
- return _pthread_id;
- }
--- hotspot/src/os/bsd/vm/os_bsd.cpp
+++ hotspot/src/os/bsd/vm/os_bsd.cpp
-@@ -88,7 +88,6 @@
+@@ -94,7 +94,6 @@
# include <sys/mman.h>
# include <sys/stat.h>
# include <sys/select.h>
@@ -4116,28 +642,7 @@
# include <signal.h>
# include <errno.h>
# include <dlfcn.h>
-@@ -102,21 +101,56 @@
- # include <sys/utsname.h>
- # include <sys/socket.h>
- # include <sys/wait.h>
-+# include <time.h>
- # include <pwd.h>
- # include <poll.h>
- # include <semaphore.h>
- # include <fcntl.h>
- # include <string.h>
-+#ifdef _ALLBSD_SOURCE
-+# include <sys/param.h>
-+# include <sys/sysctl.h>
-+#else
- # include <syscall.h>
- # include <sys/sysinfo.h>
- # include <gnu/libc-version.h>
-+#endif
- # include <sys/ipc.h>
- # include <sys/shm.h>
--# include <link.h>
- # include <stdint.h>
+@@ -131,6 +130,19 @@
# include <inttypes.h>
# include <sys/ioctl.h>
@@ -4154,66 +659,13 @@
+#endif
+#endif
+
-+#ifndef __APPLE__
-+# include <link.h>
-+#endif
-+
-+#if defined(__FreeBSD__) || defined(__NetBSD__)
-+# include <elf.h>
-+#endif
-+
-+#ifdef __APPLE__
-+#include <mach/mach.h> // semaphore_* API
-+#include <mach-o/dyld.h>
-+#endif
-+
-+#ifndef MAP_ANONYMOUS
-+#define MAP_ANONYMOUS MAP_ANON
-+#endif
-+
- #define MAX_PATH (2 * K)
-
- // for timer info max values which include all bits
-@@ -127,19 +161,25 @@
- // global variables
- julong os::Bsd::_physical_memory = 0;
-
-+#ifndef _ALLBSD_SOURCE
- address os::Bsd::_initial_thread_stack_bottom = NULL;
- uintptr_t os::Bsd::_initial_thread_stack_size = 0;
-+#endif
-
- int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL;
-+#ifndef _ALLBSD_SOURCE
- int (*os::Bsd::_pthread_getcpuclockid)(pthread_t, clockid_t *) = NULL;
- Mutex* os::Bsd::_createThread_lock = NULL;
-+#endif
- pthread_t os::Bsd::_main_thread;
- int os::Bsd::_page_size = -1;
-+#ifndef _ALLBSD_SOURCE
- bool os::Bsd::_is_floating_stack = false;
- bool os::Bsd::_is_NPTL = false;
- bool os::Bsd::_supports_fast_thread_cpu_time = false;
- const char * os::Bsd::_glibc_version = NULL;
- const char * os::Bsd::_libpthread_version = NULL;
-+#endif
-
- static jlong initial_time_count=0;
-
-@@ -157,8 +197,6 @@
- static int SR_signum = SIGUSR2;
- sigset_t SR_sigset;
-
--/* Used to protect dlsym() calls */
--static pthread_mutex_t dl_mutex;
-
- ////////////////////////////////////////////////////////////////////////////////
- // utility functions
-@@ -171,11 +209,38 @@
- }
+ #if defined(__FreeBSD__) || defined(__NetBSD__)
+ # include <elf.h>
+ #endif
+@@ -205,6 +217,28 @@
julong os::Bsd::available_memory() {
-+#ifdef _ALLBSD_SOURCE
+ #ifdef _ALLBSD_SOURCE
+#ifdef __FreeBSD__
+ static const char *vm_stats[] = {
+ "vm.stats.vm.v_free_count",
@@ -4233,53 +685,28 @@
+ free_pages += npages;
+ }
+ if (free_pages > 0)
-+ free_pages *= os::vm_page_size();
++ return free_pages * os::vm_page_size();
+ else
+#endif
-+ // XXXBSD: this is just a stopgap implementation
-+ return physical_memory() >> 2;
-+#else
- // values in struct sysinfo are "unsigned long"
- struct sysinfo si;
- sysinfo(&si);
-
- return (julong)si.freeram * si.mem_unit;
-+#endif
- }
-
- julong os::physical_memory() {
-@@ -223,6 +288,7 @@
- }
-
-
-+#ifndef _ALLBSD_SOURCE
- #ifndef SYS_gettid
- // i386: 224, ia64: 1105, amd64: 186, sparc 143
- #ifdef __ia64__
-@@ -237,6 +303,7 @@
- #error define gettid for the arch
- #endif
+ // XXXBSD: this is just a stopgap implementation
+ return physical_memory() >> 2;
+ #else
+@@ -308,16 +342,22 @@
+ #define COMPILER_VARIANT "client"
#endif
-+#endif
- // Cpu architecture string
- #if defined(ZERO)
-@@ -267,28 +334,86 @@
+-#ifndef _ALLBSD_SOURCE
++#if !defined(_ALLBSD_SOURCE) || defined(__FreeBSD__)
+ // pid_t gettid()
+ //
// Returns the kernel thread id of the currently running thread. Kernel
// thread id is used to access /proc.
//
-// (Note that getpid() on BsdThreads returns kernel thread id too; but
-// on NPTL, it returns the same pid for all threads, as required by POSIX.)
-//
-+#ifdef __FreeBSD__
pid_t os::Bsd::gettid() {
-- int rslt = syscall(SYS_gettid);
-- if (rslt == -1) {
-- // old kernel, no NPTL support
-- return getpid();
-- } else {
-- return (pid_t)rslt;
-- }
++#ifdef __FreeBSD__
+#if __FreeBSD_version > 900030
+ return pthread_getthreadid_np();
+#else
@@ -4287,570 +714,56 @@
+ thr_self(&tid);
+ return (pid_t)tid;
+#endif
-+}
-+#endif
-+
-+#if defined(__FreeBSD__)
-+void os::Bsd::initialize_system_info() {
-+ int cpu_val = sysconf(_SC_NPROCESSORS_CONF);
-+ if (cpu_val >= 1)
-+ set_processor_count(cpu_val);
-+ else
-+ set_processor_count(1); // fallback
-+
-+#ifdef _SC_PHYS_PAGES
-+ long phys_pages = sysconf(_SC_PHYS_PAGES);
-+ if (phys_pages > 0)
-+ _physical_memory = (julong)phys_pages * _page_size;
-+ else
-+ _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
-+#else
-+ int mib[2];
-+ size_t len;
-+ u_long mem_val;
-+
-+ mib[0] = CTL_HW;
-+ mib[1] = HW_PHYSMEM;
-+ len = sizeof(mem_val);
-+ if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1)
-+ _physical_memory = mem_val;
-+ else
-+ _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
-+#endif
- }
-+#elif defined(_ALLBSD_SOURCE)
-+void os::Bsd::initialize_system_info() {
-+ int mib[2];
-+ size_t len;
-+ int cpu_val;
-+ u_long mem_val;
-+
-+ /* get processors count via hw.ncpus sysctl */
-+ mib[0] = CTL_HW;
-+ mib[1] = HW_NCPU;
-+ len = sizeof(cpu_val);
-+ if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
-+ set_processor_count(cpu_val);
-+ }
-+ else {
-+ set_processor_count(1); // fallback
-+ }
-
--// Most versions of bsd have a bug where the number of processors are
--// determined by looking at the /proc file system. In a chroot environment,
--// the system call returns 1. This causes the VM to act as if it is
--// a single processor and elide locking (see is_MP() call).
--static bool unsafe_chroot_detected = false;
--static const char *unstable_chroot_error = "/proc file system not found.\n"
-- "Java may be unstable running multithreaded in a chroot "
-- "environment on Bsd when /proc filesystem is not mounted.";
-+ /* get physical memory via hw.usermem sysctl (hw.usermem is used
-+ * instead of hw.physmem because we need size of allocatable memory
-+ */
-+ mib[0] = CTL_HW;
-+ mib[1] = HW_USERMEM;
-+ len = sizeof(mem_val);
-+ if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1)
-+ _physical_memory = mem_val;
-+ else
-+ _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
-
-+#ifdef __OpenBSD__
-+ {
-+ // limit _physical_memory memory view on OpenBSD since
-+ // datasize rlimit restricts us anyway.
-+ struct rlimit limits;
-+ getrlimit(RLIMIT_DATA, &limits);
-+ _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur);
-+ }
-+#endif
-+}
-+#else
- void os::Bsd::initialize_system_info() {
- set_processor_count(sysconf(_SC_NPROCESSORS_CONF));
- if (processor_count() == 1) {
-@@ -305,6 +430,7 @@
- _physical_memory = (julong)sysconf(_SC_PHYS_PAGES) * (julong)sysconf(_SC_PAGESIZE);
- assert(processor_count() > 0, "bsd error");
- }
-+#endif
-
- void os::init_system_properties_values() {
- // char arch[12];
-@@ -348,9 +474,7 @@
- * ...
- * 7: The default directories, normally /lib and /usr/lib.
- */
--#if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390))
--#define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
--#else
-+#ifndef DEFAULT_LIBPATH
- #define DEFAULT_LIBPATH "/lib:/usr/lib"
- #endif
-
-@@ -429,7 +553,11 @@
- * should always exist (until the legacy problem cited above is
- * addressed).
- */
-+#ifdef __APPLE__
-+ char *v = getenv("DYLD_LIBRARY_PATH");
-+#else
- char *v = getenv("LD_LIBRARY_PATH");
-+#endif
- if (v != NULL) {
- char *t = ld_library_path;
- /* That's +1 for the colon and +1 for the trailing '\0' */
-@@ -588,6 +716,7 @@
- }
- }
-
-+#ifndef _ALLBSD_SOURCE
- //////////////////////////////////////////////////////////////////////////////
- // detecting pthread library
-
-@@ -751,6 +880,7 @@
- }
- return false;
- }
-+#endif
-
- //////////////////////////////////////////////////////////////////////////////
- // create new thread
-@@ -759,6 +889,9 @@
-
- // check if it's safe to start a new thread
- static bool _thread_safety_check(Thread* thread) {
-+#ifdef _ALLBSD_SOURCE
-+ return true;
+#else
- if (os::Bsd::is_BsdThreads() && !os::Bsd::is_floating_stack()) {
- // Fixed stack BsdThreads (SuSE Bsd/x86, and some versions of Redhat)
- // Heap is mmap'ed at lower end of memory space. Thread stacks are
-@@ -792,6 +925,7 @@
- // here, that means enough space has been reserved for stack.
- return true;
+ int rslt = syscall(SYS_gettid);
+ if (rslt == -1) {
+ // old kernel, no NPTL support
+@@ -325,6 +365,7 @@
+ } else {
+ return (pid_t)rslt;
}
+#endif
}
- // Thread start routine for all newly created threads
-@@ -819,15 +953,22 @@
+ // Most versions of bsd have a bug where the number of processors are
+@@ -997,7 +1038,7 @@
return NULL;
}
-+#ifdef __FreeBSD__
+-#ifdef _ALLBSD_SOURCE
++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__)
+ #ifdef __APPLE__
+ // thread_id is mach thread on macos
+ osthread->set_thread_id(::mach_thread_self());
+@@ -1009,6 +1050,7 @@
// thread_id is kernel thread id (similar to Solaris LWP id)
osthread->set_thread_id(os::Bsd::gettid());
-+#else
-+ // thread_id is pthread_id on BSD
-+ osthread->set_thread_id(::pthread_self());
-+#endif
-+#ifndef _ALLBSD_SOURCE
++#ifndef __FreeBSD__
if (UseNUMA) {
int lgrp_id = os::numa_get_group_id();
if (lgrp_id != -1) {
- thread->set_lgrp_id(lgrp_id);
+@@ -1016,6 +1058,7 @@
}
}
+ #endif
+#endif
// initialize signal mask for this thread
os::Bsd::hotspot_sigmask(thread);
-@@ -910,17 +1051,22 @@
- // let pthread_create() pick the default value.
- }
-
-+#ifndef _ALLBSD_SOURCE
- // glibc guard page
- pthread_attr_setguardsize(&attr, os::Bsd::default_guard_size(thr_type));
-+#endif
-
- ThreadState state;
-
- {
-+
-+#ifndef _ALLBSD_SOURCE
- // Serialize thread creation if we are running with fixed stack BsdThreads
- bool lock = os::Bsd::is_BsdThreads() && !os::Bsd::is_floating_stack();
- if (lock) {
- os::Bsd::createThread_lock()->lock_without_safepoint_check();
- }
-+#endif
-
- pthread_t tid;
- int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
-@@ -934,7 +1080,9 @@
- // Need to clean up stuff we've allocated so far
- thread->set_osthread(NULL);
- delete osthread;
-+#ifndef _ALLBSD_SOURCE
- if (lock) os::Bsd::createThread_lock()->unlock();
-+#endif
- return false;
- }
-
-@@ -950,9 +1098,11 @@
- }
- }
-
-+#ifndef _ALLBSD_SOURCE
- if (lock) {
- os::Bsd::createThread_lock()->unlock();
- }
-+#endif
- }
-
- // Aborted due to thread limit being reached
-@@ -990,7 +1140,11 @@
+@@ -1194,7 +1237,7 @@
}
// Store pthread info into the OSThread
-+#ifdef __FreeBSD__
- osthread->set_thread_id(os::Bsd::gettid());
-+#else
-+ osthread->set_thread_id(::pthread_self());
-+#endif
- osthread->set_pthread_id(::pthread_self());
-
- // initialize floating point control register
-@@ -1001,6 +1155,7 @@
-
- thread->set_osthread(osthread);
-
-+#ifndef _ALLBSD_SOURCE
- if (UseNUMA) {
- int lgrp_id = os::numa_get_group_id();
- if (lgrp_id != -1) {
-@@ -1027,6 +1182,7 @@
- os::Bsd::manually_expand_stack(jt, addr);
- osthread->clear_expanding_stack();
- }
-+#endif
-
- // initialize signal mask for this thread
- // and save the caller's signal mask
-@@ -1085,6 +1241,7 @@
- //////////////////////////////////////////////////////////////////////////////
- // initial thread
-
-+#ifndef _ALLBSD_SOURCE
- // Check if current thread is the initial thread, similar to Solaris thr_main.
- bool os::Bsd::is_initial_thread(void) {
- char dummy;
-@@ -1321,6 +1478,7 @@
- _initial_thread_stack_size = align_size_down(_initial_thread_stack_size, page_size());
- _initial_thread_stack_bottom = (address)stack_top - _initial_thread_stack_size;
- }
-+#endif
-
- ////////////////////////////////////////////////////////////////////////////////
- // time support
-@@ -1342,9 +1500,7 @@
- return (1000 * 1000);
- }
-
--// For now, we say that bsd does not support vtime. I have no idea
--// whether it can actually be made to (DLD, 9/13/05).
--
-+// XXX: For now, code this as if BSD does not support vtime.
- bool os::supports_vtime() { return false; }
- bool os::enable_vtime() { return false; }
- bool os::vtime_enabled() { return false; }
-@@ -1364,6 +1520,21 @@
- #define CLOCK_MONOTONIC (1)
- #endif
-
-+#ifdef __APPLE__
-+void os::Bsd::clock_init() {
-+ // XXXDARWIN: Investigate replacement monotonic clock
-+}
-+#elif defined(_ALLBSD_SOURCE)
-+void os::Bsd::clock_init() {
-+ struct timespec res;
-+ struct timespec tp;
-+ if (::clock_getres(CLOCK_MONOTONIC, &res) == 0 &&
-+ ::clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
-+ // yes, monotonic clock is supported
-+ _clock_gettime = ::clock_gettime;
-+ }
-+}
-+#else
- void os::Bsd::clock_init() {
- // we do dlopen's in this particular order due to bug in bsd
- // dynamical loader (see 6348968) leading to crash on exit
-@@ -1399,7 +1570,9 @@
- }
- }
- }
-+#endif
-
-+#ifndef _ALLBSD_SOURCE
- #ifndef SYS_clock_getres
-
- #if defined(IA32) || defined(AMD64)
-@@ -1440,6 +1613,7 @@
- _pthread_getcpuclockid = pthread_getcpuclockid_func;
- }
- }
-+#endif
-
- jlong os::javaTimeNanos() {
- if (Bsd::supports_monotonic_clock()) {
-@@ -1608,7 +1782,14 @@
-
- // DLL functions
-
--const char* os::dll_file_extension() { return ".so"; }
-+#define JNI_LIB_PREFIX "lib"
-+#ifdef __APPLE__
-+#define JNI_LIB_SUFFIX ".dylib"
-+#else
-+#define JNI_LIB_SUFFIX ".so"
-+#endif
-+
-+const char* os::dll_file_extension() { return JNI_LIB_SUFFIX; }
-
- // This must be hard coded because it's the system's temporary
- // directory not the java application's temp directory, ala java.io.tmpdir.
-@@ -1628,13 +1809,13 @@
- const size_t pnamelen = pname ? strlen(pname) : 0;
-
- // Quietly truncate on buffer overflow. Should be an error.
-- if (pnamelen + strlen(fname) + 10 > (size_t) buflen) {
-+ if (pnamelen + strlen(fname) + strlen(JNI_LIB_PREFIX) + strlen(JNI_LIB_SUFFIX) + 2 > buflen) {
- *buffer = '\0';
- return;
- }
-
- if (pnamelen == 0) {
-- snprintf(buffer, buflen, "lib%s.so", fname);
-+ snprintf(buffer, buflen, JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, fname);
- } else if (strchr(pname, *os::path_separator()) != NULL) {
- int n;
- char** pelements = split_path(pname, &n);
-@@ -1643,7 +1824,8 @@
- if (pelements[i] == NULL || strlen(pelements[i]) == 0) {
- continue; // skip the empty path values
- }
-- snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname);
-+ snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX,
-+ pelements[i], fname);
- if (file_exists(buffer)) {
- break;
- }
-@@ -1658,7 +1840,7 @@
- FREE_C_HEAP_ARRAY(char*, pelements);
- }
- } else {
-- snprintf(buffer, buflen, "%s/lib%s.so", pname, fname);
-+ snprintf(buffer, buflen, "%s/" JNI_LIB_PREFIX "%s" JNI_LIB_SUFFIX, pname, fname);
- }
- }
-
-@@ -1708,6 +1890,23 @@
- return false;
- }
-
-+#ifdef _ALLBSD_SOURCE
-+// ported from solaris version
-+bool os::dll_address_to_library_name(address addr, char* buf,
-+ int buflen, int* offset) {
-+ Dl_info dlinfo;
-+
-+ if (dladdr((void*)addr, &dlinfo)){
-+ if (buf) jio_snprintf(buf, buflen, "%s", dlinfo.dli_fname);
-+ if (offset) *offset = addr - (address)dlinfo.dli_fbase;
-+ return true;
-+ } else {
-+ if (buf) buf[0] = '\0';
-+ if (offset) *offset = -1;
-+ return false;
-+ }
-+}
-+#else
- struct _address_to_library_name {
- address addr; // input : memory address
- size_t buflen; // size of fname
-@@ -1782,11 +1981,27 @@
- return false;
- }
- }
-+#endif
-
- // Loads .dll/.so and
- // in case of error it checks if .dll/.so was built for the
- // same architecture as Hotspot is running on
-+
-+#ifdef __APPLE__
-+void * os::dll_load(const char *filename, char *ebuf, int ebuflen) {
-+ void * result= ::dlopen(filename, RTLD_LAZY);
-+ if (result != NULL) {
-+ // Successful loading
-+ return result;
-+ }
-+
-+ // Read system error message into ebuf
-+ ::strncpy(ebuf, ::dlerror(), ebuflen-1);
-+ ebuf[ebuflen-1]='\0';
-
-+ return NULL;
-+}
-+#else
- void * os::dll_load(const char *filename, char *ebuf, int ebuflen)
- {
- void * result= ::dlopen(filename, RTLD_LAZY);
-@@ -1839,6 +2054,26 @@
- #define EM_486 6 /* Intel 80486 */
- #endif
-
-+ #ifndef EM_MIPS_RS3_LE
-+ #define EM_MIPS_RS3_LE 10 /* MIPS */
-+ #endif
-+
-+ #ifndef EM_PPC64
-+ #define EM_PPC64 21 /* PowerPC64 */
-+ #endif
-+
-+ #ifndef EM_S390
-+ #define EM_S390 22 /* IBM System/390 */
-+ #endif
-+
-+ #ifndef EM_IA_64
-+ #define EM_IA_64 50 /* HP/Intel IA-64 */
-+ #endif
-+
-+ #ifndef EM_X86_64
-+ #define EM_X86_64 62 /* AMD x86-64 */
-+ #endif
-+
- static const arch_t arch_array[]={
- {EM_386, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
- {EM_486, EM_386, ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
-@@ -1942,17 +2177,11 @@
-
- return NULL;
- }
-+#endif /* !__APPLE__ */
-
--/*
-- * glibc-2.0 libdl is not MT safe. If you are building with any glibc,
-- * chances are you might want to run the generated bits against glibc-2.0
-- * libdl.so, so always use locking for any version of glibc.
-- */
-+// XXX: Do we need a lock around this as per Linux?
- void* os::dll_lookup(void* handle, const char* name) {
-- pthread_mutex_lock(&dl_mutex);
-- void* res = dlsym(handle, name);
-- pthread_mutex_unlock(&dl_mutex);
-- return res;
-+ return dlsym(handle, name);
- }
-
-
-@@ -1975,7 +2204,51 @@
-
- void os::print_dll_info(outputStream *st) {
- st->print_cr("Dynamic libraries:");
--
-+#ifdef _ALLBSD_SOURCE
-+#ifdef RTLD_DI_LINKMAP
-+ Dl_info dli;
-+ void *handle;
-+ Link_map *map;
-+ Link_map *p;
-+
-+ if (!dladdr(CAST_FROM_FN_PTR(void *, os::print_dll_info), &dli)) {
-+ st->print_cr("Error: Cannot print dynamic libraries.");
-+ return;
-+ }
-+ handle = dlopen(dli.dli_fname, RTLD_LAZY);
-+ if (handle == NULL) {
-+ st->print_cr("Error: Cannot print dynamic libraries.");
-+ return;
-+ }
-+ dlinfo(handle, RTLD_DI_LINKMAP, &map);
-+ if (map == NULL) {
-+ st->print_cr("Error: Cannot print dynamic libraries.");
-+ return;
-+ }
-+
-+ while (map->l_prev != NULL)
-+ map = map->l_prev;
-+
-+ while (map != NULL) {
-+ st->print_cr(PTR_FORMAT " \t%s", map->l_addr, map->l_name);
-+ map = map->l_next;
-+ }
-+
-+ dlclose(handle);
-+#elif defined(__APPLE__)
-+ uint32_t count;
-+ uint32_t i;
-+
-+ count = _dyld_image_count();
-+ for (i = 1; i < count; i++) {
-+ const char *name = _dyld_get_image_name(i);
-+ intptr_t slide = _dyld_get_image_vmaddr_slide(i);
-+ st->print_cr(PTR_FORMAT " \t%s", slide, name);
-+ }
-+#else
-+ st->print_cr("Error: Cannot print dynamic libraries.");
-+#endif
-+#else
- char fname[32];
- pid_t pid = os::Bsd::gettid();
-
-@@ -1984,6 +2257,7 @@
- if (!_print_ascii_file(fname, st)) {
- st->print("Can not get library information for pid = %d\n", pid);
- }
-+#endif
- }
-
-
-@@ -2018,6 +2292,7 @@
- st->print(name.machine);
- st->cr();
-
-+#ifndef _ALLBSD_SOURCE
- // Print warning if unsafe chroot environment detected
- if (unsafe_chroot_detected) {
- st->print("WARNING!! ");
-@@ -2032,6 +2307,7 @@
- st->print("(%s stack)", os::Bsd::is_floating_stack() ? "floating" : "fixed");
- }
- st->cr();
-+#endif
-
- // rlimit
- st->print("rlimit:");
-@@ -2057,6 +2333,7 @@
- if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
- else st->print("%d", rlim.rlim_cur);
-
-+#ifndef _ALLBSD_SOURCE
- st->print(", AS ");
- getrlimit(RLIMIT_AS, &rlim);
- if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity");
-@@ -2069,11 +2346,7 @@
- os::loadavg(loadavg, 3);
- st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]);
- st->cr();
--
-- // meminfo
-- st->print("\n/proc/meminfo:\n");
-- _print_ascii_file("/proc/meminfo", st);
-- st->cr();
-+#endif
- }
-
- void os::print_memory_info(outputStream* st) {
-@@ -2081,19 +2354,55 @@
+-#ifdef _ALLBSD_SOURCE
++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__)
+ #ifdef __APPLE__
+ osthread->set_thread_id(::mach_thread_self());
+ #else
+@@ -2366,6 +2409,24 @@
st->print("Memory:");
st->print(" %dk page", os::vm_page_size()>>10);
-+#ifdef _ALLBSD_SOURCE
+#ifdef __FreeBSD__
+ struct xswdev xsw;
+ size_t mibsize, size;
@@ -4868,552 +781,67 @@
+ }
+ }
+#endif
-+#else
++
+ #ifndef _ALLBSD_SOURCE
// values in struct sysinfo are "unsigned long"
struct sysinfo si;
- sysinfo(&si);
-+#endif
-
- st->print(", physical " UINT64_FORMAT "k",
+@@ -2376,17 +2437,22 @@
os::physical_memory() >> 10);
st->print("(" UINT64_FORMAT "k free)",
os::available_memory() >> 10);
-+#ifdef _ALLBSD_SOURCE
-+#ifdef __FreeBSD__
+-#ifndef _ALLBSD_SOURCE
++#if defined(__FreeBSD__)
+ st->print(", swap " UINT64_FORMAT "k",
+ ((jlong)total * os::vm_page_size()) >> 10);
+ st->print("(" UINT64_FORMAT "k free)",
+ ((jlong)(total - used) * os::vm_page_size()) >> 10);
-+#endif
-+#else
++#elif !defined(_ALLBSD_SOURCE)
st->print(", swap " UINT64_FORMAT "k",
((jlong)si.totalswap * si.mem_unit) >> 10);
st->print("(" UINT64_FORMAT "k free)",
((jlong)si.freeswap * si.mem_unit) >> 10);
-+#endif
-+ st->cr();
-+
-+#ifndef _ALLBSD_SOURCE
-+ // meminfo
-+ st->print("\n/proc/meminfo:\n");
-+ _print_ascii_file("/proc/meminfo", st);
+-#endif
st->cr();
-+#endif
- }
-
- // Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific
-@@ -2333,19 +2642,29 @@
- static volatile jint pending_signals[NSIG+1] = { 0 };
-
- // Bsd(POSIX) specific hand shaking semaphore.
-+#ifdef __APPLE__
-+static semaphore_t sig_sem;
-+#define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value)
-+#define SEM_WAIT(sem) semaphore_wait(sem);
-+#define SEM_POST(sem) semaphore_signal(sem);
-+#else
- static sem_t sig_sem;
-+#define SEM_INIT(sem, value) sem_init(&sem, 0, value)
-+#define SEM_WAIT(sem) sem_wait(&sem);
-+#define SEM_POST(sem) sem_post(&sem);
-+#endif
-
- void os::signal_init_pd() {
- // Initialize signal structures
- ::memset((void*)pending_signals, 0, sizeof(pending_signals));
-
- // Initialize signal semaphore
-- ::sem_init(&sig_sem, 0, 0);
-+ ::SEM_INIT(sig_sem, 0);
- }
-
- void os::signal_notify(int sig) {
- Atomic::inc(&pending_signals[sig]);
-- ::sem_post(&sig_sem);
-+ ::SEM_POST(sig_sem);
- }
-
- static int check_pending_signals(bool wait) {
-@@ -2367,7 +2686,7 @@
- do {
- thread->set_suspend_equivalent();
- // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
-- ::sem_wait(&sig_sem);
-+ ::SEM_WAIT(sig_sem);
-
- // were we externally suspended while we were waiting?
- threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
-@@ -2378,7 +2697,7 @@
- // while suspended because that would surprise the thread that
- // suspended us.
- //
-- ::sem_post(&sig_sem);
-+ ::SEM_POST(sig_sem);
-
- thread->java_suspend_self();
- }
-@@ -2422,10 +2741,10 @@
- return;
- }
-
-- char buf[PATH_MAX+1];
-+ char buf[PATH_MAX + 1];
- int num = Atomic::add(1, &cnt);
-
-- snprintf(buf, sizeof(buf), "%s/hs-vm-%d-%d",
-+ snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
- os::get_temp_directory(), os::current_process_id(), num);
- unlink(buf);
-
-@@ -2451,9 +2770,14 @@
- // problem.
- bool os::commit_memory(char* addr, size_t size, bool exec) {
- int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
-+#ifdef __OpenBSD__
-+ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
-+ return ::mprotect(addr, size, prot) == 0;
-+#else
- uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
- MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
- return res != (uintptr_t) MAP_FAILED;
-+#endif
- }
-
- bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
-@@ -2469,36 +2793,27 @@
- }
-
- void os::numa_make_global(char *addr, size_t bytes) {
-- Bsd::numa_interleave_memory(addr, bytes);
- }
-
- void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) {
-- Bsd::numa_tonode_memory(addr, bytes, lgrp_hint);
- }
-
- bool os::numa_topology_changed() { return false; }
-
- size_t os::numa_get_groups_num() {
-- int max_node = Bsd::numa_max_node();
-- return max_node > 0 ? max_node + 1 : 1;
-+ return 1;
- }
-
- int os::numa_get_group_id() {
-- int cpu_id = Bsd::sched_getcpu();
-- if (cpu_id != -1) {
-- int lgrp_id = Bsd::get_node_by_cpu(cpu_id);
-- if (lgrp_id != -1) {
-- return lgrp_id;
-- }
-- }
- return 0;
- }
-
- size_t os::numa_get_leaf_groups(int *ids, size_t size) {
-- for (size_t i = 0; i < size; i++) {
-- ids[i] = i;
-+ if (size > 0) {
-+ ids[0] = 0;
-+ return 1;
- }
-- return size;
-+ return 0;
- }
-
- bool os::get_page_info(char *start, page_info* info) {
-@@ -2509,6 +2824,7 @@
- return end;
- }
-
-+#ifndef _ALLBSD_SOURCE
- extern "C" void numa_warn(int number, char *where, ...) { }
- extern "C" void numa_error(char *where) { }
-
-@@ -2610,104 +2926,26 @@
- os::Bsd::numa_tonode_memory_func_t os::Bsd::_numa_tonode_memory;
- os::Bsd::numa_interleave_memory_func_t os::Bsd::_numa_interleave_memory;
- unsigned long* os::Bsd::_numa_all_nodes;
-+#endif
-
- bool os::uncommit_memory(char* addr, size_t size) {
-+#ifdef __OpenBSD__
-+ // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
-+ return ::mprotect(addr, size, PROT_NONE) == 0;
-+#else
- uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
- MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
- return res != (uintptr_t) MAP_FAILED;
-+#endif
- }
-
--// Bsd uses a growable mapping for the stack, and if the mapping for
--// the stack guard pages is not removed when we detach a thread the
--// stack cannot grow beyond the pages where the stack guard was
--// mapped. If at some point later in the process the stack expands to
--// that point, the Bsd kernel cannot expand the stack any further
--// because the guard pages are in the way, and a segfault occurs.
--//
--// However, it's essential not to split the stack region by unmapping
--// a region (leaving a hole) that's already part of the stack mapping,
--// so if the stack mapping has already grown beyond the guard pages at
--// the time we create them, we have to truncate the stack mapping.
--// So, we need to know the extent of the stack mapping when
--// create_stack_guard_pages() is called.
--
--// Find the bounds of the stack mapping. Return true for success.
--//
--// We only need this for stacks that are growable: at the time of
--// writing thread stacks don't use growable mappings (i.e. those
--// creeated with MAP_GROWSDOWN), and aren't marked "[stack]", so this
--// only applies to the main thread.
--static bool
--get_stack_bounds(uintptr_t *bottom, uintptr_t *top)
--{
-- FILE *f = fopen("/proc/self/maps", "r");
-- if (f == NULL)
-- return false;
--
-- while (!feof(f)) {
-- size_t dummy;
-- char *str = NULL;
-- ssize_t len = getline(&str, &dummy, f);
-- if (len == -1) {
-- fclose(f);
-- return false;
-- }
--
-- if (len > 0 && str[len-1] == '\n') {
-- str[len-1] = 0;
-- len--;
-- }
--
-- static const char *stack_str = "[stack]";
-- if (len > (ssize_t)strlen(stack_str)
-- && (strcmp(str + len - strlen(stack_str), stack_str) == 0)) {
-- if (sscanf(str, "%" SCNxPTR "-%" SCNxPTR, bottom, top) == 2) {
-- uintptr_t sp = (uintptr_t)__builtin_frame_address(0);
-- if (sp >= *bottom && sp <= *top) {
-- free(str);
-- fclose(f);
-- return true;
-- }
-- }
-- }
-- free(str);
-- }
-- fclose(f);
-- return false;
--}
--
--// If the (growable) stack mapping already extends beyond the point
--// where we're going to put our guard pages, truncate the mapping at
--// that point by munmap()ping it. This ensures that when we later
--// munmap() the guard pages we don't leave a hole in the stack
--// mapping. This only affects the main/initial thread, but guard
--// against future OS changes
- bool os::create_stack_guard_pages(char* addr, size_t size) {
-- uintptr_t stack_extent, stack_base;
-- bool chk_bounds = NOT_DEBUG(os::Bsd::is_initial_thread()) DEBUG_ONLY(true);
-- if (chk_bounds && get_stack_bounds(&stack_extent, &stack_base)) {
-- assert(os::Bsd::is_initial_thread(),
-- "growable stack in non-initial thread");
-- if (stack_extent < (uintptr_t)addr)
-- ::munmap((void*)stack_extent, (uintptr_t)addr - stack_extent);
-- }
--
- return os::commit_memory(addr, size);
- }
-
- // If this is a growable mapping, remove the guard pages entirely by
--// munmap()ping them. If not, just call uncommit_memory(). This only
--// affects the main/initial thread, but guard against future OS changes
-+// munmap()ping them. If not, just call uncommit_memory().
- bool os::remove_stack_guard_pages(char* addr, size_t size) {
-- uintptr_t stack_extent, stack_base;
-- bool chk_bounds = NOT_DEBUG(os::Bsd::is_initial_thread()) DEBUG_ONLY(true);
-- if (chk_bounds && get_stack_bounds(&stack_extent, &stack_base)) {
-- assert(os::Bsd::is_initial_thread(),
-- "growable stack in non-initial thread");
--
-- return ::munmap(addr, size) == 0;
-- }
--
- return os::uncommit_memory(addr, size);
- }
-
-@@ -2812,6 +3050,9 @@
- static size_t _large_page_size = 0;
-
- bool os::large_page_init() {
-+#ifdef _ALLBSD_SOURCE
-+ return false;
-+#else
- if (!UseLargePages) return false;
- if (LargePageSizeInBytes) {
-@@ -2869,6 +3110,7 @@
- // We optimistically assume the support is available. If later it turns out
- // not true, VM will automatically switch to use regular page size.
- return true;
+ // meminfo
+ st->print("\n/proc/meminfo:\n");
+ _print_ascii_file("/proc/meminfo", st);
+#endif
+ st->cr();
}
- #ifndef SHM_HUGETLB
-@@ -3045,7 +3287,7 @@
- }
-
- size_t os::read(int fd, void *buf, unsigned int nBytes) {
-- return ::read(fd, buf, nBytes);
-+ RESTARTABLE_RETURN_INT(::read(fd, buf, nBytes));
- }
-
- // TODO-FIXME: reconcile Solaris' os::sleep with the bsd variation.
-@@ -3181,6 +3423,44 @@
- // this reason, the code should not be used as default (ThreadPriorityPolicy=0).
- // It is only used when ThreadPriorityPolicy=1 and requires root privilege.
+@@ -2533,10 +2599,17 @@
+ jrelib_p = buf + len;
-+#if defined(_ALLBSD_SOURCE) && !defined(__APPLE__)
-+int os::java_to_os_priority[MaxPriority + 1] = {
-+ 19, // 0 Entry should never be used
-+
-+ 0, // 1 MinPriority
-+ 3, // 2
-+ 6, // 3
-+
-+ 10, // 4
-+ 15, // 5 NormPriority
-+ 18, // 6
-+
-+ 21, // 7
-+ 25, // 8
-+ 28, // 9 NearMaxPriority
-+
-+ 31 // 10 MaxPriority
-+};
-+#elif defined(__APPLE__)
-+/* Using Mach high-level priority assignments */
-+int os::java_to_os_priority[MaxPriority + 1] = {
-+ 0, // 0 Entry should never be used (MINPRI_USER)
-+
-+ 27, // 1 MinPriority
-+ 28, // 2
-+ 29, // 3
-+
-+ 30, // 4
-+ 31, // 5 NormPriority (BASEPRI_DEFAULT)
-+ 32, // 6
-+
-+ 33, // 7
-+ 34, // 8
-+ 35, // 9 NearMaxPriority
-+
-+ 36 // 10 MaxPriority
-+};
+ // Add the appropriate library subdir
++#ifdef __APPLE__
+ snprintf(jrelib_p, buflen-len, "/jre/lib");
+ if (0 != access(buf, F_OK)) {
+ snprintf(jrelib_p, buflen-len, "/lib");
+ }
+#else
- int os::java_to_os_priority[MaxPriority + 1] = {
- 19, // 0 Entry should never be used
-
-@@ -3198,6 +3478,7 @@
-
- -5 // 10 MaxPriority
- };
++ snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
++ if (0 != access(buf, F_OK)) {
++ snprintf(jrelib_p, buflen-len, "/lib/%s", cpu_arch);
++ }
+#endif
- static int prio_init() {
- if (ThreadPriorityPolicy == 1) {
-@@ -3217,8 +3498,28 @@
- OSReturn os::set_native_priority(Thread* thread, int newpri) {
- if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
-
-+#ifdef __OpenBSD__
-+ // OpenBSD pthread_setprio starves low priority threads
-+ return OS_OK;
-+#elif defined(__FreeBSD__)
-+ int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri);
-+#elif defined(__APPLE__) || defined(__NetBSD__)
-+ struct sched_param sp;
-+ int policy;
-+ pthread_t self = pthread_self();
-+
-+ if (pthread_getschedparam(self, &policy, &sp) != 0)
-+ return OS_ERR;
-+
-+ sp.sched_priority = newpri;
-+ if (pthread_setschedparam(self, policy, &sp) != 0)
-+ return OS_ERR;
-+
-+ return OS_OK;
-+#else
+ // Add the appropriate client or server subdir
+ len = strlen(buf);
+@@ -3654,8 +3727,8 @@
+ return OS_OK;
+ #else
int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
- return (ret == 0) ? OS_OK : OS_ERR;
-+#endif
+- return (ret == 0) ? OS_OK : OS_ERR;
+ #endif
++ return (ret == 0) ? OS_OK : OS_ERR;
}
OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) {
-@@ -3228,7 +3529,17 @@
- }
-
- errno = 0;
-+#if defined(__OpenBSD__) || defined(__FreeBSD__)
-+ *priority_ptr = pthread_getprio(thread->osthread()->pthread_id());
-+#elif defined(__APPLE__) || defined(__NetBSD__)
-+ int policy;
-+ struct sched_param sp;
-+
-+ pthread_getschedparam(pthread_self(), &policy, &sp);
-+ *priority_ptr = sp.sched_priority;
-+#else
- *priority_ptr = getpriority(PRIO_PROCESS, thread->osthread()->thread_id());
-+#endif
- return (*priority_ptr != -1 || errno == 0 ? OS_OK : OS_ERR);
- }
-
-@@ -3338,7 +3649,7 @@
- /* Get signal number to use for suspend/resume */
- if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) {
- int sig = ::strtol(s, 0, 10);
-- if (sig > 0 || sig < _NSIG) {
-+ if (sig > 0 || sig < NSIG) {
- SR_signum = sig;
- }
- }
-@@ -3682,6 +3993,28 @@
- set_signal_handler(SIGFPE, true);
- set_signal_handler(SIGXFSZ, true);
-
-+#if defined(__APPLE__)
-+ // In Mac OS X 10.4, CrashReporter will write a crash log for all 'fatal' signals, including
-+ // signals caught and handled by the JVM. To work around this, we reset the mach task
-+ // signal handler that's placed on our process by CrashReporter. This disables
-+ // CrashReporter-based reporting.
-+ //
-+ // This work-around is not necessary for 10.5+, as CrashReporter no longer intercedes
-+ // on caught fatal signals.
-+ //
-+ // Additionally, gdb installs both standard BSD signal handlers, and mach exception
-+ // handlers. By replacing the existing task exception handler, we disable gdb's mach
-+ // exception handling, while leaving the standard BSD signal handlers functional.
-+ kern_return_t kr;
-+ kr = task_set_exception_ports(mach_task_self(),
-+ EXC_MASK_BAD_ACCESS | EXC_MASK_ARITHMETIC,
-+ MACH_PORT_NULL,
-+ EXCEPTION_STATE_IDENTITY,
-+ MACHINE_THREAD_STATE);
-+
-+ assert(kr == KERN_SUCCESS, "could not set mach task signal handler");
-+#endif
-+
- if (libjsig_is_loaded) {
- // Tell libjsig jvm finishes setting signal handlers
- (*end_signal_setting)();
-@@ -3702,6 +4035,7 @@
- }
- }
-
-+#ifndef _ALLBSD_SOURCE
- // This is the fastest way to get thread cpu time on Bsd.
- // Returns cpu time (user+sys) for any thread, not only for current.
- // POSIX compliant clocks are implemented in the kernels 2.6.16+.
-@@ -3716,6 +4050,7 @@
-
- return (tp.tv_sec * SEC_IN_NANOSECS) + tp.tv_nsec;
- }
-+#endif
-
- /////
- // glibc on Bsd platform uses non-documented flag
-@@ -3937,13 +4272,13 @@
-
- _initial_pid = (java_launcher_pid > 0) ? java_launcher_pid : getpid();
-
-- clock_tics_per_sec = sysconf(_SC_CLK_TCK);
-+ clock_tics_per_sec = CLK_TCK;
-
- init_random(1234567);
-
- ThreadCritical::initialize();
-
-- Bsd::set_page_size(sysconf(_SC_PAGESIZE));
-+ Bsd::set_page_size(getpagesize());
- if (Bsd::page_size() == -1) {
- fatal(err_msg("os_bsd.cpp: os::init: sysconf failed (%s)",
- strerror(errno)));
-@@ -3957,7 +4292,16 @@
-
- Bsd::clock_init();
- initial_time_count = os::elapsed_counter();
-- pthread_mutex_init(&dl_mutex, NULL);
-+
-+#ifdef __APPLE__
-+ // XXXDARWIN
-+ // Work around the unaligned VM callbacks in hotspot's
-+ // sharedRuntime. The callbacks don't use SSE2 instructions, and work on
-+ // Linux, Solaris, and FreeBSD. On Mac OS X, dyld (rightly so) enforces
-+ // alignment when doing symbol lookup. To work around this, we force early
-+ // binding of all symbols now, thus binding when alignment is known-good.
-+ _dyld_bind_fully_image_containing_address((const void *) &os::init);
-+#endif
- }
-
- // To install functions for atexit system call
-@@ -3970,7 +4314,9 @@
- // this is called _after_ the global arguments have been parsed
- jint os::init_2(void)
- {
-+#ifndef _ALLBSD_SOURCE
- Bsd::fast_thread_clock_init();
-+#endif
-
- // Allocate a single page and mark it as readable for safepoint polling
- address polling_page = (address) ::mmap(NULL, Bsd::page_size(), PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
-@@ -4028,6 +4374,7 @@
- JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes,
- vm_page_size()));
-
-+#ifndef _ALLBSD_SOURCE
- Bsd::capture_initial_stack(JavaThread::stack_size_at_create());
-
- Bsd::libpthread_init();
-@@ -4050,6 +4397,7 @@
- UseNUMA = true;
- }
- }
-+#endif
-
- if (MaxFDLimit) {
- // set the number of file descriptors to max. print out error
-@@ -4061,6 +4409,14 @@
- perror("os::init_2 getrlimit failed");
- } else {
- nbr_files.rlim_cur = nbr_files.rlim_max;
-+
-+#ifdef __APPLE__
-+ // Darwin returns RLIM_INFINITY for rlim_max, but fails with EINVAL if
-+ // you attempt to use RLIM_INFINITY. As per setrlimit(2), OPEN_MAX must
-+ // be used instead
-+ nbr_files.rlim_cur = MIN(OPEN_MAX, nbr_files.rlim_cur);
-+#endif
-+
- status = setrlimit(RLIMIT_NOFILE, &nbr_files);
- if (status != 0) {
- if (PrintMiscellaneous && (Verbose || WizardMode))
-@@ -4069,8 +4425,10 @@
- }
- }
-
-+#ifndef _ALLBSD_SOURCE
- // Initialize lock used to serialize thread creation (see os::create_thread)
- Bsd::set_createThread_lock(new Mutex(Mutex::leaf, "createThread_lock", false));
-+#endif
-
- // at-exit methods are called in the reverse order of their registration.
- // atexit functions are called on return from main or as a result of a
-@@ -4114,11 +4472,29 @@
- };
+@@ -4634,6 +4707,20 @@
int os::active_processor_count() {
-+#ifdef _ALLBSD_SOURCE
+ #ifdef _ALLBSD_SOURCE
+#ifdef __FreeBSD__
+ int online_cpus = 0;
+#if __FreeBSD_version > 700109
@@ -5428,488 +856,28 @@
+ if (online_cpus > 0 && online_cpus <= _processor_count)
+ return online_cpus;
+#endif
-+ return _processor_count;
-+#else
+ return _processor_count;
+ #else
// Bsd doesn't yet have a (official) notion of processor sets,
- // so just return the number of online processors.
- int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
- assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
- return online_cpus;
-+#endif
- }
-
- bool os::distribute_processes(uint length, uint* distribution) {
-@@ -4160,6 +4536,9 @@
-
- int os::Bsd::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime)
- {
-+#ifdef _ALLBSD_SOURCE
-+ return pthread_cond_timedwait(_cond, _mutex, _abstime);
-+#else
- if (is_NPTL()) {
- return pthread_cond_timedwait(_cond, _mutex, _abstime);
- } else {
-@@ -4175,6 +4554,7 @@
- #endif // IA64
- return status;
- }
-+#endif
- }
-
- ////////////////////////////////////////////////////////////////////////////////
-@@ -4322,14 +4702,14 @@
- int o_delete = (oflag & O_DELETE);
- oflag = oflag & ~O_DELETE;
-
-- fd = ::open64(path, oflag, mode);
-+ fd = ::open(path, oflag, mode);
- if (fd == -1) return -1;
-
- //If the open succeeded, the file might still be a directory
- {
-- struct stat64 buf64;
-- int ret = ::fstat64(fd, &buf64);
-- int st_mode = buf64.st_mode;
-+ struct stat buf;
-+ int ret = ::fstat(fd, &buf);
-+ int st_mode = buf.st_mode;
-
- if (ret != -1) {
- if ((st_mode & S_IFMT) == S_IFDIR) {
-@@ -4386,17 +4766,17 @@
- if (!rewrite_existing) {
- oflags |= O_EXCL;
- }
-- return ::open64(path, oflags, S_IREAD | S_IWRITE);
-+ return ::open(path, oflags, S_IREAD | S_IWRITE);
- }
-
- // return current position of file pointer
- jlong os::current_file_offset(int fd) {
-- return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR);
-+ return (jlong)::lseek(fd, (off_t)0, SEEK_CUR);
- }
-
- // move file pointer to the specified offset
- jlong os::seek_to_file_offset(int fd, jlong offset) {
-- return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET);
-+ return (jlong)::lseek(fd, (off_t)offset, SEEK_SET);
- }
-
- // This code originates from JDK's sysAvailable
-@@ -4405,10 +4785,10 @@
- int os::available(int fd, jlong *bytes) {
- jlong cur, end;
- int mode;
-- struct stat64 buf64;
-+ struct stat buf;
-
-- if (::fstat64(fd, &buf64) >= 0) {
-- mode = buf64.st_mode;
-+ if (::fstat(fd, &buf) >= 0) {
-+ mode = buf.st_mode;
- if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
- /*
- * XXX: is the following call interruptible? If so, this might
-@@ -4422,11 +4802,11 @@
- }
- }
- }
-- if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) {
-+ if ((cur = ::lseek(fd, 0L, SEEK_CUR)) == -1) {
- return 0;
-- } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) {
-+ } else if ((end = ::lseek(fd, 0L, SEEK_END)) == -1) {
- return 0;
-- } else if (::lseek64(fd, cur, SEEK_SET) == -1) {
-+ } else if (::lseek(fd, cur, SEEK_SET) == -1) {
- return 0;
- }
- *bytes = end - cur;
-@@ -4489,6 +4869,7 @@
- return munmap(addr, bytes) == 0;
- }
-
-+#ifndef _ALLBSD_SOURCE
- static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time);
-
- static clockid_t thread_cpu_clockid(Thread* thread) {
-@@ -4500,6 +4881,7 @@
- assert(rc == 0, "pthread_getcpuclockid is expected to return 0 code");
- return clockid;
- }
-+#endif
-
- // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool)
- // are used by JVM M&M and JVMTI to get user+sys or user CPU time
-@@ -4509,39 +4891,71 @@
- // the fast estimate available on the platform.
-
- jlong os::current_thread_cpu_time() {
-+#ifdef __APPLE__
-+ return os::thread_cpu_time(Thread::current(), true /* user + sys */);
-+#elif !defined(_ALLBSD_SOURCE)
- if (os::Bsd::supports_fast_thread_cpu_time()) {
- return os::Bsd::fast_thread_cpu_time(CLOCK_THREAD_CPUTIME_ID);
- } else {
- // return user + sys since the cost is the same
- return slow_thread_cpu_time(Thread::current(), true /* user + sys */);
- }
-+#endif
- }
-
- jlong os::thread_cpu_time(Thread* thread) {
-+#ifndef _ALLBSD_SOURCE
- // consistent with what current_thread_cpu_time() returns
- if (os::Bsd::supports_fast_thread_cpu_time()) {
- return os::Bsd::fast_thread_cpu_time(thread_cpu_clockid(thread));
- } else {
- return slow_thread_cpu_time(thread, true /* user + sys */);
- }
-+#endif
- }
-
- jlong os::current_thread_cpu_time(bool user_sys_cpu_time) {
-+#ifdef __APPLE__
-+ return os::thread_cpu_time(Thread::current(), user_sys_cpu_time);
-+#elif !defined(_ALLBSD_SOURCE)
- if (user_sys_cpu_time && os::Bsd::supports_fast_thread_cpu_time()) {
- return os::Bsd::fast_thread_cpu_time(CLOCK_THREAD_CPUTIME_ID);
- } else {
- return slow_thread_cpu_time(Thread::current(), user_sys_cpu_time);
- }
-+#endif
- }
-
- jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) {
-+#ifdef __APPLE__
-+ struct thread_basic_info tinfo;
-+ mach_msg_type_number_t tcount = THREAD_INFO_MAX;
-+ kern_return_t kr;
-+ mach_port_t mach_thread;
-+
-+ mach_thread = pthread_mach_thread_np(thread->osthread()->thread_id());
-+ kr = thread_info(mach_thread, THREAD_BASIC_INFO, (thread_info_t)&tinfo, &tcount);
-+ if (kr != KERN_SUCCESS)
-+ return -1;
-+
-+ if (user_sys_cpu_time) {
-+ jlong nanos;
-+ nanos = ((jlong) tinfo.system_time.seconds + tinfo.user_time.seconds) * (jlong)1000000000;
-+ nanos += ((jlong) tinfo.system_time.microseconds + (jlong) tinfo.user_time.microseconds) * (jlong)1000;
-+ return nanos;
-+ } else {
-+ return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000);
-+ }
-+#elif !defined(_ALLBSD_SOURCE)
- if (user_sys_cpu_time && os::Bsd::supports_fast_thread_cpu_time()) {
- return os::Bsd::fast_thread_cpu_time(thread_cpu_clockid(thread));
- } else {
- return slow_thread_cpu_time(thread, user_sys_cpu_time);
- }
-+#endif
- }
-
-+#ifndef _ALLBSD_SOURCE
- //
- // -1 on error.
- //
-@@ -4631,6 +5045,7 @@
- return (jlong)user_time * (1000000000 / clock_tics_per_sec);
- }
- }
-+#endif
-
- void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) {
- info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits
-@@ -4647,7 +5062,13 @@
- }
-
- bool os::is_thread_cpu_time_supported() {
-+#ifdef __APPLE__
- return true;
-+#elif defined(_ALLBSD_SOURCE)
-+ return false;
-+#else
-+ return true;
-+#endif
- }
-
- // System loadavg support. Returns -1 if load average cannot be obtained.
-@@ -4780,7 +5201,7 @@
- // abstime will be the absolute timeout time
- // TODO: replace compute_abstime() with unpackTime()
-
--static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
-+static struct timespec* compute_abstime(struct timespec* abstime, jlong millis) {
- if (millis < 0) millis = 0;
- struct timeval now;
- int status = gettimeofday(&now, NULL);
-@@ -4832,7 +5253,7 @@
- status = pthread_cond_wait(_cond, _mutex);
- // for some reason, under 2.7 lwp_cond_wait() may return ETIME ...
- // Treat this the same as if the wait was interrupted
-- if (status == ETIME) { status = EINTR; }
-+ if (status == ETIMEDOUT) { status = EINTR; }
- assert_status(status == 0 || status == EINTR, status, "cond_wait");
- }
- -- _nParked ;
-@@ -4890,10 +5311,10 @@
- pthread_cond_init (_cond, NULL) ;
- }
- assert_status(status == 0 || status == EINTR ||
-- status == ETIME || status == ETIMEDOUT,
-+ status == ETIMEDOUT,
- status, "cond_timedwait");
- if (!FilterSpuriousWakeups) break ; // previous semantics
-- if (status == ETIME || status == ETIMEDOUT) break ;
-+ if (status == ETIMEDOUT) break ;
- // We consume and ignore EINTR and spurious wakeups.
- }
- --_nParked ;
-@@ -4985,7 +5406,7 @@
- * years from "now".
- */
-
--static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
-+static void unpackTime(struct timespec* absTime, bool isAbsolute, jlong time) {
- assert (time > 0, "convertTime");
-
- struct timeval now;
-@@ -5045,7 +5466,7 @@
- }
-
- // Next, demultiplex/decode time arguments
-- timespec absTime;
-+ struct timespec absTime;
- if (time < 0 || (isAbsolute && time == 0) ) { // don't wait at all
- return;
- }
-@@ -5099,7 +5520,7 @@
- }
- }
- assert_status(status == 0 || status == EINTR ||
-- status == ETIME || status == ETIMEDOUT,
-+ status == ETIMEDOUT,
- status, "cond_timedwait");
-
- #ifdef ASSERT
-@@ -5142,14 +5563,12 @@
- }
-
-
-+/* Darwin has no "environ" in a dynamic library. */
-+#ifdef __APPLE__
-+#include <crt_externs.h>
-+#define environ (*_NSGetEnviron())
-+#else
- extern char** environ;
--
--#ifndef __NR_fork
--#define __NR_fork IA32_ONLY(2) IA64_ONLY(not defined) AMD64_ONLY(57)
--#endif
--
--#ifndef __NR_execve
--#define __NR_execve IA32_ONLY(11) IA64_ONLY(1033) AMD64_ONLY(59)
- #endif
-
- // Run the specified command in a separate process. Return its exit value,
-@@ -5164,8 +5583,7 @@
- // separate process to execve. Make a direct syscall to fork process.
- // On IA64 there's no fork syscall, we have to use fork() and hope for
- // the best...
-- pid_t pid = NOT_IA64(syscall(__NR_fork);)
-- IA64_ONLY(fork();)
-+ pid_t pid = fork();
-
- if (pid < 0) {
- // fork failed
-@@ -5181,8 +5599,7 @@
- // in the new process, so make a system call directly.
- // IA64 should use normal execve() from glibc to match the glibc fork()
- // above.
-- NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
-- IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
-+ execve("/bin/sh", (char* const*)argv, environ);
-
- // execve failed
- _exit(-1);
--- hotspot/src/os/bsd/vm/os_bsd.hpp
+++ hotspot/src/os/bsd/vm/os_bsd.hpp
-@@ -30,6 +30,12 @@
- /* pthread_getattr_np comes with BsdThreads-0.9-7 on RedHat 7.1 */
- typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *);
-
-+#ifdef __APPLE__
-+// Mac OS X doesn't support clock_gettime. Stub out the type, it is
-+// unused
-+typedef int clockid_t;
-+#endif
-+
- class Bsd {
- friend class os;
-
-@@ -50,6 +56,7 @@
- static int sigflags[MAXSIGNUM];
-
- static int (*_clock_gettime)(clockid_t, struct timespec *);
-+#ifndef _ALLBSD_SOURCE
- static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *);
-
- static address _initial_thread_stack_bottom;
-@@ -61,6 +68,7 @@
- static bool _is_floating_stack;
- static bool _is_NPTL;
- static bool _supports_fast_thread_cpu_time;
-+#endif
-
- static GrowableArray<int>* _cpu_to_node;
-
-@@ -68,38 +76,54 @@
-
- static julong _physical_memory;
- static pthread_t _main_thread;
-+#ifndef _ALLBSD_SOURCE
- static Mutex* _createThread_lock;
-+#endif
- static int _page_size;
-
- static julong available_memory();
- static julong physical_memory() { return _physical_memory; }
- static void initialize_system_info();
-
-+#ifndef _ALLBSD_SOURCE
- static void set_glibc_version(const char *s) { _glibc_version = s; }
- static void set_libpthread_version(const char *s) { _libpthread_version = s; }
-+#endif
-
- static bool supports_variable_stack_size();
-
-+#ifndef _ALLBSD_SOURCE
- static void set_is_NPTL() { _is_NPTL = true; }
- static void set_is_BsdThreads() { _is_NPTL = false; }
- static void set_is_floating_stack() { _is_floating_stack = true; }
-+#endif
-
- static void rebuild_cpu_to_node_map();
- static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; }
- public:
-+
- static void init_thread_fpu_state();
-+#ifndef _ALLBSD_SOURCE
- static int get_fpu_control_word();
- static void set_fpu_control_word(int fpu_control);
-+#endif
+@@ -112,13 +112,15 @@
+ #endif
static pthread_t main_thread(void) { return _main_thread; }
-+
-+#ifdef __FreeBSD__
+
+-#ifndef _ALLBSD_SOURCE
++#if !defined(_ALLBSD_SOURCE) || defined(__FreeBSD__)
// returns kernel thread id (similar to LWP id on Solaris), which can be
// used to access /proc
static pid_t gettid();
-+#endif
+#ifndef _ALLBSD_SOURCE
static void set_createThread_lock(Mutex* lk) { _createThread_lock = lk; }
static Mutex* createThread_lock(void) { return _createThread_lock; }
+ #endif
+#endif
static void hotspot_sigmask(Thread* thread);
-+#ifndef _ALLBSD_SOURCE
- static address initial_thread_stack_bottom(void) { return _initial_thread_stack_bottom; }
- static uintptr_t initial_thread_stack_size(void) { return _initial_thread_stack_size; }
-+#endif
- static bool is_initial_thread(void);
-
- static int page_size(void) { return _page_size; }
-@@ -136,6 +160,7 @@
- static struct sigaction *get_chained_signal_action(int sig);
- static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
-
-+#ifndef _ALLBSD_SOURCE
- // GNU libc and libpthread version strings
- static const char *glibc_version() { return _glibc_version; }
- static const char *libpthread_version() { return _libpthread_version; }
-@@ -151,6 +176,7 @@
- static void libpthread_init();
- static bool libnuma_init();
- static void* libnuma_dlsym(void* handle, const char* name);
-+#endif
- // Minimum stack size a thread can be created with (allowing
- // the VM to completely create the thread and enter user code)
- static size_t min_stack_allowed;
-@@ -159,17 +185,21 @@
- static size_t default_stack_size(os::ThreadType thr_type);
- static size_t default_guard_size(os::ThreadType thr_type);
-
-+#ifndef _ALLBSD_SOURCE
- static void capture_initial_stack(size_t max_size);
-
- // Stack overflow handling
- static bool manually_expand_stack(JavaThread * t, address addr);
- static int max_register_window_saves_before_flushing();
-+#endif
-
- // Real-time clock functions
- static void clock_init(void);
-
-+#ifndef _ALLBSD_SOURCE
- // fast POSIX clocks support
- static void fast_thread_clock_init(void);
-+#endif
-
- static bool supports_monotonic_clock() {
- return _clock_gettime != NULL;
-@@ -179,6 +209,7 @@
- return _clock_gettime ? _clock_gettime(clock_id, tp) : -1;
- }
-
-+#ifndef _ALLBSD_SOURCE
- static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) {
- return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1;
- }
-@@ -188,6 +219,7 @@
- }
-
- static jlong fast_thread_cpu_time(clockid_t clockid);
-+#endif
-
- // Stack repair handling
-
---- hotspot/src/os/bsd/vm/os_bsd.inline.hpp
-+++ hotspot/src/os/bsd/vm/os_bsd.inline.hpp
-@@ -86,7 +86,15 @@
-
- inline bool os::allocate_stack_guard_pages() {
- assert(uses_stack_guard_pages(), "sanity check");
-+#if !defined(__FreeBSD__) || __FreeBSD__ < 5
-+ // Since FreeBSD 4 uses malloc() for allocating the thread stack
-+ // there is no need to do anything extra to allocate the guard pages
-+ return false;
-+#else
-+ // FreeBSD 5+ uses mmap MAP_STACK for allocating the thread stacks.
-+ // Must 'allocate' them or guard pages are ignored.
- return true;
-+#endif
- }
-
-
-@@ -118,7 +126,7 @@
- }
-
- inline jlong os::lseek(int fd, jlong offset, int whence) {
-- return (jlong) ::lseek64(fd, offset, whence);
-+ return (jlong) ::lseek(fd, (off_t)offset, whence);
- }
-
- inline int os::fsync(int fd) {
-@@ -130,7 +138,7 @@
- }
-
- inline int os::ftruncate(int fd, jlong length) {
-- return ::ftruncate64(fd, length);
-+ return ::ftruncate(fd, (off_t)length);
- }
-
- inline struct dirent* os::readdir(DIR* dirp, dirent *dbuf)
+ #ifndef _ALLBSD_SOURCE
--- hotspot/src/os/bsd/vm/vmError_bsd.cpp
+++ hotspot/src/os/bsd/vm/vmError_bsd.cpp
@@ -34,6 +34,12 @@
@@ -5945,7 +913,7 @@
os::fork_and_exec(buf);
--- hotspot/src/os/posix/launcher/java_md.c
+++ hotspot/src/os/posix/launcher/java_md.c
-@@ -35,20 +35,30 @@
+@@ -35,6 +35,9 @@
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
@@ -5955,29 +923,7 @@
#ifndef GAMMA
#include "manifest_info.h"
- #include "version_comp.h"
- #endif
-
--#ifdef __linux__
-+#if defined(__linux__) || defined(_ALLBSD_SOURCE)
- #include <pthread.h>
- #else
- #include <thread.h>
- #endif
-
-+#ifdef __APPLE__
-+#define JVM_DLL "libjvm.dylib"
-+#define JAVA_DLL "libjava.dylib"
-+#define LD_LIBRARY_PATH "DYLD_LIBRARY_PATH"
-+#else
- #define JVM_DLL "libjvm.so"
- #define JAVA_DLL "libjava.so"
-+#define LD_LIBRARY_PATH "LD_LIBRARY_PATH"
-+#endif
-
- #ifndef GAMMA /* launcher.make defines ARCH */
- /*
-@@ -89,7 +99,7 @@
+@@ -96,7 +99,7 @@
* A collection of useful strings. One should think of these as #define
* entries, but actual strings can be more efficient (with many compilers).
*/
@@ -5986,61 +932,7 @@
static const char *system_dir = "/usr/java";
static const char *user_dir = "/java";
#else /* Solaris */
-@@ -423,10 +433,10 @@
- * If not on Solaris, assume only a single LD_LIBRARY_PATH
- * variable.
- */
-- runpath = getenv("LD_LIBRARY_PATH");
-+ runpath = getenv(LD_LIBRARY_PATH);
- #endif /* __sun */
-
--#ifdef __linux
-+#if defined(__linux)
- /*
- * On linux, if a binary is running as sgid or suid, glibc sets
- * LD_LIBRARY_PATH to the empty string for security purposes. (In
-@@ -442,6 +452,22 @@
- if((getgid() != getegid()) || (getuid() != geteuid()) ) {
- return;
- }
-+#elif defined(_ALLBSD_SOURCE)
-+ /*
-+ * On BSD, if a binary is running as sgid or suid, libc sets
-+ * LD_LIBRARY_PATH to the empty string for security purposes. (In
-+ * contrast, on Solaris the LD_LIBRARY_PATH variable for a
-+ * privileged binary does not lose its settings; but the dynamic
-+ * linker does apply more scrutiny to the path.) The launcher uses
-+ * the value of LD_LIBRARY_PATH to prevent an exec loop.
-+ * Therefore, if we are running sgid or suid, this function's
-+ * setting of LD_LIBRARY_PATH will be ineffective and we should
-+ * return from the function now. Getting the right libraries to
-+ * be found must be handled through other mechanisms.
-+ */
-+ if(issetugid()) {
-+ return;
-+ }
- #endif
-
- /* runpath contains current effective LD_LIBRARY_PATH setting */
-@@ -450,7 +476,7 @@
- new_runpath = JLI_MemAlloc( ((runpath!=NULL)?strlen(runpath):0) +
- 2*strlen(jrepath) + 2*strlen(arch) +
- strlen(jvmpath) + 52);
-- newpath = new_runpath + strlen("LD_LIBRARY_PATH=");
-+ newpath = new_runpath + strlen(LD_LIBRARY_PATH "=");
-
-
- /*
-@@ -465,7 +491,7 @@
-
- /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
-
-- sprintf(new_runpath, "LD_LIBRARY_PATH="
-+ sprintf(new_runpath, LD_LIBRARY_PATH "="
- "%s:"
- "%s/lib/%s:"
- "%s/../lib/%s",
-@@ -503,7 +529,7 @@
+@@ -526,7 +529,7 @@
* LD_LIBRARY_PATH. Note that this prevents any possible infinite
* loop of execv() because we test for the prefix, above.
*/
@@ -6049,16 +941,7 @@
strcat(new_runpath, ":");
strcat(new_runpath, runpath);
}
-@@ -792,7 +818,7 @@
- jboolean
- GetApplicationHome(char *buf, jint bufsize)
- {
--#ifdef __linux__
-+#if defined(__linux__) || defined(_ALLBSD_SOURCE)
- char *execname = GetExecname();
- if (execname) {
- strncpy(buf, execname, bufsize-1);
-@@ -961,9 +987,13 @@
+@@ -992,9 +995,13 @@
}
}
}
@@ -6073,7 +956,7 @@
char buf[PATH_MAX+1];
int len = readlink(self, buf, PATH_MAX);
if (len >= 0) {
-@@ -971,7 +1001,7 @@
+@@ -1002,7 +1009,7 @@
exec_path = JLI_StringDup(buf);
}
}
@@ -6082,7 +965,7 @@
{
/* Not implemented */
}
-@@ -1069,6 +1099,7 @@
+@@ -1100,6 +1107,7 @@
/* Compute physical memory by asking the OS */
uint64_t
physical_memory(void) {
@@ -6090,7 +973,7 @@
const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES);
const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE);
const uint64_t result = pages * page_size;
-@@ -1080,6 +1111,28 @@
+@@ -1111,6 +1119,28 @@
" physical memory: " UINT64_FORMAT " (%.3fGB)\n",
pages, page_size, result, result / (double) GB);
}
@@ -6119,74 +1002,34 @@
return result;
}
-@@ -1175,7 +1228,7 @@
+@@ -1271,7 +1301,7 @@
+ #endif
+ }
+
+-#endif /* __linux__ && i586 */
++#endif /* (__linux__ || _ALLBSD_SOURCE) && i586 */
+
+ #ifdef i586
+ /*
+@@ -1450,7 +1480,7 @@
#endif /* __sun && i586 */
-#if defined(__linux__) && defined(i586)
+#if (defined(__linux__) || defined(_ALLBSD_SOURCE)) && defined(i586)
- /*
- * A utility method for asking the CPU about itself.
-@@ -1240,7 +1293,7 @@
- #endif
+ /* The definition of a server-class machine for linux-i586 */
+ jboolean
+@@ -1481,7 +1511,7 @@
+ return result;
}
-#endif /* __linux__ && i586 */
+#endif /* (__linux__ || _ALLBSD_SOURCE) && i586 */
- #ifdef i586
- /*
-@@ -1452,6 +1505,39 @@
+ #if defined(_ALLBSD_SOURCE) && defined(i586)
- #endif /* __linux__ && i586 */
-
-+#if defined(_ALLBSD_SOURCE) && defined(i586)
-+
-+/* The definition of a server-class machine for bsd-i586 */
-+jboolean
-+bsd_i586_ServerClassMachine(void) {
-+ jboolean result = JNI_FALSE;
-+ /* How big is a server class machine? */
-+ const unsigned long server_processors = 2UL;
-+ const uint64_t server_memory = 2UL * GB;
-+ /*
-+ * We seem not to get our full complement of memory.
-+ * We allow some part (1/8?) of the memory to be "missing",
-+ * based on the sizes of DIMMs, and maybe graphics cards.
-+ */
-+ const uint64_t missing_memory = 256UL * MB;
-+ const uint64_t actual_memory = physical_memory();
-+
-+ /* Is this a server class machine? */
-+ if (actual_memory >= (server_memory - missing_memory)) {
-+ const unsigned long actual_processors = physical_processors();
-+ if (actual_processors >= server_processors) {
-+ result = JNI_TRUE;
-+ }
-+ }
-+ if (_launcher_debug) {
-+ printf("bsd_" LIBARCHNAME "_ServerClassMachine: %s\n",
-+ (result == JNI_TRUE ? "true" : "false"));
-+ }
-+ return result;
-+}
-+
-+#endif /* _ALLBSD_SOURCE && i586 */
-+
- /* Dispatch to the platform-specific definition of "server-class" */
- jboolean
- ServerClassMachine(void) {
-@@ -1466,6 +1552,8 @@
- result = solaris_i586_ServerClassMachine();
- #elif defined(__linux__) && defined(i586)
- result = linux_i586_ServerClassMachine();
-+#elif defined(_ALLBSD_SOURCE) && defined(i586)
-+ result = bsd_i586_ServerClassMachine();
- #else
- if (_launcher_debug) {
- printf("ServerClassMachine: returns default value of %s\n",
-@@ -1606,7 +1694,7 @@
+@@ -1672,7 +1702,7 @@
while (dp != NULL) {
cp = strchr(dp, (int)':');
if (cp != NULL)
@@ -6195,16 +1038,7 @@
if ((target = ProcessDir(info, dp)) != NULL)
break;
dp = cp;
-@@ -1821,7 +1909,7 @@
- int
- ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
- int rslt;
--#ifdef __linux__
-+#if defined(__linux__) || defined(_ALLBSD_SOURCE)
- pthread_t tid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
-@@ -1865,8 +1953,8 @@
+@@ -1931,8 +1961,8 @@
#define MAX_PID_STR_SZ 20
void SetJavaLauncherPlatformProps() {
@@ -6215,2481 +1049,33 @@
const char *substr = "-Dsun.java.launcher.pid=";
char *pid_prop_str = (char *)JLI_MemAlloc(strlen(substr) + MAX_PID_STR_SZ + 1);
sprintf(pid_prop_str, "%s%d", substr, getpid());
---- hotspot/src/os/posix/launcher/launcher.script
-+++ hotspot/src/os/posix/launcher/launcher.script
-@@ -1,4 +1,4 @@
--#!/bin/bash
-+#!/bin/sh
-
- # Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
- # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
---- hotspot/src/os_cpu/bsd_x86/vm/bsd_x86_32.s
-+++ hotspot/src/os_cpu/bsd_x86/vm/bsd_x86_32.s
-@@ -21,6 +21,17 @@
- # questions.
- #
-
-+
-+#ifdef __APPLE__
-+# Darwin uses _ prefixed global symbols
-+#define SYMBOL(s) _ ## s
-+#define ELF_TYPE(name, description)
-+#else
-+#define SYMBOL(s) s
-+#define ELF_TYPE(name, description) .type name,description
-+#endif
-+
-+ .globl SYMBOL(fixcw)
-
- # NOTE WELL! The _Copy functions are called directly
- # from server-compiler-generated code via CallLeafNoFP,
-@@ -28,42 +39,62 @@
- # point or use it in the same manner as does the server
- # compiler.
-
-- .globl _Copy_conjoint_bytes
-- .globl _Copy_arrayof_conjoint_bytes
-- .globl _Copy_conjoint_jshorts_atomic
-- .globl _Copy_arrayof_conjoint_jshorts
-- .globl _Copy_conjoint_jints_atomic
-- .globl _Copy_arrayof_conjoint_jints
-- .globl _Copy_conjoint_jlongs_atomic
-- .globl _mmx_Copy_arrayof_conjoint_jshorts
-+ .globl SYMBOL(_Copy_conjoint_bytes)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_bytes)
-+ .globl SYMBOL(_Copy_conjoint_jshorts_atomic)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_jshorts)
-+ .globl SYMBOL(_Copy_conjoint_jints_atomic)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_jints)
-+ .globl SYMBOL(_Copy_conjoint_jlongs_atomic)
-+ .globl SYMBOL(_mmx_Copy_arrayof_conjoint_jshorts)
-
-- .globl _Atomic_cmpxchg_long
-- .globl _Atomic_move_long
-+ .globl SYMBOL(_Atomic_cmpxchg_long)
-+ .globl SYMBOL(_Atomic_move_long)
-
- .text
-
-- .globl SafeFetch32, Fetch32PFI, Fetch32Resume
-- .globl SafeFetchN
-+# Support for void os::Solaris::init_thread_fpu_state() in os_solaris_i486.cpp
-+# Set fpu to 53 bit precision. This happens too early to use a stub.
-+# ported from solaris_x86_32.s
-+#ifdef __APPLE__
-+ .align 4
-+#else
-+ .align 16
-+#endif
-+SYMBOL(fixcw):
-+ pushl $0x27f
-+ fldcw 0(%esp)
-+ popl %eax
-+ ret
-+
-+#ifdef __APPLE__
-+ .align 4
-+#else
-+ .align 16
-+#endif
-+
-+ .globl SYMBOL(SafeFetch32), SYMBOL(Fetch32PFI), SYMBOL(Fetch32Resume)
-+ .globl SYMBOL(SafeFetchN)
- ## TODO: avoid exposing Fetch32PFI and Fetch32Resume.
- ## Instead, the signal handler would call a new SafeFetchTriage(FaultingEIP)
- ## routine to vet the address. If the address is the faulting LD then
- ## SafeFetchTriage() would return the resume-at EIP, otherwise null.
-- .type SafeFetch32,@function
-+ ELF_TYPE(SafeFetch32,@function)
- .p2align 4,,15
--SafeFetch32:
--SafeFetchN:
-+SYMBOL(SafeFetch32):
-+SYMBOL(SafeFetchN):
- movl 0x8(%esp), %eax
- movl 0x4(%esp), %ecx
--Fetch32PFI:
-+SYMBOL(Fetch32PFI):
- movl (%ecx), %eax
--Fetch32Resume:
-+SYMBOL(Fetch32Resume):
- ret
-
-
-- .globl SpinPause
-- .type SpinPause,@function
-+ .globl SYMBOL(SpinPause)
-+ ELF_TYPE(SpinPause,@function)
- .p2align 4,,15
--SpinPause:
-+SYMBOL(SpinPause):
- rep
- nop
- movl $1, %eax
-@@ -73,8 +104,8 @@
- # void* to,
- # size_t count)
- .p2align 4,,15
-- .type _Copy_conjoint_bytes,@function
--_Copy_conjoint_bytes:
-+ ELF_TYPE(_Copy_conjoint_bytes,@function)
-+SYMBOL(_Copy_conjoint_bytes):
- pushl %esi
- movl 4+12(%esp),%ecx # count
- pushl %edi
-@@ -181,8 +212,8 @@
- #
- # Same as _Copy_conjoint_bytes, except no source alignment check.
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_bytes,@function
--_Copy_arrayof_conjoint_bytes:
-+ ELF_TYPE(_Copy_arrayof_conjoint_bytes,@function)
-+SYMBOL(_Copy_arrayof_conjoint_bytes):
- pushl %esi
- movl 4+12(%esp),%ecx # count
- pushl %edi
-@@ -241,7 +272,7 @@
- jbe 2f # <= 32 dwords
- rep; smovl
- jmp 4f
-- .=.+8
-+ .skip 8
- 2: subl %esi,%edi
- .p2align 4,,15
- 3: movl (%esi),%edx
-@@ -269,8 +300,8 @@
- # void* to,
- # size_t count)
- .p2align 4,,15
-- .type _Copy_conjoint_jshorts_atomic,@function
--_Copy_conjoint_jshorts_atomic:
-+ ELF_TYPE(_Copy_conjoint_jshorts_atomic,@function)
-+SYMBOL(_Copy_conjoint_jshorts_atomic):
- pushl %esi
- movl 4+12(%esp),%ecx # count
- pushl %edi
-@@ -356,8 +387,8 @@
- # void* to,
- # size_t count)
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_jshorts,@function
--_Copy_arrayof_conjoint_jshorts:
-+ ELF_TYPE(_Copy_arrayof_conjoint_jshorts,@function)
-+SYMBOL(_Copy_arrayof_conjoint_jshorts):
- pushl %esi
- movl 4+12(%esp),%ecx # count
- pushl %edi
-@@ -378,7 +409,7 @@
- rep; smovl
- jmp 4f
- # copy aligned dwords
-- .=.+5
-+ .skip 5
- 2: subl %esi,%edi
- .p2align 4,,15
- 3: movl (%esi),%edx
-@@ -433,10 +464,10 @@
- # Equivalent to
- # arrayof_conjoint_jints
- .p2align 4,,15
-- .type _Copy_conjoint_jints_atomic,@function
-- .type _Copy_arrayof_conjoint_jints,@function
--_Copy_conjoint_jints_atomic:
--_Copy_arrayof_conjoint_jints:
-+ ELF_TYPE(_Copy_conjoint_jints_atomic,@function)
-+ ELF_TYPE(_Copy_arrayof_conjoint_jints,@function)
-+SYMBOL(_Copy_conjoint_jints_atomic):
-+SYMBOL(_Copy_arrayof_conjoint_jints):
- pushl %esi
- movl 4+12(%esp),%ecx # count
- pushl %edi
-@@ -454,7 +485,7 @@
- popl %edi
- popl %esi
- ret
-- .=.+10
-+ .skip 10
- 2: subl %esi,%edi
- jmp 4f
- .p2align 4,,15
-@@ -498,7 +529,7 @@
- #
- # count treated as signed
- #
-- # if (from > to) {
-+ # // if (from > to) {
- # while (--count >= 0) {
- # *to++ = *from++;
- # }
-@@ -508,8 +539,8 @@
- # }
- # }
- .p2align 4,,15
-- .type _Copy_conjoint_jlongs_atomic,@function
--_Copy_conjoint_jlongs_atomic:
-+ ELF_TYPE(_Copy_conjoint_jlongs_atomic,@function)
-+SYMBOL(_Copy_conjoint_jlongs_atomic):
- movl 4+8(%esp),%ecx # count
- movl 4+0(%esp),%eax # from
- movl 4+4(%esp),%edx # to
-@@ -537,8 +568,8 @@
- # void* to,
- # size_t count)
- .p2align 4,,15
-- .type _mmx_Copy_arrayof_conjoint_jshorts,@function
--_mmx_Copy_arrayof_conjoint_jshorts:
-+ ELF_TYPE(_mmx_Copy_arrayof_conjoint_jshorts,@function)
-+SYMBOL(_mmx_Copy_arrayof_conjoint_jshorts):
- pushl %esi
- movl 4+12(%esp),%ecx
- pushl %edi
-@@ -636,8 +667,8 @@
- # bool is_MP)
- #
- .p2align 4,,15
-- .type _Atomic_cmpxchg_long,@function
--_Atomic_cmpxchg_long:
-+ ELF_TYPE(_Atomic_cmpxchg_long,@function)
-+SYMBOL(_Atomic_cmpxchg_long):
- # 8(%esp) : return PC
- pushl %ebx # 4(%esp) : old %ebx
- pushl %edi # 0(%esp) : old %edi
-@@ -658,8 +689,8 @@
- # Support for jlong Atomic::load and Atomic::store.
- # void _Atomic_move_long(volatile jlong* src, volatile jlong* dst)
- .p2align 4,,15
-- .type _Atomic_move_long,@function
--_Atomic_move_long:
-+ ELF_TYPE(_Atomic_move_long,@function)
-+SYMBOL(_Atomic_move_long):
- movl 4(%esp), %eax # src
- fildll (%eax)
- movl 8(%esp), %eax # dest
---- hotspot/src/os_cpu/bsd_x86/vm/bsd_x86_64.s
-+++ hotspot/src/os_cpu/bsd_x86/vm/bsd_x86_64.s
-@@ -21,6 +21,14 @@
- # questions.
- #
-
-+#ifdef __APPLE__
-+# Darwin uses _ prefixed global symbols
-+#define SYMBOL(s) _ ## s
-+#define ELF_TYPE(name, description)
-+#else
-+#define SYMBOL(s) s
-+#define ELF_TYPE(name, description) .type name,description
-+#endif
-
- # NOTE WELL! The _Copy functions are called directly
- # from server-compiler-generated code via CallLeafNoFP,
-@@ -28,42 +36,54 @@
- # point or use it in the same manner as does the server
- # compiler.
-
-- .globl _Copy_arrayof_conjoint_bytes
-- .globl _Copy_arrayof_conjoint_jshorts
-- .globl _Copy_conjoint_jshorts_atomic
-- .globl _Copy_arrayof_conjoint_jints
-- .globl _Copy_conjoint_jints_atomic
-- .globl _Copy_arrayof_conjoint_jlongs
-- .globl _Copy_conjoint_jlongs_atomic
-+ .globl SYMBOL(_Copy_arrayof_conjoint_bytes)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_jshorts)
-+ .globl SYMBOL(_Copy_conjoint_jshorts_atomic)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_jints)
-+ .globl SYMBOL(_Copy_conjoint_jints_atomic)
-+ .globl SYMBOL(_Copy_arrayof_conjoint_jlongs)
-+ .globl SYMBOL(_Copy_conjoint_jlongs_atomic)
-
- .text
-
-- .globl SafeFetch32, Fetch32PFI, Fetch32Resume
-+ .globl SYMBOL(SafeFetch32), SYMBOL(Fetch32PFI), SYMBOL(Fetch32Resume)
-+#ifdef __APPLE__
-+ .align 4
-+#else
- .align 16
-- .type SafeFetch32,@function
-+#endif
-+ ELF_TYPE(SafeFetch32,@function)
- // Prototype: int SafeFetch32 (int * Adr, int ErrValue)
--SafeFetch32:
-+SYMBOL(SafeFetch32):
- movl %esi, %eax
--Fetch32PFI:
-+SYMBOL(Fetch32PFI):
- movl (%rdi), %eax
--Fetch32Resume:
-+SYMBOL(Fetch32Resume):
- ret
-
-- .globl SafeFetchN, FetchNPFI, FetchNResume
-+ .globl SYMBOL(SafeFetchN), SYMBOL(FetchNPFI), SYMBOL(FetchNResume)
-+#ifdef __APPLE__
-+ .align 4
-+#else
- .align 16
-- .type SafeFetchN,@function
-+#endif
-+ ELF_TYPE(SafeFetchN,@function)
- // Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
--SafeFetchN:
-+SYMBOL(SafeFetchN):
- movq %rsi, %rax
--FetchNPFI:
-+SYMBOL(FetchNPFI):
- movq (%rdi), %rax
--FetchNResume:
-+SYMBOL(FetchNResume):
- ret
-
-- .globl SpinPause
-- .align 16
-- .type SpinPause,@function
--SpinPause:
-+ .globl SYMBOL(SpinPause)
-+#ifdef __APPLE__
-+ .align 4
-+#else
-+ .align 16
-+#endif
-+ ELF_TYPE(SpinPause,@function)
-+SYMBOL(SpinPause):
- rep
- nop
- movq $1, %rax
-@@ -77,8 +97,8 @@
- # rdx - count, treated as ssize_t
- #
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_bytes,@function
--_Copy_arrayof_conjoint_bytes:
-+ ELF_TYPE(_Copy_arrayof_conjoint_bytes,@function)
-+SYMBOL(_Copy_arrayof_conjoint_bytes):
- movq %rdx,%r8 # byte count
- shrq $3,%rdx # qword count
- cmpq %rdi,%rsi
-@@ -179,10 +199,10 @@
- # rdx - count, treated as ssize_t
- #
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_jshorts,@function
-- .type _Copy_conjoint_jshorts_atomic,@function
--_Copy_arrayof_conjoint_jshorts:
--_Copy_conjoint_jshorts_atomic:
-+ ELF_TYPE(_Copy_arrayof_conjoint_jshorts,@function)
-+ ELF_TYPE(_Copy_conjoint_jshorts_atomic,@function)
-+SYMBOL(_Copy_arrayof_conjoint_jshorts):
-+SYMBOL(_Copy_conjoint_jshorts_atomic):
- movq %rdx,%r8 # word count
- shrq $2,%rdx # qword count
- cmpq %rdi,%rsi
-@@ -269,10 +289,10 @@
- # rdx - count, treated as ssize_t
- #
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_jints,@function
-- .type _Copy_conjoint_jints_atomic,@function
--_Copy_arrayof_conjoint_jints:
--_Copy_conjoint_jints_atomic:
-+ ELF_TYPE(_Copy_arrayof_conjoint_jints,@function)
-+ ELF_TYPE(_Copy_conjoint_jints_atomic,@function)
-+SYMBOL(_Copy_arrayof_conjoint_jints):
-+SYMBOL(_Copy_conjoint_jints_atomic):
- movq %rdx,%r8 # dword count
- shrq %rdx # qword count
- cmpq %rdi,%rsi
-@@ -348,10 +368,10 @@
- # rdx - count, treated as ssize_t
- #
- .p2align 4,,15
-- .type _Copy_arrayof_conjoint_jlongs,@function
-- .type _Copy_conjoint_jlongs_atomic,@function
--_Copy_arrayof_conjoint_jlongs:
--_Copy_conjoint_jlongs_atomic:
-+ ELF_TYPE(_Copy_arrayof_conjoint_jlongs,@function)
-+ ELF_TYPE(_Copy_conjoint_jlongs_atomic,@function)
-+SYMBOL(_Copy_arrayof_conjoint_jlongs):
-+SYMBOL(_Copy_conjoint_jlongs_atomic):
- cmpq %rdi,%rsi
- leaq -8(%rdi,%rdx,8),%rax # from + count*8 - 8
- jbe acl_CopyRight
---- hotspot/src/os_cpu/bsd_x86/vm/bytes_bsd_x86.inline.hpp
-+++ hotspot/src/os_cpu/bsd_x86/vm/bytes_bsd_x86.inline.hpp
-@@ -25,7 +25,33 @@
- #ifndef OS_CPU_BSD_X86_VM_BYTES_BSD_X86_INLINE_HPP
- #define OS_CPU_BSD_X86_VM_BYTES_BSD_X86_INLINE_HPP
-
-+#ifndef _ALLBSD_SOURCE
- #include <byteswap.h>
-+#endif
-+
-+#ifdef __APPLE__
-+#include <libkern/OSByteOrder.h>
-+#endif
-+
-+#if defined(AMD64)
-+# if defined(__APPLE__)
-+# define bswap_16(x) OSSwapInt16(x)
-+# define bswap_32(x) OSSwapInt32(x)
-+# define bswap_64(x) OSSwapInt64(x)
-+# elif defined(__OpenBSD__)
-+# define bswap_16(x) swap16(x)
-+# define bswap_32(x) swap32(x)
-+# define bswap_64(x) swap64(x)
-+# elif defined(__NetBSD__)
-+# define bswap_16(x) bswap16(x)
-+# define bswap_32(x) bswap32(x)
-+# define bswap_64(x) bswap64(x)
-+# else
-+# define bswap_16(x) __bswap16(x)
-+# define bswap_32(x) __bswap32(x)
-+# define bswap_64(x) __bswap64(x)
-+# endif
-+#endif
-
- // Efficient swapping of data bytes from Java byte
- // ordering to native byte ordering and vice versa.
---- hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp
-+++ hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp
-@@ -25,9 +25,10 @@
- #ifndef OS_CPU_BSD_X86_VM_GLOBALS_BSD_X86_HPP
- #define OS_CPU_BSD_X86_VM_GLOBALS_BSD_X86_HPP
-
-+//
- // Sets the default values for platform dependent flags used by the runtime system.
- // (see globals.hpp)
--
-+//
- define_pd_global(bool, DontYieldALot, false);
- #ifdef AMD64
- define_pd_global(intx, ThreadStackSize, 1024); // 0 => use system default
-@@ -41,11 +42,12 @@
- #endif // AMD64
-
- define_pd_global(intx, CompilerThreadStackSize, 0);
-+define_pd_global(intx, SurvivorRatio, 8);
-
--define_pd_global(uintx,JVMInvokeMethodSlack, 8192);
-+define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
-
- // Only used on 64 bit platforms
--define_pd_global(uintx,HeapBaseMinAddress, 2*G);
-+define_pd_global(uintx, HeapBaseMinAddress, 2*G);
- // Only used on 64 bit Windows platforms
- define_pd_global(bool, UseVectoredExceptions, false);
-
---- hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp
-+++ hotspot/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp
-@@ -93,7 +93,7 @@
-
- inline void OrderAccess::store_fence(jbyte* p, jbyte v) {
- __asm__ volatile ( "xchgb (%2),%0"
-- : "=r" (v)
-+ : "=q" (v)
- : "0" (v), "r" (p)
- : "memory");
- }
-@@ -155,7 +155,7 @@
- // Must duplicate definitions instead of calling store_fence because we don't want to cast away volatile.
- inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) {
- __asm__ volatile ( "xchgb (%2),%0"
-- : "=r" (v)
-+ : "=q" (v)
- : "0" (v), "r" (p)
- : "memory");
- }
---- hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
-+++ hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
-@@ -78,25 +78,209 @@
- # include <sys/wait.h>
- # include <pwd.h>
- # include <poll.h>
-+#ifndef __OpenBSD__
- # include <ucontext.h>
--# include <fpu_control.h>
-+#endif
-+
-+#if defined(_ALLBSD_SOURCE) && !defined(__APPLE__) && !defined(__NetBSD__)
-+# include <pthread_np.h>
-+#endif
-
- #ifdef AMD64
--#define REG_SP REG_RSP
--#define REG_PC REG_RIP
--#define REG_FP REG_RBP
- #define SPELL_REG_SP "rsp"
- #define SPELL_REG_FP "rbp"
- #else
--#define REG_SP REG_UESP
--#define REG_PC REG_EIP
--#define REG_FP REG_EBP
- #define SPELL_REG_SP "esp"
- #define SPELL_REG_FP "ebp"
- #endif // AMD64
-
-+#ifdef __FreeBSD__
-+# define context_trapno uc_mcontext.mc_trapno
-+# ifdef AMD64
-+# define context_pc uc_mcontext.mc_rip
-+# define context_sp uc_mcontext.mc_rsp
-+# define context_fp uc_mcontext.mc_rbp
-+# define context_rip uc_mcontext.mc_rip
-+# define context_rsp uc_mcontext.mc_rsp
-+# define context_rbp uc_mcontext.mc_rbp
-+# define context_rax uc_mcontext.mc_rax
-+# define context_rbx uc_mcontext.mc_rbx
-+# define context_rcx uc_mcontext.mc_rcx
-+# define context_rdx uc_mcontext.mc_rdx
-+# define context_rsi uc_mcontext.mc_rsi
-+# define context_rdi uc_mcontext.mc_rdi
-+# define context_r8 uc_mcontext.mc_r8
-+# define context_r9 uc_mcontext.mc_r9
-+# define context_r10 uc_mcontext.mc_r10
-+# define context_r11 uc_mcontext.mc_r11
-+# define context_r12 uc_mcontext.mc_r12
-+# define context_r13 uc_mcontext.mc_r13
-+# define context_r14 uc_mcontext.mc_r14
-+# define context_r15 uc_mcontext.mc_r15
-+# define context_flags uc_mcontext.mc_flags
-+# define context_err uc_mcontext.mc_err
-+# else
-+# define context_pc uc_mcontext.mc_eip
-+# define context_sp uc_mcontext.mc_esp
-+# define context_fp uc_mcontext.mc_ebp
-+# define context_eip uc_mcontext.mc_eip
-+# define context_esp uc_mcontext.mc_esp
-+# define context_eax uc_mcontext.mc_eax
-+# define context_ebx uc_mcontext.mc_ebx
-+# define context_ecx uc_mcontext.mc_ecx
-+# define context_edx uc_mcontext.mc_edx
-+# define context_ebp uc_mcontext.mc_ebp
-+# define context_esi uc_mcontext.mc_esi
-+# define context_edi uc_mcontext.mc_edi
-+# define context_eflags uc_mcontext.mc_eflags
-+# define context_trapno uc_mcontext.mc_trapno
-+# endif
-+#endif
-+
-+#ifdef __APPLE__
-+# if __DARWIN_UNIX03 && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
-+ // 10.5 UNIX03 member name prefixes
-+ #define DU3_PREFIX(s, m) __ ## s.__ ## m
-+# else
-+ #define DU3_PREFIX(s, m) s ## . ## m
-+# endif
-+
-+# ifdef AMD64
-+# define context_pc context_rip
-+# define context_sp context_rsp
-+# define context_fp context_rbp
-+# define context_rip uc_mcontext->DU3_PREFIX(ss,rip)
-+# define context_rsp uc_mcontext->DU3_PREFIX(ss,rsp)
-+# define context_rax uc_mcontext->DU3_PREFIX(ss,rax)
-+# define context_rbx uc_mcontext->DU3_PREFIX(ss,rbx)
-+# define context_rcx uc_mcontext->DU3_PREFIX(ss,rcx)
-+# define context_rdx uc_mcontext->DU3_PREFIX(ss,rdx)
-+# define context_rbp uc_mcontext->DU3_PREFIX(ss,rbp)
-+# define context_rsi uc_mcontext->DU3_PREFIX(ss,rsi)
-+# define context_rdi uc_mcontext->DU3_PREFIX(ss,rdi)
-+# define context_r8 uc_mcontext->DU3_PREFIX(ss,r8)
-+# define context_r9 uc_mcontext->DU3_PREFIX(ss,r9)
-+# define context_r10 uc_mcontext->DU3_PREFIX(ss,r10)
-+# define context_r11 uc_mcontext->DU3_PREFIX(ss,r11)
-+# define context_r12 uc_mcontext->DU3_PREFIX(ss,r12)
-+# define context_r13 uc_mcontext->DU3_PREFIX(ss,r13)
-+# define context_r14 uc_mcontext->DU3_PREFIX(ss,r14)
-+# define context_r15 uc_mcontext->DU3_PREFIX(ss,r15)
-+# define context_flags uc_mcontext->DU3_PREFIX(ss,rflags)
-+# define context_trapno uc_mcontext->DU3_PREFIX(es,trapno)
-+# define context_err uc_mcontext->DU3_PREFIX(es,err)
-+# else
-+# define context_pc context_eip
-+# define context_sp context_esp
-+# define context_fp context_ebp
-+# define context_eip uc_mcontext->DU3_PREFIX(ss,eip)
-+# define context_esp uc_mcontext->DU3_PREFIX(ss,esp)
-+# define context_eax uc_mcontext->DU3_PREFIX(ss,eax)
-+# define context_ebx uc_mcontext->DU3_PREFIX(ss,ebx)
-+# define context_ecx uc_mcontext->DU3_PREFIX(ss,ecx)
-+# define context_edx uc_mcontext->DU3_PREFIX(ss,edx)
-+# define context_ebp uc_mcontext->DU3_PREFIX(ss,ebp)
-+# define context_esi uc_mcontext->DU3_PREFIX(ss,esi)
-+# define context_edi uc_mcontext->DU3_PREFIX(ss,edi)
-+# define context_eflags uc_mcontext->DU3_PREFIX(ss,eflags)
-+# define context_trapno uc_mcontext->DU3_PREFIX(es,trapno)
-+# endif
-+#endif
-+
-+#ifdef __OpenBSD__
-+# define context_trapno sc_trapno
-+# ifdef AMD64
-+# define context_pc sc_rip
-+# define context_sp sc_rsp
-+# define context_fp sc_rbp
-+# define context_rip sc_rip
-+# define context_rsp sc_rsp
-+# define context_rbp sc_rbp
-+# define context_rax sc_rax
-+# define context_rbx sc_rbx
-+# define context_rcx sc_rcx
-+# define context_rdx sc_rdx
-+# define context_rsi sc_rsi
-+# define context_rdi sc_rdi
-+# define context_r8 sc_r8
-+# define context_r9 sc_r9
-+# define context_r10 sc_r10
-+# define context_r11 sc_r11
-+# define context_r12 sc_r12
-+# define context_r13 sc_r13
-+# define context_r14 sc_r14
-+# define context_r15 sc_r15
-+# define context_flags sc_rflags
-+# define context_err sc_err
-+# else
-+# define context_pc sc_eip
-+# define context_sp sc_esp
-+# define context_fp sc_ebp
-+# define context_eip sc_eip
-+# define context_esp sc_esp
-+# define context_eax sc_eax
-+# define context_ebx sc_ebx
-+# define context_ecx sc_ecx
-+# define context_edx sc_edx
-+# define context_ebp sc_ebp
-+# define context_esi sc_esi
-+# define context_edi sc_edi
-+# define context_eflags sc_eflags
-+# define context_trapno sc_trapno
-+# endif
-+#endif
-+
-+#ifdef __NetBSD__
-+# define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
-+# ifdef AMD64
-+# define __register_t __greg_t
-+# define context_pc uc_mcontext.__gregs[_REG_RIP]
-+# define context_sp uc_mcontext.__gregs[_REG_URSP]
-+# define context_fp uc_mcontext.__gregs[_REG_RBP]
-+# define context_rip uc_mcontext.__gregs[_REG_RIP]
-+# define context_rsp uc_mcontext.__gregs[_REG_URSP]
-+# define context_rax uc_mcontext.__gregs[_REG_RAX]
-+# define context_rbx uc_mcontext.__gregs[_REG_RBX]
-+# define context_rcx uc_mcontext.__gregs[_REG_RCX]
-+# define context_rdx uc_mcontext.__gregs[_REG_RDX]
-+# define context_rbp uc_mcontext.__gregs[_REG_RBP]
-+# define context_rsi uc_mcontext.__gregs[_REG_RSI]
-+# define context_rdi uc_mcontext.__gregs[_REG_RDI]
-+# define context_r8 uc_mcontext.__gregs[_REG_R8]
-+# define context_r9 uc_mcontext.__gregs[_REG_R9]
-+# define context_r10 uc_mcontext.__gregs[_REG_R10]
-+# define context_r11 uc_mcontext.__gregs[_REG_R11]
-+# define context_r12 uc_mcontext.__gregs[_REG_R12]
-+# define context_r13 uc_mcontext.__gregs[_REG_R13]
-+# define context_r14 uc_mcontext.__gregs[_REG_R14]
-+# define context_r15 uc_mcontext.__gregs[_REG_R15]
-+# define context_flags uc_mcontext.__gregs[_REG_RFL]
-+# define context_err uc_mcontext.__gregs[_REG_ERR]
-+# else
-+# define context_pc uc_mcontext.__gregs[_REG_EIP]
-+# define context_sp uc_mcontext.__gregs[_REG_UESP]
-+# define context_fp uc_mcontext.__gregs[_REG_EBP]
-+# define context_eip uc_mcontext.__gregs[_REG_EIP]
-+# define context_esp uc_mcontext.__gregs[_REG_UESP]
-+# define context_eax uc_mcontext.__gregs[_REG_EAX]
-+# define context_ebx uc_mcontext.__gregs[_REG_EBX]
-+# define context_ecx uc_mcontext.__gregs[_REG_ECX]
-+# define context_edx uc_mcontext.__gregs[_REG_EDX]
-+# define context_ebp uc_mcontext.__gregs[_REG_EBP]
-+# define context_esi uc_mcontext.__gregs[_REG_ESI]
-+# define context_edi uc_mcontext.__gregs[_REG_EDI]
-+# define context_eflags uc_mcontext.__gregs[_REG_EFL]
-+# define context_trapno uc_mcontext.__gregs[_REG_TRAPNO]
-+# endif
-+#endif
-+
- address os::current_stack_pointer() {
--#ifdef SPARC_WORKS
-+#if defined(__clang__)
-+ register void *esp;
-+ // XXX must be compiled with -O1 or above.
-+ __asm__ volatile("mov %%" SPELL_REG_SP ", %0" : "=r"(esp));
-+ return (address) esp;
-+#elif defined(SPARC_WORKS)
- register void *esp;
- __asm__("mov %%"SPELL_REG_SP", %0":"=r"(esp));
- return (address) ((char*)esp + sizeof(long)*2);
-@@ -119,15 +303,15 @@
- }
-
- address os::Bsd::ucontext_get_pc(ucontext_t * uc) {
-- return (address)uc->uc_mcontext.gregs[REG_PC];
-+ return (address)uc->context_pc;
- }
-
- intptr_t* os::Bsd::ucontext_get_sp(ucontext_t * uc) {
-- return (intptr_t*)uc->uc_mcontext.gregs[REG_SP];
-+ return (intptr_t*)uc->context_sp;
- }
-
- intptr_t* os::Bsd::ucontext_get_fp(ucontext_t * uc) {
-- return (intptr_t*)uc->uc_mcontext.gregs[REG_FP];
-+ return (intptr_t*)uc->context_fp;
- }
-
- // For Forte Analyzer AsyncGetCallTrace profiling support - thread
-@@ -179,7 +363,11 @@
- }
-
- intptr_t* _get_previous_fp() {
--#ifdef SPARC_WORKS
-+#if defined(__clang__)
-+ register intptr_t **ebp;
-+ // XXX must be compiled with -O1 or above.
-+ __asm__ volatile("mov %%" SPELL_REG_FP ", %0" : "=r"(ebp));
-+#elif defined(SPARC_WORKS)
- register intptr_t **ebp;
- __asm__("mov %%"SPELL_REG_FP", %0":"=r"(ebp));
- #else
-@@ -279,18 +467,18 @@
- pc = (address) os::Bsd::ucontext_get_pc(uc);
-
- if (pc == (address) Fetch32PFI) {
-- uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ;
-+ uc->context_pc = intptr_t(Fetch32Resume) ;
- return 1 ;
- }
- #ifdef AMD64
- if (pc == (address) FetchNPFI) {
-- uc->uc_mcontext.gregs[REG_PC] = intptr_t (FetchNResume) ;
-+ uc->context_pc = intptr_t (FetchNResume) ;
- return 1 ;
- }
- #endif // AMD64
-
- // Handle ALL stack overflow variations here
-- if (sig == SIGSEGV) {
-+ if (sig == SIGSEGV || sig == SIGBUS) {
- address addr = (address) info->si_addr;
-
- // check if fault address is within thread stack
-@@ -312,6 +500,7 @@
- // to handle_unexpected_exception way down below.
- thread->disable_stack_red_zone();
- tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
-+#ifndef _ALLBSD_SOURCE
- } else {
- // Accessing stack address below sp may cause SEGV if current
- // thread has MAP_GROWSDOWN stack. This should only happen when
-@@ -327,6 +516,7 @@
- } else {
- fatal("recursive segv. expanding stack.");
- }
-+#endif
- }
- }
- }
-@@ -335,9 +525,16 @@
- // Java thread running in Java code => find exception handler if any
- // a fault inside compiled code, the interpreter, or a stub
-
-- if (sig == SIGSEGV && os::is_poll_address((address)info->si_addr)) {
-+ if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) {
- stub = SharedRuntime::get_poll_stub(pc);
-+#if defined(__APPLE__) && !defined(AMD64)
-+ // 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions.
-+ // Catching SIGBUS here prevents the implicit SIGBUS NULL check below from
-+ // being called, so only do so if the implicit NULL check is not necessary.
-+ } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((int)info->si_addr)) {
-+#else
- } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) {
-+#endif
- // BugId 4454115: A read from a MappedByteBuffer can fault
- // here if the underlying file has been truncated.
- // Do not crash the VM in such a case.
-@@ -358,6 +555,28 @@
- pc,
- SharedRuntime::
- IMPLICIT_DIVIDE_BY_ZERO);
-+#ifdef __APPLE__
-+ } else if (sig == SIGFPE && info->si_code == FPE_NOOP) {
-+ int op = pc[0];
-+
-+ // Skip REX
-+ if ((pc[0] & 0xf0) == 0x40) {
-+ op = pc[1];
-+ } else {
-+ op = pc[0];
-+ }
-+
-+ // Check for IDIV
-+ if (op == 0xF7) {
-+ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime:: IMPLICIT_DIVIDE_BY_ZERO);
-+ } else {
-+ // TODO: handle more cases if we are using other x86 instructions
-+ // that can generate SIGFPE signal.
-+ tty->print_cr("unknown opcode 0x%X with SIGFPE.", op);
-+ fatal("please update this code.");
-+ }
-+#endif /* __APPLE__ */
-+
- #else
- if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) {
- // HACK: si_code does not work on bsd 2.2.12-20!!!
-@@ -385,7 +604,7 @@
- fatal("please update this code.");
- }
- #endif // AMD64
-- } else if (sig == SIGSEGV &&
-+ } else if ((sig == SIGSEGV || sig == SIGBUS) &&
- !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
- // Determination of interpreter/vtable stub/compiled code null exception
- stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
-@@ -409,7 +628,7 @@
- // process of write protecting the memory serialization page.
- // It write enables the page immediately after protecting it
- // so we can just return to retry the write.
-- if ((sig == SIGSEGV) &&
-+ if ((sig == SIGSEGV || sig == SIGBUS) &&
- os::is_memory_serialize_page(thread, (address) info->si_addr)) {
- // Block current thread until the memory serialize page permission restored.
- os::block_on_serialize_page_trap();
-@@ -430,7 +649,7 @@
- // Furthermore, a false-positive should be harmless.
- if (UnguardOnExecutionViolation > 0 &&
- (sig == SIGSEGV || sig == SIGBUS) &&
-- uc->uc_mcontext.gregs[REG_TRAPNO] == trap_page_fault) {
-+ uc->context_trapno == trap_page_fault) {
- int page_size = os::vm_page_size();
- address addr = (address) info->si_addr;
- address pc = os::Bsd::ucontext_get_pc(uc);
-@@ -500,7 +719,7 @@
- // save all thread context in case we need to restore it
- if (thread != NULL) thread->set_saved_exception_pc(pc);
-
-- uc->uc_mcontext.gregs[REG_PC] = (greg_t)stub;
-+ uc->context_pc = (intptr_t)stub;
- return true;
- }
-
-@@ -530,13 +749,24 @@
- ShouldNotReachHere();
- }
-
-+#ifdef _ALLBSD_SOURCE
-+// From solaris_i486.s ported to bsd_i486.s
-+extern "C" void fixcw();
-+#endif
-+
- void os::Bsd::init_thread_fpu_state(void) {
- #ifndef AMD64
-+# ifdef _ALLBSD_SOURCE
-+ // Set fpu to 53 bit precision. This happens too early to use a stub.
-+ fixcw();
-+# else
- // set fpu to 53 bit precision
- set_fpu_control_word(0x27f);
-+# endif
- #endif // !AMD64
- }
-
-+#ifndef _ALLBSD_SOURCE
- int os::Bsd::get_fpu_control_word(void) {
- #ifdef AMD64
- return 0;
-@@ -552,11 +782,12 @@
- _FPU_SETCW(fpu_control);
- #endif // !AMD64
- }
-+#endif
-
- // Check that the bsd kernel version is 2.4 or higher since earlier
- // versions do not support SSE without patches.
- bool os::supports_sse() {
--#ifdef AMD64
-+#if defined(AMD64) || defined(_ALLBSD_SOURCE)
- return true;
- #else
- struct utsname uts;
-@@ -610,6 +841,9 @@
- #define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
- #endif
-
-+#ifdef _ALLBSD_SOURCE
-+bool os::Bsd::supports_variable_stack_size() { return true; }
-+#else
- // Test if pthread library can support variable thread stack size. BsdThreads
- // in fixed stack mode allocates 2M fixed slot for each thread. BsdThreads
- // in floating stack mode and NPTL support variable stack size.
-@@ -632,7 +866,7 @@
- //
- // Note that %gs is a reserved glibc register since early 2001, so
- // applications are not allowed to change its value (Ulrich Drepper from
-- // Red Hat confirmed that all known offenders have been modified to use
-+ // Redhat confirmed that all known offenders have been modified to use
- // either %fs or TSD). In the worst case scenario, when VM is embedded in
- // a native application that plays with %gs, we might see non-zero %gs
- // even BsdThreads is running in fixed stack mode. As the result, we'll
-@@ -646,6 +880,7 @@
- #endif
- }
- }
-+#endif
- #endif // AMD64
-
- // return default stack size for thr_type
-@@ -699,6 +934,41 @@
- // pthread_attr_getstack()
-
- static void current_stack_region(address * bottom, size_t * size) {
-+#ifdef __APPLE__
-+ pthread_t self = pthread_self();
-+ void *stacktop = pthread_get_stackaddr_np(self);
-+ *size = pthread_get_stacksize_np(self);
-+ *bottom = (address) stacktop - *size;
-+#elif defined(__OpenBSD__)
-+ stack_t ss;
-+ int rslt = pthread_stackseg_np(pthread_self(), &ss);
-+
-+ if (rslt != 0)
-+ fatal(err_msg("pthread_stackseg_np failed with err = %d", rslt));
-+
-+ *bottom = (address)((char *)ss.ss_sp - ss.ss_size);
-+ *size = ss.ss_size;
-+#elif defined(_ALLBSD_SOURCE)
-+ pthread_attr_t attr;
-+
-+ int rslt = pthread_attr_init(&attr);
-+
-+ // JVM needs to know exact stack location, abort if it fails
-+ if (rslt != 0)
-+ fatal(err_msg("pthread_attr_init failed with err = %d", rslt));
-+
-+ rslt = pthread_attr_get_np(pthread_self(), &attr);
-+
-+ if (rslt != 0)
-+ fatal(err_msg("pthread_attr_get_np failed with err = %d", rslt));
-+
-+ if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 ||
-+ pthread_attr_getstacksize(&attr, size) != 0) {
-+ fatal("Can not locate current stack attributes!");
-+ }
-+
-+ pthread_attr_destroy(&attr);
-+#else
- if (os::Bsd::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
-@@ -725,6 +995,7 @@
- pthread_attr_destroy(&attr);
-
- }
-+#endif
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
- }
-@@ -753,46 +1024,44 @@
- ucontext_t *uc = (ucontext_t*)context;
- st->print_cr("Registers:");
- #ifdef AMD64
-- st->print( "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
-- st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
-- st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]);
-- st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]);
-- st->cr();
-- st->print( "RSP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSP]);
-- st->print(", RBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBP]);
-- st->print(", RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]);
-- st->print(", RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]);
-- st->cr();
-- st->print( "R8 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]);
-- st->print(", R9 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]);
-- st->print(", R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]);
-- st->print(", R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]);
-- st->cr();
-- st->print( "R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]);
-- st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
-- st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
-- st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
-- st->cr();
-- st->print( "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]);
-- st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
-- st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]);
-- st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]);
-- st->cr();
-- st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
--#else
-- st->print( "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]);
-- st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]);
-- st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]);
-- st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]);
-- st->cr();
-- st->print( "ESP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_UESP]);
-- st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]);
-- st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]);
-- st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]);
-- st->cr();
-- st->print( "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]);
-- st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
-- st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2);
-+ st->print( "RAX=" INTPTR_FORMAT, uc->context_rax);
-+ st->print(", RBX=" INTPTR_FORMAT, uc->context_rbx);
-+ st->print(", RCX=" INTPTR_FORMAT, uc->context_rcx);
-+ st->print(", RDX=" INTPTR_FORMAT, uc->context_rdx);
-+ st->cr();
-+ st->print( "RSP=" INTPTR_FORMAT, uc->context_rsp);
-+ st->print(", RBP=" INTPTR_FORMAT, uc->context_rbp);
-+ st->print(", RSI=" INTPTR_FORMAT, uc->context_rsi);
-+ st->print(", RDI=" INTPTR_FORMAT, uc->context_rdi);
-+ st->cr();
-+ st->print( "R8 =" INTPTR_FORMAT, uc->context_r8);
-+ st->print(", R9 =" INTPTR_FORMAT, uc->context_r9);
-+ st->print(", R10=" INTPTR_FORMAT, uc->context_r10);
-+ st->print(", R11=" INTPTR_FORMAT, uc->context_r11);
-+ st->cr();
-+ st->print( "R12=" INTPTR_FORMAT, uc->context_r12);
-+ st->print(", R13=" INTPTR_FORMAT, uc->context_r13);
-+ st->print(", R14=" INTPTR_FORMAT, uc->context_r14);
-+ st->print(", R15=" INTPTR_FORMAT, uc->context_r15);
-+ st->cr();
-+ st->print( "RIP=" INTPTR_FORMAT, uc->context_rip);
-+ st->print(", EFLAGS=" INTPTR_FORMAT, uc->context_flags);
-+ st->print(", ERR=" INTPTR_FORMAT, uc->context_err);
-+ st->cr();
-+ st->print(" TRAPNO=" INTPTR_FORMAT, uc->context_trapno);
-+#else
-+ st->print( "EAX=" INTPTR_FORMAT, uc->context_eax);
-+ st->print(", EBX=" INTPTR_FORMAT, uc->context_ebx);
-+ st->print(", ECX=" INTPTR_FORMAT, uc->context_ecx);
-+ st->print(", EDX=" INTPTR_FORMAT, uc->context_edx);
-+ st->cr();
-+ st->print( "ESP=" INTPTR_FORMAT, uc->context_esp);
-+ st->print(", EBP=" INTPTR_FORMAT, uc->context_ebp);
-+ st->print(", ESI=" INTPTR_FORMAT, uc->context_esi);
-+ st->print(", EDI=" INTPTR_FORMAT, uc->context_edi);
-+ st->cr();
-+ st->print( "EIP=" INTPTR_FORMAT, uc->context_eip);
-+ st->print(", EFLAGS=" INTPTR_FORMAT, uc->context_eflags);
- #endif // AMD64
- st->cr();
- st->cr();
-@@ -825,31 +1094,31 @@
- // this is only for the "general purpose" registers
-
- #ifdef AMD64
-- st->print("RAX="); print_location(st, uc->uc_mcontext.gregs[REG_RAX]);
-- st->print("RBX="); print_location(st, uc->uc_mcontext.gregs[REG_RBX]);
-- st->print("RCX="); print_location(st, uc->uc_mcontext.gregs[REG_RCX]);
-- st->print("RDX="); print_location(st, uc->uc_mcontext.gregs[REG_RDX]);
-- st->print("RSP="); print_location(st, uc->uc_mcontext.gregs[REG_RSP]);
-- st->print("RBP="); print_location(st, uc->uc_mcontext.gregs[REG_RBP]);
-- st->print("RSI="); print_location(st, uc->uc_mcontext.gregs[REG_RSI]);
-- st->print("RDI="); print_location(st, uc->uc_mcontext.gregs[REG_RDI]);
-- st->print("R8 ="); print_location(st, uc->uc_mcontext.gregs[REG_R8]);
-- st->print("R9 ="); print_location(st, uc->uc_mcontext.gregs[REG_R9]);
-- st->print("R10="); print_location(st, uc->uc_mcontext.gregs[REG_R10]);
-- st->print("R11="); print_location(st, uc->uc_mcontext.gregs[REG_R11]);
-- st->print("R12="); print_location(st, uc->uc_mcontext.gregs[REG_R12]);
-- st->print("R13="); print_location(st, uc->uc_mcontext.gregs[REG_R13]);
-- st->print("R14="); print_location(st, uc->uc_mcontext.gregs[REG_R14]);
-- st->print("R15="); print_location(st, uc->uc_mcontext.gregs[REG_R15]);
--#else
-- st->print("EAX="); print_location(st, uc->uc_mcontext.gregs[REG_EAX]);
-- st->print("EBX="); print_location(st, uc->uc_mcontext.gregs[REG_EBX]);
-- st->print("ECX="); print_location(st, uc->uc_mcontext.gregs[REG_ECX]);
-- st->print("EDX="); print_location(st, uc->uc_mcontext.gregs[REG_EDX]);
-- st->print("ESP="); print_location(st, uc->uc_mcontext.gregs[REG_ESP]);
-- st->print("EBP="); print_location(st, uc->uc_mcontext.gregs[REG_EBP]);
-- st->print("ESI="); print_location(st, uc->uc_mcontext.gregs[REG_ESI]);
-- st->print("EDI="); print_location(st, uc->uc_mcontext.gregs[REG_EDI]);
-+ st->print("RAX="); print_location(st, uc->context_rax);
-+ st->print("RBX="); print_location(st, uc->context_rbx);
-+ st->print("RCX="); print_location(st, uc->context_rcx);
-+ st->print("RDX="); print_location(st, uc->context_rdx);
-+ st->print("RSP="); print_location(st, uc->context_rsp);
-+ st->print("RBP="); print_location(st, uc->context_rbp);
-+ st->print("RSI="); print_location(st, uc->context_rsi);
-+ st->print("RDI="); print_location(st, uc->context_rdi);
-+ st->print("R8 ="); print_location(st, uc->context_r8);
-+ st->print("R9 ="); print_location(st, uc->context_r9);
-+ st->print("R10="); print_location(st, uc->context_r10);
-+ st->print("R11="); print_location(st, uc->context_r11);
-+ st->print("R12="); print_location(st, uc->context_r12);
-+ st->print("R13="); print_location(st, uc->context_r13);
-+ st->print("R14="); print_location(st, uc->context_r14);
-+ st->print("R15="); print_location(st, uc->context_r15);
-+#else
-+ st->print("EAX="); print_location(st, uc->context_eax);
-+ st->print("EBX="); print_location(st, uc->context_ebx);
-+ st->print("ECX="); print_location(st, uc->context_ecx);
-+ st->print("EDX="); print_location(st, uc->context_edx);
-+ st->print("ESP="); print_location(st, uc->context_esp);
-+ st->print("EBP="); print_location(st, uc->context_ebp);
-+ st->print("ESI="); print_location(st, uc->context_esi);
-+ st->print("EDI="); print_location(st, uc->context_edi);
- #endif // AMD64
-
- st->cr();
---- hotspot/src/os_cpu/bsd_x86/vm/threadLS_bsd_x86.hpp
-+++ hotspot/src/os_cpu/bsd_x86/vm/threadLS_bsd_x86.hpp
-@@ -30,8 +30,10 @@
- #ifndef AMD64
- // map stack pointer to thread pointer - see notes in threadLS_bsd_x86.cpp
- #define SP_BITLENGTH 32
-+#ifndef PAGE_SHIFT
- #define PAGE_SHIFT 12
- #define PAGE_SIZE (1UL << PAGE_SHIFT)
-+#endif
- static Thread* _sp_map[1UL << (SP_BITLENGTH - PAGE_SHIFT)];
- #endif // !AMD64
-
--- hotspot/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp
+++ hotspot/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp
-@@ -29,6 +29,7 @@
+@@ -29,8 +29,10 @@
// constants required by the Serviceability Agent. This file is
// referenced by vmStructs.cpp.
-+#ifdef __FreeBSD__
- #define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
- \
- /******************************/ \
-@@ -38,6 +39,17 @@
- nonstatic_field(OSThread, _pthread_id, pthread_t) \
- /* This must be the last entry, and must be present */ \
- last_entry()
-+#else
-+#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field, last_entry) \
-+ \
-+ /******************************/ \
-+ /* Threads (NOTE: incomplete) */ \
-+ /******************************/ \
-+ nonstatic_field(OSThread, _thread_id, pthread_t) \
-+ nonstatic_field(OSThread, _pthread_id, pthread_t) \
-+ /* This must be the last entry, and must be present */ \
-+ last_entry()
-+#endif
-
-
- #define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type, last_entry) \
---- hotspot/src/share/vm/adlc/adlc.hpp
-+++ hotspot/src/share/vm/adlc/adlc.hpp
-@@ -72,9 +72,9 @@
- #endif
- #endif // _WIN32
-
--#ifdef LINUX
-+#if defined(LINUX) || defined(_ALLBSD_SOURCE)
- #include <inttypes.h>
--#endif // LINUX
-+#endif // LINUX || _ALLBSD_SOURCE
-
- // Macros
- #define uint32 unsigned int
---- hotspot/src/share/vm/c1/c1_globals.hpp
-+++ hotspot/src/share/vm/c1/c1_globals.hpp
-@@ -41,6 +41,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "c1_globals_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "c1_globals_bsd.hpp"
-+#endif
-
- //
- // Defines all global flags used by the client compiler.
---- hotspot/src/share/vm/classfile/classLoader.cpp
-+++ hotspot/src/share/vm/classfile/classLoader.cpp
-@@ -68,6 +68,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- // Entry points in zip.dll for loading zip/jar file entries
---- hotspot/src/share/vm/classfile/javaClasses.cpp
-+++ hotspot/src/share/vm/classfile/javaClasses.cpp
-@@ -55,6 +55,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- static bool find_field(instanceKlass* ik,
- symbolOop name_symbol, symbolOop signature_symbol,
-@@ -991,7 +994,7 @@
- }
- nmethod* nm = method->code();
- if (WizardMode && nm != NULL) {
-- sprintf(buf + (int)strlen(buf), "(nmethod " PTR_FORMAT ")", (intptr_t)nm);
-+ sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm);
- }
- }
-
---- hotspot/src/share/vm/code/stubs.hpp
-+++ hotspot/src/share/vm/code/stubs.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // The classes in this file provide a simple framework for the
- // management of little pieces of machine code - or stubs -
---- hotspot/src/share/vm/compiler/disassembler.hpp
-+++ hotspot/src/share/vm/compiler/disassembler.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- class decode_env;
-
---- hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp
-+++ hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
- elapsedTimer CMSAdaptiveSizePolicy::_concurrent_timer;
- elapsedTimer CMSAdaptiveSizePolicy::_STW_timer;
-
---- hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
-+++ hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp
-@@ -50,6 +50,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //
- // ConcurrentMarkSweepPolicy methods
---- hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp
-+++ hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- class ConcurrentMarkSweepGeneration;
- class CMSCollector;
---- hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.cpp
-+++ hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.cpp
-@@ -33,6 +33,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifndef PRODUCT
- Mutex* FreeBlockDictionary::par_lock() const {
---- hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
-+++ hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp
-@@ -39,6 +39,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl,
- bool consume,
---- hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp
-+++ hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap,
- int max_covered_regions) :
---- hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
-+++ hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
- _qset(qset), _buf(NULL), _index(0), _active(active),
---- hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
-+++ hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp
-@@ -38,6 +38,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- bool
- ParMarkBitMap::initialize(MemRegion covered_region)
---- hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp
-+++ hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // PSVirtualSpace
-
---- hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
-+++ hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) {
---- hotspot/src/share/vm/gc_interface/collectedHeap.cpp
-+++ hotspot/src/share/vm/gc_interface/collectedHeap.cpp
-@@ -39,6 +39,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- #ifdef ASSERT
---- hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp
-+++ hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp
-@@ -43,6 +43,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Inline allocation implementations.
-
---- hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
-+++ hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
-@@ -50,6 +50,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // This file contains the platform-independent parts
- // of the abstract interpreter and the abstract interpreter generator.
---- hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
-+++ hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
-@@ -59,6 +59,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "orderAccess_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "orderAccess_bsd_x86.inline.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "orderAccess_bsd_zero.inline.hpp"
-+#endif
-
-
- // no precompiled headers
---- hotspot/src/share/vm/interpreter/bytecodeTracer.cpp
-+++ hotspot/src/share/vm/interpreter/bytecodeTracer.cpp
-@@ -92,7 +92,7 @@
- // the incoming method. We could lose a line of trace output.
- // This is acceptable in a debug-only feature.
- st->cr();
-- st->print("[%d] ", (int) Thread::current()->osthread()->thread_id());
-+ st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id());
- method->print_name(st);
- st->cr();
- _current_method = method();
-@@ -106,7 +106,7 @@
- }
- _code = code;
- int bci = bcp - method->code_base();
-- st->print("[%d] ", (int) Thread::current()->osthread()->thread_id());
-+ st->print("[%ld] ", (long) Thread::current()->osthread()->thread_id());
- if (Verbose) {
- st->print("%8d %4d " INTPTR_FORMAT " " INTPTR_FORMAT " %s",
- BytecodeCounter::counter_value(), bci, tos, tos2, Bytecodes::name(code));
---- hotspot/src/share/vm/interpreter/interpreterRuntime.hpp
-+++ hotspot/src/share/vm/interpreter/interpreterRuntime.hpp
-@@ -41,6 +41,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // The InterpreterRuntime is called by the interpreter for everything
- // that cannot/should not be dealt with in assembly and needs C support.
---- hotspot/src/share/vm/interpreter/linkResolver.cpp
-+++ hotspot/src/share/vm/interpreter/linkResolver.cpp
-@@ -52,6 +52,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //------------------------------------------------------------------------------------------------------------------------
- // Implementation of FieldAccessInfo
---- hotspot/src/share/vm/memory/allocation.cpp
-+++ hotspot/src/share/vm/memory/allocation.cpp
-@@ -39,6 +39,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- void* CHeapObj::operator new(size_t size){
- return (void *) AllocateHeap(size, "CHeapObj-new");
---- hotspot/src/share/vm/memory/collectorPolicy.cpp
-+++ hotspot/src/share/vm/memory/collectorPolicy.cpp
-@@ -47,6 +47,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
- #include "gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp"
---- hotspot/src/share/vm/memory/defNewGeneration.cpp
-+++ hotspot/src/share/vm/memory/defNewGeneration.cpp
-@@ -48,6 +48,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //
- // DefNewGeneration functions.
---- hotspot/src/share/vm/memory/gcLocker.hpp
-+++ hotspot/src/share/vm/memory/gcLocker.hpp
-@@ -41,6 +41,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // The direct lock/unlock calls do not force a collection if an unlock
- // decrements the count to zero. Avoid calling these if at all possible.
---- hotspot/src/share/vm/memory/genMarkSweep.cpp
-+++ hotspot/src/share/vm/memory/genMarkSweep.cpp
-@@ -55,6 +55,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- void GenMarkSweep::invoke_at_safepoint(int level, ReferenceProcessor* rp,
- bool clear_all_softrefs) {
---- hotspot/src/share/vm/memory/resourceArea.cpp
-+++ hotspot/src/share/vm/memory/resourceArea.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //------------------------------ResourceMark-----------------------------------
- debug_only(int ResourceArea::_warned;) // to suppress multiple warnings
---- hotspot/src/share/vm/memory/resourceArea.hpp
-+++ hotspot/src/share/vm/memory/resourceArea.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // The resource area holds temporary data structures in the VM.
- // The actual allocation areas are thread local. Typical usage:
---- hotspot/src/share/vm/memory/space.hpp
-+++ hotspot/src/share/vm/memory/space.hpp
-@@ -44,6 +44,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // A space is an abstraction for the "storage units" backing
- // up the generation abstraction. It includes specific
---- hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp
-+++ hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp
-@@ -38,6 +38,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Thread-Local Edens support
-
---- hotspot/src/share/vm/memory/universe.cpp
-+++ hotspot/src/share/vm/memory/universe.cpp
-@@ -89,6 +89,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp"
- #include "gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp"
---- hotspot/src/share/vm/oops/constantPoolKlass.cpp
-+++ hotspot/src/share/vm/oops/constantPoolKlass.cpp
-@@ -44,6 +44,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/parNew/parOopClosures.inline.hpp"
- #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
---- hotspot/src/share/vm/oops/instanceKlass.cpp
-+++ hotspot/src/share/vm/oops/instanceKlass.cpp
-@@ -59,6 +59,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
- #include "gc_implementation/g1/g1OopClosures.inline.hpp"
---- hotspot/src/share/vm/oops/markOop.cpp
-+++ hotspot/src/share/vm/oops/markOop.cpp
-@@ -33,6 +33,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- void markOopDesc::print_on(outputStream* st) const {
---- hotspot/src/share/vm/oops/oop.cpp
-+++ hotspot/src/share/vm/oops/oop.cpp
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- bool always_do_update_barrier = false;
-
---- hotspot/src/share/vm/oops/oopsHierarchy.cpp
-+++ hotspot/src/share/vm/oops/oopsHierarchy.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifdef CHECK_UNHANDLED_OOPS
-
---- hotspot/src/share/vm/opto/c2_globals.hpp
-+++ hotspot/src/share/vm/opto/c2_globals.hpp
-@@ -41,6 +41,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "c2_globals_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "c2_globals_bsd.hpp"
-+#endif
-
- //
- // Defines all globals flags used by the server compiler.
---- hotspot/src/share/vm/prims/forte.cpp
-+++ hotspot/src/share/vm/prims/forte.cpp
-@@ -639,6 +639,11 @@
- // Method to let libcollector know about a dynamically loaded function.
- // Because it is weakly bound, the calls become NOP's when the library
- // isn't present.
-+#ifdef __APPLE__
-+// XXXDARWIN: Link errors occur even when __attribute__((weak_import))
-+// is added
-+#define collector_func_load(x0,x1,x2,x3,x4,x5,x6) (0)
-+#else
- void collector_func_load(char* name,
- void* null_argument_1,
- void* null_argument_2,
-@@ -649,6 +654,7 @@
- #pragma weak collector_func_load
- #define collector_func_load(x0,x1,x2,x3,x4,x5,x6) \
- ( collector_func_load ? collector_func_load(x0,x1,x2,x3,x4,x5,x6),0 : 0 )
-+#endif // __APPLE__
- #endif // !_WINDOWS
-
- } // end extern "C"
---- hotspot/src/share/vm/prims/jni.cpp
-+++ hotspot/src/share/vm/prims/jni.cpp
-@@ -88,6 +88,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- static jint CurrentVersion = JNI_VERSION_1_6;
-
---- hotspot/src/share/vm/prims/jvm.cpp
-+++ hotspot/src/share/vm/prims/jvm.cpp
-@@ -72,6 +72,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "jvm_windows.h"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "jvm_bsd.h"
-+#endif
-
- #include <errno.h>
-
---- hotspot/src/share/vm/prims/jvm.h
-+++ hotspot/src/share/vm/prims/jvm.h
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "jvm_windows.h"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "jvm_bsd.h"
-+#endif
-
- #ifndef _JAVASOFT_JVM_H_
- #define _JAVASOFT_JVM_H_
---- hotspot/src/share/vm/prims/jvmtiEnv.cpp
-+++ hotspot/src/share/vm/prims/jvmtiEnv.cpp
-@@ -68,6 +68,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
-
---- hotspot/src/share/vm/prims/jvmtiImpl.cpp
-+++ hotspot/src/share/vm/prims/jvmtiImpl.cpp
-@@ -51,6 +51,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //
- // class JvmtiAgentThread
---- hotspot/src/share/vm/prims/nativeLookup.cpp
-+++ hotspot/src/share/vm/prims/nativeLookup.cpp
-@@ -49,6 +49,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- static void mangle_name_on(outputStream* st, symbolOop name, int begin, int end) {
---- hotspot/src/share/vm/runtime/arguments.cpp
-+++ hotspot/src/share/vm/runtime/arguments.cpp
-@@ -55,6 +55,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
- #endif
---- hotspot/src/share/vm/runtime/atomic.cpp
-+++ hotspot/src/share/vm/runtime/atomic.cpp
-@@ -33,6 +33,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
- #ifdef TARGET_OS_ARCH_linux_x86
- # include "atomic_linux_x86.inline.hpp"
- #endif
-@@ -51,6 +54,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "atomic_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "atomic_bsd_x86.inline.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "atomic_bsd_zero.inline.hpp"
-+#endif
-
- jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
- assert(sizeof(jbyte) == 1, "assumption.");
---- hotspot/src/share/vm/runtime/fprofiler.hpp
-+++ hotspot/src/share/vm/runtime/fprofiler.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // a simple flat profiler for Java
-
---- hotspot/src/share/vm/runtime/globals.hpp
-+++ hotspot/src/share/vm/runtime/globals.hpp
-@@ -44,6 +44,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "globals_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "globals_bsd.hpp"
-+#endif
- #ifdef TARGET_OS_ARCH_linux_x86
- # include "globals_linux_x86.hpp"
- #endif
-@@ -62,6 +65,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "globals_windows_x86.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "globals_bsd_x86.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "globals_bsd_zero.hpp"
-+#endif
- #ifdef COMPILER1
- #ifdef TARGET_ARCH_x86
- # include "c1_globals_x86.hpp"
-@@ -78,6 +87,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "c1_globals_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "c1_globals_bsd.hpp"
-+#endif
- #endif
- #ifdef COMPILER2
- #ifdef TARGET_ARCH_x86
-@@ -95,6 +107,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "c2_globals_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "c2_globals_bsd.hpp"
-+#endif
- #endif
- #ifdef SHARK
- #ifdef TARGET_ARCH_zero
---- hotspot/src/share/vm/runtime/handles.cpp
-+++ hotspot/src/share/vm/runtime/handles.cpp
-@@ -38,6 +38,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifdef ASSERT
- oop* HandleArea::allocate_handle(oop obj) {
---- hotspot/src/share/vm/runtime/handles.inline.hpp
-+++ hotspot/src/share/vm/runtime/handles.inline.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // these inline functions are in a separate file to break an include cycle
- // between Thread and Handle
---- hotspot/src/share/vm/runtime/interfaceSupport.hpp
-+++ hotspot/src/share/vm/runtime/interfaceSupport.hpp
-@@ -44,6 +44,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Wrapper for all entry points to the virtual machine.
- // The HandleMarkCleaner is a faster version of HandleMark.
-@@ -114,6 +117,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "interfaceSupport_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "interfaceSupport_bsd.hpp"
-+#endif
-
- };
-
---- hotspot/src/share/vm/runtime/java.cpp
-+++ hotspot/src/share/vm/runtime/java.cpp
-@@ -79,6 +79,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
- #include "gc_implementation/parallelScavenge/psScavenge.hpp"
---- hotspot/src/share/vm/runtime/javaCalls.cpp
-+++ hotspot/src/share/vm/runtime/javaCalls.cpp
-@@ -48,6 +48,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // -----------------------------------------------------
- // Implementation of JavaCallWrapper
---- hotspot/src/share/vm/runtime/javaCalls.hpp
-+++ hotspot/src/share/vm/runtime/javaCalls.hpp
-@@ -48,6 +48,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // A JavaCallWrapper is constructed before each JavaCall and destructed after the call.
- // Its purpose is to allocate/deallocate a new handle block and to save/restore the last
---- hotspot/src/share/vm/runtime/javaFrameAnchor.hpp
-+++ hotspot/src/share/vm/runtime/javaFrameAnchor.hpp
-@@ -44,6 +44,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "orderAccess_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "orderAccess_bsd_x86.inline.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "orderAccess_bsd_zero.inline.hpp"
-+#endif
- //
- // An object for encapsulating the machine/os dependent part of a JavaThread frame state
- //
---- hotspot/src/share/vm/runtime/jniHandles.cpp
-+++ hotspot/src/share/vm/runtime/jniHandles.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- JNIHandleBlock* JNIHandles::_global_handles = NULL;
---- hotspot/src/share/vm/runtime/memprofiler.cpp
-+++ hotspot/src/share/vm/runtime/memprofiler.cpp
-@@ -46,6 +46,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifndef PRODUCT
-
---- hotspot/src/share/vm/runtime/mutex.cpp
-+++ hotspot/src/share/vm/runtime/mutex.cpp
-@@ -39,6 +39,10 @@
- # include "mutex_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "mutex_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o
- //
---- hotspot/src/share/vm/runtime/mutexLocker.cpp
-+++ hotspot/src/share/vm/runtime/mutexLocker.cpp
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Mutexes used in the VM (see comment in mutexLocker.hpp):
- //
---- hotspot/src/share/vm/runtime/mutexLocker.hpp
-+++ hotspot/src/share/vm/runtime/mutexLocker.hpp
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // Mutexes used in the VM.
-
---- hotspot/src/share/vm/runtime/objectMonitor.cpp
-+++ hotspot/src/share/vm/runtime/objectMonitor.cpp
-@@ -50,6 +50,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #if defined(__GNUC__) && !defined(IA64)
- // Need to inhibit inlining for older versions of GCC to avoid build-time failures
---- hotspot/src/share/vm/runtime/os.cpp
-+++ hotspot/src/share/vm/runtime/os.cpp
-@@ -60,6 +60,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- # include <signal.h>
-
-@@ -115,7 +119,11 @@
- assert(false, "Failed localtime_pd");
- return NULL;
- }
-+#if defined(_ALLBSD_SOURCE)
-+ const time_t zone = (time_t) time_struct.tm_gmtoff;
-+#else
- const time_t zone = timezone;
-+#endif
-
- // If daylight savings time is in effect,
- // we are 1 hour East of our time zone
---- hotspot/src/share/vm/runtime/os.hpp
-+++ hotspot/src/share/vm/runtime/os.hpp
-@@ -30,6 +30,9 @@
- #include "runtime/extendedPC.hpp"
- #include "runtime/handles.hpp"
- #include "utilities/top.hpp"
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "jvm_bsd.h"
-+#endif
- #ifdef TARGET_OS_FAMILY_linux
- # include "jvm_linux.h"
- #endif
-@@ -658,6 +661,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.hpp"
-+#endif
- #ifdef TARGET_OS_ARCH_linux_x86
- # include "os_linux_x86.hpp"
- #endif
-@@ -676,6 +682,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "os_windows_x86.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "os_bsd_x86.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_linux_zero
-+# include "os_bsd_zero.hpp"
-+#endif
-
-
- // debugging support (mostly used by debug.cpp but also fatal error handler)
---- hotspot/src/share/vm/runtime/osThread.hpp
-+++ hotspot/src/share/vm/runtime/osThread.hpp
-@@ -109,6 +109,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "osThread_windows.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "osThread_bsd.hpp"
-+#endif
-
- };
-
---- hotspot/src/share/vm/runtime/safepoint.cpp
-+++ hotspot/src/share/vm/runtime/safepoint.cpp
-@@ -70,6 +70,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
- #include "gc_implementation/shared/concurrentGCThread.hpp"
---- hotspot/src/share/vm/runtime/synchronizer.cpp
-+++ hotspot/src/share/vm/runtime/synchronizer.cpp
-@@ -51,6 +51,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #if defined(__GNUC__) && !defined(IA64)
- // Need to inhibit inlining for older versions of GCC to avoid build-time failures
---- hotspot/src/share/vm/runtime/task.cpp
-+++ hotspot/src/share/vm/runtime/task.cpp
-@@ -39,6 +39,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- int PeriodicTask::_num_tasks = 0;
- PeriodicTask* PeriodicTask::_tasks[PeriodicTask::max_tasks];
---- hotspot/src/share/vm/runtime/thread.cpp
-+++ hotspot/src/share/vm/runtime/thread.cpp
-@@ -88,6 +88,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
- #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
---- hotspot/src/share/vm/runtime/thread.hpp
-+++ hotspot/src/share/vm/runtime/thread.hpp
-@@ -1598,6 +1598,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "thread_windows_x86.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "thread_bsd_x86.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "thread_bsd_zero.hpp"
-+#endif
-
-
- public:
---- hotspot/src/share/vm/runtime/threadLocalStorage.cpp
-+++ hotspot/src/share/vm/runtime/threadLocalStorage.cpp
-@@ -36,6 +36,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // static member initialization
- int ThreadLocalStorage::_thread_index = -1;
---- hotspot/src/share/vm/runtime/threadLocalStorage.hpp
-+++ hotspot/src/share/vm/runtime/threadLocalStorage.hpp
-@@ -62,6 +62,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "threadLS_windows_x86.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "threadLS_bsd_x86.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "threadLS_bsd_zero.hpp"
-+#endif
-
-
- public:
---- hotspot/src/share/vm/runtime/timer.cpp
-+++ hotspot/src/share/vm/runtime/timer.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- void elapsedTimer::add(elapsedTimer t) {
---- hotspot/src/share/vm/runtime/virtualspace.cpp
-+++ hotspot/src/share/vm/runtime/virtualspace.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- // ReservedSpace
---- hotspot/src/share/vm/runtime/vmStructs.cpp
-+++ hotspot/src/share/vm/runtime/vmStructs.cpp
-@@ -118,6 +118,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifdef TARGET_OS_ARCH_linux_x86
- # include "vmStructs_linux_x86.hpp"
- #endif
-@@ -136,6 +139,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "vmStructs_windows_x86.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "vmStructs_bsd_x86.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "vmStructs_bsd_zero.hpp"
-+#endif
- #ifndef SERIALGC
- #include "gc_implementation/concurrentMarkSweep/cmsPermGen.hpp"
- #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
---- hotspot/src/share/vm/runtime/vmThread.cpp
-+++ hotspot/src/share/vm/runtime/vmThread.cpp
-@@ -46,6 +46,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- HS_DTRACE_PROBE_DECL3(hotspot, vmops__request, char *, uintptr_t, int);
- HS_DTRACE_PROBE_DECL3(hotspot, vmops__begin, char *, uintptr_t, int);
---- hotspot/src/share/vm/runtime/vmThread.hpp
-+++ hotspot/src/share/vm/runtime/vmThread.hpp
-@@ -36,6 +36,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- //
- // Prioritized queue of VM operations.
---- hotspot/src/share/vm/runtime/vm_operations.cpp
-+++ hotspot/src/share/vm/runtime/vm_operations.cpp
-@@ -43,6 +43,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #define VM_OP_NAME_INITIALIZE(name) #name,
-
---- hotspot/src/share/vm/runtime/vm_version.cpp
-+++ hotspot/src/share/vm/runtime/vm_version.cpp
-@@ -160,7 +160,8 @@
-
- #define OS LINUX_ONLY("linux") \
- WINDOWS_ONLY("windows") \
-- SOLARIS_ONLY("solaris")
-+ SOLARIS_ONLY("solaris") \
-+ BSD_ONLY("bsd")
-
- #ifdef ZERO
- #define CPU ZERO_LIBARCH
---- hotspot/src/share/vm/utilities/accessFlags.cpp
-+++ hotspot/src/share/vm/utilities/accessFlags.cpp
-@@ -34,6 +34,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- void AccessFlags::atomic_set_bits(jint bits) {
---- hotspot/src/share/vm/utilities/array.cpp
-+++ hotspot/src/share/vm/utilities/array.cpp
-@@ -34,6 +34,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- #ifdef ASSERT
---- hotspot/src/share/vm/utilities/bitMap.cpp
-+++ hotspot/src/share/vm/utilities/bitMap.cpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
-
- BitMap::BitMap(bm_word_t* map, idx_t size_in_bits) :
---- hotspot/src/share/vm/utilities/debug.cpp
-+++ hotspot/src/share/vm/utilities/debug.cpp
-@@ -62,6 +62,10 @@
- # include "os_windows.inline.hpp"
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifndef ASSERT
- # ifdef _DEBUG
---- hotspot/src/share/vm/utilities/elfFile.hpp
-+++ hotspot/src/share/vm/utilities/elfFile.hpp
-@@ -41,7 +41,9 @@
- typedef Elf64_Shdr Elf_Shdr;
- typedef Elf64_Sym Elf_Sym;
-
-+#ifndef _ALLBSD_SOURCE
- #define ELF_ST_TYPE ELF64_ST_TYPE
-+#endif
-
- #else
-
-@@ -55,8 +57,10 @@
- typedef Elf32_Shdr Elf_Shdr;
- typedef Elf32_Sym Elf_Sym;
-
-+#ifndef _ALLBSD_SOURCE
- #define ELF_ST_TYPE ELF32_ST_TYPE
- #endif
-+#endif
-
- #include "globalDefinitions.hpp"
- #include "memory/allocation.hpp"
---- hotspot/src/share/vm/utilities/events.cpp
-+++ hotspot/src/share/vm/utilities/events.cpp
-@@ -38,6 +38,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- #ifndef PRODUCT
---- hotspot/src/share/vm/utilities/exceptions.cpp
-+++ hotspot/src/share/vm/utilities/exceptions.cpp
-@@ -42,6 +42,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
-
- // Implementation of ThreadShadow
---- hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp
-+++ hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp
-@@ -76,13 +76,26 @@
- # include <sys/procfs.h>
- # endif
-
--#ifdef LINUX
-+#if defined(LINUX) || defined(_ALLBSD_SOURCE)
- #define __STDC_LIMIT_MACROS
- #include <inttypes.h>
- #include <signal.h>
-+#ifndef __OpenBSD__
- #include <ucontext.h>
-+#endif
-+#ifdef __APPLE__
-+ #include <AvailabilityMacros.h>
-+ #if (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4)
-+ // Mac OS X 10.4 defines EFL_AC and EFL_ID,
-+ // which conflict with hotspot variable names.
-+ //
-+ // This has been fixed in Mac OS X 10.5.
-+ #undef EFL_AC
-+ #undef EFL_ID
-+ #endif
-+#endif
- #include <sys/time.h>
--#endif // LINUX
-+#endif // LINUX || _ALLBSD_SOURCE
-
- // 4810578: varargs unsafe on 32-bit integer/64-bit pointer architectures
- // When __cplusplus is defined, NULL is defined as 0 (32-bit constant) in
-@@ -118,7 +131,7 @@
- // pointer is stored as integer value. On some platforms, sizeof(intptr_t) >
- // sizeof(void*), so here we want something which is integer type, but has the
- // same size as a pointer.
--#ifdef LINUX
-+#ifdef __GNUC__
- #ifdef _LP64
- #define NULL_WORD 0L
- #else
-@@ -130,7 +143,7 @@
- #define NULL_WORD NULL
- #endif
-
--#ifndef LINUX
-+#if !defined(LINUX) && !defined(_ALLBSD_SOURCE)
- // Compiler-specific primitive types
- typedef unsigned short uint16_t;
- #ifndef _UINT32_T
-@@ -150,7 +163,7 @@
- // prior definition of intptr_t, and add "&& !defined(XXX)" above.
- #endif // _SYS_INT_TYPES_H
-
--#endif // !LINUX
-+#endif // !LINUX && !_ALLBSD_SOURCE
-
- // Additional Java basic types
-
-@@ -242,7 +255,9 @@
- inline int g_isnan(float f) { return isnand(f); }
- #endif
- inline int g_isnan(double f) { return isnand(f); }
--#elif LINUX
-+#elif defined(__APPLE__)
-+inline int g_isnan(double f) { return isnan(f); }
-+#elif defined(LINUX) || defined(_ALLBSD_SOURCE)
- inline int g_isnan(float f) { return isnanf(f); }
- inline int g_isnan(double f) { return isnan(f); }
- #else
---- hotspot/src/share/vm/utilities/growableArray.cpp
-+++ hotspot/src/share/vm/utilities/growableArray.cpp
-@@ -34,6 +34,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
- #ifdef ASSERT
- void GenericGrowableArray::set_nesting() {
- if (on_stack()) {
---- hotspot/src/share/vm/utilities/hashtable.hpp
-+++ hotspot/src/share/vm/utilities/hashtable.hpp
-@@ -283,7 +283,7 @@
- }
-
- int index_for(symbolHandle name, Handle loader) {
-- return hash_to_index(compute_hash(name, loader));
-+ return this->hash_to_index(compute_hash(name, loader));
- }
- };
-
---- hotspot/src/share/vm/utilities/histogram.hpp
-+++ hotspot/src/share/vm/utilities/histogram.hpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- // This class provides a framework for collecting various statistics.
- // The current implementation is oriented towards counting invocations
+-#ifdef __APPLE__
++#if defined(__APPLE__)
+ #define OS_THREAD_ID_TYPE thread_t
++#elif defined(__FreeBSD__)
++#define OS_THREAD_ID_TYPE pid_t
+ #else
+ #define OS_THREAD_ID_TYPE pthread_t
+ #endif
+@@ -52,7 +54,7 @@
+ /* Posix Thread IDs */ \
+ /**********************/ \
+ \
+- declare_unsigned_integer_type(thread_t) \
++ declare_unsigned_integer_type(OS_THREAD_ID_TYPE) \
+ declare_unsigned_integer_type(pthread_t) \
+ \
+ /* This must be the last entry, and must be present */ \
--- hotspot/src/share/vm/utilities/macros.hpp
+++ hotspot/src/share/vm/utilities/macros.hpp
-@@ -161,6 +161,14 @@
- #define NOT_WINDOWS(code) code
+@@ -177,6 +177,14 @@
+ #define NOT_WIN64(code) code
#endif
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
@@ -8703,122 +1089,6 @@
#if defined(IA32) || defined(AMD64)
#define X86
#define X86_ONLY(code) code
---- hotspot/src/share/vm/utilities/ostream.cpp
-+++ hotspot/src/share/vm/utilities/ostream.cpp
-@@ -39,6 +39,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "os_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "os_bsd.inline.hpp"
-+#endif
-
- extern "C" void jio_print(const char* s); // Declarationtion of jvm method
-
-@@ -863,7 +866,7 @@
-
- #ifndef PRODUCT
-
--#if defined(SOLARIS) || defined(LINUX)
-+#if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE)
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
---- hotspot/src/share/vm/utilities/preserveException.hpp
-+++ hotspot/src/share/vm/utilities/preserveException.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // This file provides more support for exception handling; see also exceptions.hpp
- class PreserveExceptionMark {
---- hotspot/src/share/vm/utilities/taskqueue.cpp
-+++ hotspot/src/share/vm/utilities/taskqueue.cpp
-@@ -37,6 +37,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- #ifdef TRACESPINNING
- uint ParallelTaskTerminator::_total_yields = 0;
---- hotspot/src/share/vm/utilities/taskqueue.hpp
-+++ hotspot/src/share/vm/utilities/taskqueue.hpp
-@@ -47,6 +47,12 @@
- #ifdef TARGET_OS_ARCH_windows_x86
- # include "orderAccess_windows_x86.inline.hpp"
- #endif
-+#ifdef TARGET_OS_ARCH_bsd_x86
-+# include "orderAccess_bsd_x86.inline.hpp"
-+#endif
-+#ifdef TARGET_OS_ARCH_bsd_zero
-+# include "orderAccess_bsd_zero.inline.hpp"
-+#endif
-
- // Simple TaskQueue stats that are collected by default in debug builds.
-
---- hotspot/src/share/vm/utilities/vmError.cpp
-+++ hotspot/src/share/vm/utilities/vmError.cpp
-@@ -44,13 +44,18 @@
- "JAVA_HOME", "JRE_HOME", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "CLASSPATH",
- "JAVA_COMPILER", "PATH", "USERNAME",
-
-- // Env variables that are defined on Solaris/Linux
-+ // Env variables that are defined on Solaris/Linux/BSD
- "LD_LIBRARY_PATH", "LD_PRELOAD", "SHELL", "DISPLAY",
- "HOSTTYPE", "OSTYPE", "ARCH", "MACHTYPE",
-
- // defined on Linux
- "LD_ASSUME_KERNEL", "_JAVA_SR_SIGNUM",
-
-+ // defined on Darwin
-+ "DYLD_LIBRARY_PATH", "DYLD_FALLBACK_LIBRARY_PATH",
-+ "DYLD_FRAMEWORK_PATH", "DYLD_FALLBACK_FRAMEWORK_PATH",
-+ "DYLD_INSERT_LIBRARIES",
-+
- // defined on Windows
- "OS", "PROCESSOR_IDENTIFIER", "_ALT_JAVA_HOME_DIR",
-
-@@ -922,7 +927,7 @@
- const char* ptr = OnError;
- while ((cmd = next_OnError_command(buffer, sizeof(buffer), &ptr)) != NULL){
- out.print_raw ("# Executing ");
--#if defined(LINUX)
-+#if defined(LINUX) || defined(_ALLBSD_SOURCE)
- out.print_raw ("/bin/sh -c ");
- #elif defined(SOLARIS)
- out.print_raw ("/usr/bin/sh -c ");
---- hotspot/src/share/vm/utilities/workgroup.hpp
-+++ hotspot/src/share/vm/utilities/workgroup.hpp
-@@ -35,6 +35,9 @@
- #ifdef TARGET_OS_FAMILY_windows
- # include "thread_windows.inline.hpp"
- #endif
-+#ifdef TARGET_OS_FAMILY_bsd
-+# include "thread_bsd.inline.hpp"
-+#endif
-
- // Forward declarations of classes defined here
-
---- jaxp/jaxp.properties
-+++ jaxp/jaxp.properties
-@@ -25,8 +25,8 @@
-
- drops.master.copy.base=${drops.dir}
-
--jaxp_src.bundle.name=jaxp144_04.zip
--jaxp_src.bundle.md5.checksum=0ace787aa12177d201947e8ba0ba9bdd
-+jaxp_src.bundle.name=jaxp144_05.zip
-+jaxp_src.bundle.md5.checksum=03be10db6ee87a8163316a87a3d3cba5
- jaxp_src.master.bundle.dir=${drops.master.copy.base}
- jaxp_src.master.bundle.url.base=http://download.java.net/jaxp/openjdk/jdk6
-
--- jdk/make/com/sun/java/pack/Makefile
+++ jdk/make/com/sun/java/pack/Makefile
@@ -61,6 +61,7 @@
@@ -9634,7 +1904,7 @@
endif
--- jdk/make/java/instrument/Makefile
+++ jdk/make/java/instrument/Makefile
-@@ -102,6 +102,21 @@
+@@ -102,6 +102,19 @@
# equivalent of strcasecmp is stricmp on Windows
CPPFLAGS_COMMON += -Dstrcasecmp=stricmp
else
@@ -9647,16 +1917,14 @@
+ LDFLAGS += $(OUTPUTDIR)/tmp/java/jli/$(OBJDIRNAME)/static/libjli.a
+ LDFLAGS += -Wl,--no-whole-archive
+ endif
-+
-+ ICONV_PATH = $(PACKAGE_PATH)
+# Use CPPFLAGS instead of OTHER_INCLUDES to force this last
-+ CPPFLAGS += -I$(ICONV_PATH)/include
-+ OTHER_LDLIBS += -L$(ICONV_PATH)/lib -liconv
++ CPPFLAGS += %%ICONV_INC%%
++ OTHER_LDLIBS += %%ICONV_LIB%%
+else
LDFLAGS += -L $(LIBDIR)/$(LIBARCH)/jli
OTHER_LDLIBS += -ljli
OTHER_LDLIBS += -ldl
-@@ -114,6 +129,7 @@
+@@ -114,6 +127,7 @@
LDFLAGS += -Wl,-rpath -Wl,\$$ORIGIN/jli
endif
endif
@@ -9963,8 +2231,8 @@
+ OTHER_LDLIBS += -liconv
+ else
+ ifneq ($(OS_NAME), netbsd)
-+ CPPFLAGS += -I$(PACKAGE_PATH)/include
-+ OTHER_LDLIBS += -L$(PACKAGE_PATH)/lib -liconv
++ CPPFLAGS += %%ICONV_INC%%
++ OTHER_LDLIBS += %%ICONV_LIB%%
+ endif
+ endif
+endif
@@ -10165,7 +2433,7 @@
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv LINUX
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/opengl
vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/../java2d/opengl
-@@ -421,6 +429,19 @@
+@@ -422,6 +430,19 @@
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SOLARIS
endif # PLATFORM
@@ -10185,7 +2453,7 @@
FONTCONFIGS = $(_FONTCONFIGS:%=$(LIBDIR)/%.src)
BINARYFONTCONFIGS = $(_FONTCONFIGS:%.properties=$(LIBDIR)/%.bfc)
-@@ -514,6 +535,9 @@
+@@ -515,6 +536,9 @@
-I$(OPENWIN_HOME)/include/X11/extensions \
-I$(PLATFORM_SRC)/native/$(PKGDIR)/font
endif
@@ -10195,7 +2463,7 @@
CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/debug \
-I$(SHARE_SRC)/native/$(PKGDIR)/../font \
-I$(PLATFORM_SRC)/native/$(PKGDIR)/../font \
-@@ -535,7 +559,13 @@
+@@ -536,7 +560,13 @@
-I$(PLATFORM_SRC)/native/$(PKGDIR) \
$(EVENT_MODEL)
@@ -10423,7 +2691,7 @@
+endif
--- jdk/make/sun/splashscreen/Makefile
+++ jdk/make/sun/splashscreen/Makefile
-@@ -61,10 +61,26 @@
+@@ -61,10 +61,25 @@
CFLAGS += -DSPLASHSCREEN
@@ -10440,11 +2708,10 @@
- OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread
+ ifeq ($(PLATFORM), bsd)
+ CFLAGS += -DPNG_NO_MMX_CODE
-+ ICONV_PATH = $(PACKAGE_PATH)
+ CPPFLAGS += -I$(OPENWIN_HOME)/include \
+ -I$(OPENWIN_HOME)/include/X11/extensions \
-+ -I$(ICONV_PATH)/include
-+ OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext -L$(ICONV_PATH)/lib -liconv $(LIBM) -pthread
++ %%ICONV_INC%%
++ OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext %%ICONV_LIB%% $(LIBM) -pthread
+ else
+ CPPFLAGS += -I$(OPENWIN_HOME)/include -I$(OPENWIN_HOME)/include/X11/extensions
+ OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread
@@ -10452,7 +2719,7 @@
else # PLATFORM
CFLAGS += -DWITH_WIN32
OTHER_LDLIBS += kernel32.lib user32.lib gdi32.lib
-@@ -77,14 +93,13 @@
+@@ -77,14 +92,13 @@
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/splashscreen
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/giflib
@@ -10785,14 +3052,12 @@
void SetJavaLauncherPlatformProps(void);
--- jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java
+++ jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java
-@@ -477,6 +477,10 @@
+@@ -477,6 +477,8 @@
String[] dirs = new String[] {
userHome + sep + ".themes",
System.getProperty("swing.metacitythemedir"),
-+ "/usr/X11R6/share/themes",
-+ "/usr/X11R6/share/gnome/themes",
-+ "/usr/local/share/themes",
-+ "/usr/local/share/gnome/themes",
++ "%%LOCALBASE%%/share/themes",
++ "%%LOCALBASE%%/gnome/themes",
"/usr/share/themes",
"/usr/gnome/share/themes", // Debian/Redhat/Solaris
"/opt/gnome2/share/themes" // SuSE
@@ -11042,7 +3307,7 @@
registerFontDir(jreFontDirName);
}
registerFontsInDir(jreFontDirName, true, Font2D.JRE_RANK,
---- jdk/src/share/classes/sun/nio/ch/KqueueSelectorProvider.java 1969-12-31 19:00:00.000000000 -0500
+--- jdk/src/share/classes/sun/nio/ch/KqueueSelectorProvider.java
+++ jdk/src/share/classes/sun/nio/ch/KqueueSelectorProvider.java
@@ -0,0 +1,17 @@
+package sun.nio.ch;
@@ -14259,7 +6524,7 @@
-#ifdef __linux__
-static const char *system_dir = "/usr/java";
+#if defined(__FreeBSD__)
-+static const char *system_dir = "/usr/local/openjdk6";
++static const char *system_dir = "%%OPENJDK_HOME%%";
+static const char *user_dir = "/java";
+#elif defined(__NetBSD__)
+static const char *system_dir = "/usr/local/openjdk6";
@@ -14616,7 +6881,7 @@
if ("SunOS".equals(osname)) {
return new sun.nio.ch.DevPollSelectorProvider();
}
---- jdk/src/solaris/classes/sun/nio/ch/KqueueArrayWrapper.java 1969-12-31 19:00:00.000000000 -0500
+--- jdk/src/solaris/classes/sun/nio/ch/KqueueArrayWrapper.java
+++ jdk/src/solaris/classes/sun/nio/ch/KqueueArrayWrapper.java
@@ -0,0 +1,231 @@
+/*
@@ -14850,7 +7115,7 @@
+ private static native short getKeventFlags(long address, int index);
+ private static native int getKeventIdent(long address, int index);
+}
---- jdk/src/solaris/classes/sun/nio/ch/KqueueSelectorImpl.java 1969-12-31 19:00:00.000000000 -0500
+--- jdk/src/solaris/classes/sun/nio/ch/KqueueSelectorImpl.java
+++ jdk/src/solaris/classes/sun/nio/ch/KqueueSelectorImpl.java
@@ -0,0 +1,205 @@
+/*
@@ -17629,7 +9894,7 @@
gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET,
&res2, buf2, sizeof(buf2), &hp, &h_error);
#else
-@@ -178,7 +454,7 @@
+@@ -172,7 +448,7 @@
}
/* Try once, with our static buffer. */
@@ -17638,7 +9903,7 @@
gethostbyname_r(hostname, &res, buf, sizeof(buf), &hp, &h_error);
#else
hp = gethostbyname_r(hostname, &res, buf, sizeof(buf), &h_error);
-@@ -191,7 +467,7 @@
+@@ -185,7 +461,7 @@
*/
if (hp == NULL && errno == ERANGE) {
if ((tmp = (char*)malloc(BIG_HENT_BUF_SIZE))) {
@@ -17647,7 +9912,7 @@
gethostbyname_r(hostname, &res, tmp, BIG_HENT_BUF_SIZE,
&hp, &h_error);
#else
-@@ -281,7 +557,7 @@
+@@ -274,7 +550,7 @@
addr |= ((caddr[2] <<8) & 0xff00);
addr |= (caddr[3] & 0xff);
addr = htonl(addr);
@@ -17656,7 +9921,7 @@
gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent,
buf, sizeof(buf), &hp, &h_error);
#else
-@@ -295,7 +571,7 @@
+@@ -288,7 +564,7 @@
*/
if (hp == NULL && errno == ERANGE) {
if ((tmp = (char*)malloc(BIG_HENT_BUF_SIZE))) {
@@ -17665,7 +9930,7 @@
gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET,
&hent, tmp, BIG_HENT_BUF_SIZE, &hp, &h_error);
#else
-@@ -317,6 +593,8 @@
+@@ -310,6 +586,8 @@
return ret;
}
@@ -17763,7 +10028,7 @@
#ifdef __linux__
#define ifr_index ifr_ifindex
-@@ -584,6 +597,7 @@
+@@ -577,6 +590,7 @@
}
@@ -17771,7 +10036,7 @@
/*
* Enumerates and returns all IPv4 interfaces
*/
-@@ -694,6 +708,176 @@
+@@ -687,6 +701,176 @@
return ifs;
}
@@ -17948,7 +10213,7 @@
#if defined(__solaris__) && defined(AF_INET6)
/*
-@@ -1014,7 +1198,13 @@
+@@ -1007,7 +1191,13 @@
JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
return ifs;
}
@@ -17962,7 +10227,7 @@
currif->addr = NULL;
currif->childs = NULL;
currif->virtual = isVirtual;
-@@ -1302,6 +1492,31 @@
+@@ -1295,6 +1485,31 @@
* All bytes to 0 means no hardware address.
*/
return -1;
@@ -17994,7 +10259,7 @@
#else
struct arpreq arpreq;
struct sockaddr_in* sin;
-@@ -1467,7 +1682,7 @@
+@@ -1460,7 +1675,7 @@
"Socket creation failed");
} else {
@@ -18077,7 +10342,7 @@
#else
JVM_Connect(fd, 0, 0);
#endif
-@@ -1057,31 +1071,38 @@
+@@ -1056,31 +1070,38 @@
Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env,
jobject this) {
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
@@ -18130,7 +10395,7 @@
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t, sizeof(int));
#ifdef __linux__
-@@ -1094,7 +1115,7 @@
+@@ -1093,7 +1114,7 @@
* On Linux for IPv6 sockets we must set the hop limit
* to 1 to be compatible with default ttl of 1 for IPv4 sockets.
*/
@@ -18139,7 +10404,7 @@
int ttl = 1;
setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl,
sizeof(ttl));
-@@ -1317,7 +1338,7 @@
+@@ -1303,7 +1324,7 @@
/*
* value is an InetAddress.
*/
@@ -18148,7 +10413,7 @@
if (ipv6_available()) {
mcast_set_if_by_addr_v6(env, this, fd, value);
} else {
-@@ -1336,7 +1357,7 @@
+@@ -1322,7 +1343,7 @@
/*
* value is a NetworkInterface.
*/
@@ -18157,7 +10422,7 @@
if (ipv6_available()) {
mcast_set_if_by_if_v6(env, this, fd, value);
} else {
-@@ -1413,7 +1434,7 @@
+@@ -1399,7 +1420,7 @@
*/
static void setMulticastLoopbackMode(JNIEnv *env, jobject this, int fd,
jint opt, jobject value) {
@@ -18166,7 +10431,7 @@
if (ipv6_available()) {
mcast_set_loop_v6(env, this, fd, value);
} else {
-@@ -1981,7 +2002,7 @@
+@@ -1964,7 +1985,7 @@
fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
}
/* setsockopt to be correct ttl */
@@ -18175,7 +10440,7 @@
if (ipv6_available()) {
setHopLimit(env, fd, ttl);
} else {
-@@ -2374,18 +2395,30 @@
+@@ -2357,18 +2378,30 @@
mname6.ipv6mr_interface = idx;
}
@@ -18886,7 +11151,7 @@
}
#endif /* HEADLESS */
-@@ -1568,7 +1573,7 @@
+@@ -1571,7 +1576,7 @@
{
jobject point = NULL;
#ifndef HEADLESS /* return NULL in HEADLESS, Linux */
@@ -18895,7 +11160,7 @@
int x,y;
AWT_LOCK();
-@@ -1581,7 +1586,7 @@
+@@ -1584,7 +1589,7 @@
DTRACE_PRINTLN("unable to call XineramaSolarisCenterFunc: symbol is null");
}
AWT_FLUSH_UNLOCK();
@@ -18904,7 +11169,7 @@
#endif /* HEADLESS */
return point;
}
-@@ -1646,7 +1651,11 @@
+@@ -1649,7 +1654,11 @@
{
int rr_maj_ver = 0, rr_min_ver = 0;
@@ -19776,7 +12041,7 @@
#include "awt_Component.h"
#include "awt_GraphicsEnv.h"
-@@ -128,7 +129,7 @@
+@@ -129,7 +130,7 @@
if (tryDGA && (getenv("NO_J2D_DGA") == NULL)) {
/* we use RTLD_NOW because of bug 4032715 */
@@ -19872,7 +12137,7 @@
#include <netinet/in.h>
#endif
-@@ -86,7 +86,7 @@
+@@ -81,7 +81,7 @@
rv = connect(fd, 0, 0);
#endif
@@ -19881,7 +12146,7 @@
{
int len;
SOCKADDR sa;
-@@ -96,17 +96,30 @@
+@@ -91,17 +91,30 @@
#ifdef AF_INET6
if (ipv6_available()) {
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa;
@@ -20103,7 +12368,7 @@
static jfieldID key_st_dev; /* id for FileKey.st_dev */
static jfieldID key_st_ino; /* id for FileKey.st_ino */
---- jdk/src/solaris/native/sun/nio/ch/KqueueArrayWrapper.c 1969-12-31 19:00:00.000000000 -0500
+--- jdk/src/solaris/native/sun/nio/ch/KqueueArrayWrapper.c
+++ jdk/src/solaris/native/sun/nio/ch/KqueueArrayWrapper.c
@@ -0,0 +1,186 @@
+/*
@@ -20294,7 +12559,7 @@
+#endif
--- jdk/src/solaris/native/sun/nio/ch/Net.c
+++ jdk/src/solaris/native/sun/nio/ch/Net.c
-@@ -60,17 +60,33 @@
+@@ -65,17 +65,33 @@
jboolean reuse)
{
int fd;
@@ -20334,7 +12599,7 @@
if (reuse) {
int arg = 1;
if (NET_SetSockOpt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg,
-@@ -138,10 +154,33 @@
+@@ -143,10 +159,33 @@
Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
{
SOCKADDR sa;
@@ -20369,7 +12634,7 @@
}
return NET_GetPortFromSockaddr((struct sockaddr *)&sa);
}
-@@ -150,15 +189,79 @@
+@@ -155,15 +194,79 @@
Java_sun_nio_ch_Net_localInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
{
SOCKADDR sa;
@@ -20452,7 +12717,7 @@
#ifdef NEEDED
-@@ -304,9 +407,11 @@
+@@ -309,9 +412,11 @@
switch (errorValue) {
case EINPROGRESS: /* Non-blocking connect */
return 0;