summaryrefslogtreecommitdiff
path: root/debian/patches/kfreebsd-support-hotspot.diff
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2017-05-12 22:48:36 +0300
committerIgor Pashev <pashev.igor@gmail.com>2017-05-12 22:48:36 +0300
commit37d630875d33bf3c291026c40bb08d1b6c9edcc8 (patch)
tree68fb026f54a962cf1d631f010e98681add6ed014 /debian/patches/kfreebsd-support-hotspot.diff
downloadopenjdk-8-debian.tar.gz
Imported debian/openjdk-8_8u131-b11-1debian/8u131-b11-1debian
Diffstat (limited to 'debian/patches/kfreebsd-support-hotspot.diff')
-rw-r--r--debian/patches/kfreebsd-support-hotspot.diff827
1 files changed, 827 insertions, 0 deletions
diff --git a/debian/patches/kfreebsd-support-hotspot.diff b/debian/patches/kfreebsd-support-hotspot.diff
new file mode 100644
index 0000000..e4ffdcc
--- /dev/null
+++ b/debian/patches/kfreebsd-support-hotspot.diff
@@ -0,0 +1,827 @@
+Index: b/hotspot/src/os/linux/vm/decoder_linux.cpp
+===================================================================
+--- a/hotspot/src/os/linux/vm/decoder_linux.cpp
++++ b/hotspot/src/os/linux/vm/decoder_linux.cpp
+@@ -22,6 +22,7 @@
+ *
+ */
+
++#include "utilities/globalDefinitions.hpp"
+ #include "prims/jvm.h"
+ #include "utilities/decoder_elf.hpp"
+
+Index: b/hotspot/src/os/linux/vm/attachListener_linux.cpp
+===================================================================
+--- a/hotspot/src/os/linux/vm/attachListener_linux.cpp
++++ b/hotspot/src/os/linux/vm/attachListener_linux.cpp
+@@ -39,6 +39,10 @@
+ #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)0)->sun_path)
+ #endif
+
++#if defined(__FreeBSD_kernel__)
++#include <sys/ucred.h>
++#endif
++
+ // The attach mechanism on Linux uses a UNIX domain socket. An attach listener
+ // thread is created at startup or is created on-demand via a signal from
+ // the client tool. The attach listener creates a socket and binds it to a file
+@@ -337,16 +341,26 @@ LinuxAttachOperation* LinuxAttachListene
+
+ // get the credentials of the peer and check the effective uid/guid
+ // - check with jeff on this.
++#if defined(LOCAL_PEERCRED) /* GNU/kFreeBSD */
++ struct xucred cred_info;
++ socklen_t optlen = sizeof(cred_info);
++ if (::getsockopt(s, SOL_SOCKET, LOCAL_PEERCRED, (void*)&cred_info, &optlen) == -1) {
++#else
+ struct ucred cred_info;
+ socklen_t optlen = sizeof(cred_info);
+ if (::getsockopt(s, SOL_SOCKET, SO_PEERCRED, (void*)&cred_info, &optlen) == -1) {
++#endif
+ ::close(s);
+ continue;
+ }
+ uid_t euid = geteuid();
+ gid_t egid = getegid();
+
++#if defined(LOCAL_PEERCRED) /* GNU/kFreeBSD */
++ if (cred_info.cr_uid != euid || cred_info.cr_gid != egid) {
++#else
+ if (cred_info.uid != euid || cred_info.gid != egid) {
++#endif
+ ::close(s);
+ continue;
+ }
+Index: b/hotspot/src/os/linux/vm/jvm_linux.cpp
+===================================================================
+--- a/hotspot/src/os/linux/vm/jvm_linux.cpp
++++ b/hotspot/src/os/linux/vm/jvm_linux.cpp
+@@ -169,7 +169,9 @@ struct siglabel siglabels[] = {
+ "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). */
++#ifdef SIGPWR
+ "PWR", SIGPWR, /* Power failure restart (System V). */
++#endif
+ #ifdef SIGSYS
+ "SYS", SIGSYS /* Bad system call. Only on some Linuxen! */
+ #endif
+Index: b/hotspot/src/os/linux/vm/os_linux.cpp
+===================================================================
+--- a/hotspot/src/os/linux/vm/os_linux.cpp
++++ b/hotspot/src/os/linux/vm/os_linux.cpp
+@@ -22,6 +22,7 @@
+ *
+ */
+
++#include "utilities/globalDefinitions.hpp"
+ // no precompiled headers
+ #include "classfile/classLoader.hpp"
+ #include "classfile/systemDictionary.hpp"
+@@ -92,8 +93,16 @@
+ # include <semaphore.h>
+ # include <fcntl.h>
+ # include <string.h>
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++# include <sys/param.h>
++# include <sys/sysctl.h>
++#ifndef ETIME
++# define ETIME ETIMEDOUT
++#endif
++#else
+ # include <syscall.h>
+ # include <sys/sysinfo.h>
++#endif
+ # include <gnu/libc-version.h>
+ # include <sys/ipc.h>
+ # include <sys/shm.h>
+@@ -169,11 +178,22 @@ julong os::available_memory() {
+ }
+
+ julong os::Linux::available_memory() {
++#ifndef __FreeBSD_kernel__
+ // values in struct sysinfo are "unsigned long"
+ struct sysinfo si;
+ sysinfo(&si);
+
+ return (julong)si.freeram * si.mem_unit;
++#else
++ int mib[2] = {CTL_HW, HW_USERMEM}, mem;
++ size_t len;
++ len = sizeof(mem);
++ if (sysctl(mib, 2, &mem, &len, NULL, 0) == 0) {
++ return (julong) mem;
++ } else {
++ return 0;
++ }
++#endif
+ }
+
+ julong os::physical_memory() {
+@@ -2174,18 +2194,22 @@ void os::print_memory_info(outputStream*
+ st->print("Memory:");
+ st->print(" %dk page", os::vm_page_size()>>10);
+
++#ifndef __FreeBSD_kernel__
+ // values in struct sysinfo are "unsigned long"
+ struct sysinfo si;
+ sysinfo(&si);
++#endif
+
+ st->print(", physical " UINT64_FORMAT "k",
+ os::physical_memory() >> 10);
+ st->print("(" UINT64_FORMAT "k free)",
+ os::available_memory() >> 10);
++#ifndef __FreeBSD_kernel__
+ 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();
+ }
+
+Index: b/hotspot/src/os/linux/vm/osThread_linux.cpp
+===================================================================
+--- a/hotspot/src/os/linux/vm/osThread_linux.cpp
++++ b/hotspot/src/os/linux/vm/osThread_linux.cpp
+@@ -22,6 +22,7 @@
+ *
+ */
+
++#include "utilities/globalDefinitions.hpp"
+ // no precompiled headers
+ #include "runtime/mutex.hpp"
+ #include "runtime/osThread.hpp"
+Index: b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+===================================================================
+--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
++++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+@@ -22,6 +22,7 @@
+ *
+ */
+
++#include "utilities/globalDefinitions.hpp"
+ // no precompiled headers
+ #include "asm/macroAssembler.hpp"
+ #include "classfile/classLoader.hpp"
+@@ -74,6 +75,7 @@
+ # include <ucontext.h>
+ # include <fpu_control.h>
+
++#ifdef __linux__
+ #ifdef AMD64
+ #define REG_SP REG_RSP
+ #define REG_PC REG_RIP
+@@ -87,6 +89,54 @@
+ #define SPELL_REG_SP "esp"
+ #define SPELL_REG_FP "ebp"
+ #endif // AMD64
++#endif
++
++#if defined(__FreeBSD_kernel__)
++#define context_trapno uc_mcontext.mc_trapno
++#ifdef AMD64
++#define SPELL_REG_SP "rsp"
++#define SPELL_REG_FP "rbp"
++#define context_sp uc_mcontext.mc_rsp
++#define context_pc uc_mcontext.mc_rip
++#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_flags uc_mcontext.mc_flags
++#define context_err uc_mcontext.mc_err
++#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
++#else
++#define SPELL_REG_SP "esp"
++#define SPELL_REG_FP "ebp"
++#define context_sp uc_mcontext.mc_esp
++#define context_pc uc_mcontext.mc_eip
++#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 // AMD64
++#endif
+
+ PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
+
+@@ -118,15 +168,27 @@ void os::initialize_thread(Thread* thr)
+ }
+
+ address os::Linux::ucontext_get_pc(ucontext_t * uc) {
++#if defined(__FreeBSD_kernel__)
++ return (address)uc->context_pc;
++#else
+ return (address)uc->uc_mcontext.gregs[REG_PC];
++#endif
+ }
+
+ intptr_t* os::Linux::ucontext_get_sp(ucontext_t * uc) {
++#if defined(__FreeBSD_kernel__)
++ return (intptr_t*)uc->context_sp;
++#else
+ return (intptr_t*)uc->uc_mcontext.gregs[REG_SP];
++#endif
+ }
+
+ intptr_t* os::Linux::ucontext_get_fp(ucontext_t * uc) {
++#if defined(__FreeBSD_kernel__)
++ return (intptr_t*)uc->context_fp;
++#else
+ return (intptr_t*)uc->uc_mcontext.gregs[REG_FP];
++#endif
+ }
+
+ // For Forte Analyzer AsyncGetCallTrace profiling support - thread
+@@ -278,7 +340,11 @@ JVM_handle_linux_signal(int sig,
+ pc = (address) os::Linux::ucontext_get_pc(uc);
+
+ if (StubRoutines::is_safefetch_fault(pc)) {
++#if defined(__FreeBSD_kernel__)
++ uc->context_pc = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
++#else
+ uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
++#endif
+ return 1;
+ }
+
+@@ -443,7 +509,11 @@ JVM_handle_linux_signal(int sig,
+ // Furthermore, a false-positive should be harmless.
+ if (UnguardOnExecutionViolation > 0 &&
+ (sig == SIGSEGV || sig == SIGBUS) &&
++#if defined(__FreeBSD_kernel__)
++ uc->context_trapno == trap_page_fault) {
++#else
+ uc->uc_mcontext.gregs[REG_TRAPNO] == trap_page_fault) {
++#endif
+ int page_size = os::vm_page_size();
+ address addr = (address) info->si_addr;
+ address pc = os::Linux::ucontext_get_pc(uc);
+@@ -513,7 +583,11 @@ JVM_handle_linux_signal(int sig,
+ // save all thread context in case we need to restore it
+ if (thread != NULL) thread->set_saved_exception_pc(pc);
+
++#if defined(__FreeBSD_kernel__)
++ uc->context_pc = (intptr_t)stub;
++#else
+ uc->uc_mcontext.gregs[REG_PC] = (greg_t)stub;
++#endif
+ return true;
+ }
+
+@@ -765,6 +839,7 @@ void os::print_context(outputStream *st,
+
+ ucontext_t *uc = (ucontext_t*)context;
+ st->print_cr("Registers:");
++#ifdef __linux__
+ #ifdef AMD64
+ st->print( "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
+ st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
+@@ -807,6 +882,48 @@ void os::print_context(outputStream *st,
+ st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
+ st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2);
+ #endif // AMD64
++#elif defined(__FreeBSD_kernel__)
++#ifdef AMD64
++ 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
++#endif
+ st->cr();
+ st->cr();
+
+@@ -837,6 +954,7 @@ void os::print_register_info(outputStrea
+
+ // this is only for the "general purpose" registers
+
++#ifdef __linux__
+ #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]);
+@@ -864,6 +982,35 @@ void os::print_register_info(outputStrea
+ st->print("ESI="); print_location(st, uc->uc_mcontext.gregs[REG_ESI]);
+ st->print("EDI="); print_location(st, uc->uc_mcontext.gregs[REG_EDI]);
+ #endif // AMD64
++#elif defined(__FreeBSD_kernel__)
++#ifdef AMD64
++ 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
++#endif
+
+ st->cr();
+ }
+Index: b/hotspot/src/share/vm/memory/allocation.hpp
+===================================================================
+--- a/hotspot/src/share/vm/memory/allocation.hpp
++++ b/hotspot/src/share/vm/memory/allocation.hpp
+@@ -25,8 +25,8 @@
+ #ifndef SHARE_VM_MEMORY_ALLOCATION_HPP
+ #define SHARE_VM_MEMORY_ALLOCATION_HPP
+
+-#include "runtime/globals.hpp"
+ #include "utilities/globalDefinitions.hpp"
++#include "runtime/globals.hpp"
+ #include "utilities/macros.hpp"
+ #ifdef COMPILER1
+ #include "c1/c1_globals.hpp"
+Index: b/hotspot/src/share/vm/ci/ciObject.hpp
+===================================================================
+--- a/hotspot/src/share/vm/ci/ciObject.hpp
++++ b/hotspot/src/share/vm/ci/ciObject.hpp
+@@ -25,6 +25,7 @@
+ #ifndef SHARE_VM_CI_CIOBJECT_HPP
+ #define SHARE_VM_CI_CIOBJECT_HPP
+
++#include "utilities/globalDefinitions.hpp"
+ #include "ci/ciBaseObject.hpp"
+ #include "ci/ciClassList.hpp"
+ #include "memory/allocation.hpp"
+Index: b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
+===================================================================
+--- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
++++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
+@@ -22,6 +22,7 @@
+ *
+ */
+
++#include "utilities/globalDefinitions.hpp"
+ // no precompiled headers
+ #include "classfile/vmSymbols.hpp"
+ #include "gc_interface/collectedHeap.hpp"
+Index: b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp
+===================================================================
+--- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp
++++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp
+@@ -68,7 +68,7 @@
+ # include <sys/procfs.h>
+ # endif
+
+-#if defined(LINUX) || defined(_ALLBSD_SOURCE)
++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(__FreeBSD_kernel__)
+ #ifndef __STDC_LIMIT_MACROS
+ #define __STDC_LIMIT_MACROS
+ #endif // __STDC_LIMIT_MACROS
+Index: b/hotspot/make/defs.make
+===================================================================
+--- a/hotspot/make/defs.make
++++ b/hotspot/make/defs.make
+@@ -179,9 +179,6 @@ endif
+ # Windows should have OS predefined
+ ifeq ($(OS),)
+ OS := $(shell uname -s)
+- ifneq ($(findstring BSD,$(OS)),)
+- OS=bsd
+- endif
+ ifeq ($(OS), Darwin)
+ OS=bsd
+ endif
+@@ -207,6 +204,10 @@ else
+ OSNAME=linux
+ endif
+
++ifeq ($(OS), GNU/kFreeBSD)
++ OSNAME=linux
++endif
++
+ # Determinations of default make arguments and platform specific settings
+ MAKE_ARGS=
+
+Index: b/hotspot/make/linux/Makefile
+===================================================================
+--- a/hotspot/make/linux/Makefile
++++ b/hotspot/make/linux/Makefile
+@@ -236,6 +236,9 @@ checks: check_os_version check_j2se_vers
+ SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%
+ OS_VERSION := $(shell uname -r)
+ EMPTY_IF_NOT_SUPPORTED = $(filter $(SUPPORTED_OS_VERSION),$(OS_VERSION))
++ifeq ($(shell uname -s), GNU/kFreeBSD)
++EMPTY_IF_NOT_SUPPORTED = supported
++endif
+
+ check_os_version:
+ ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
+Index: b/hotspot/make/linux/makefiles/defs.make
+===================================================================
+--- a/hotspot/make/linux/makefiles/defs.make
++++ b/hotspot/make/linux/makefiles/defs.make
+@@ -84,7 +84,7 @@ ifneq (,$(findstring $(ARCH), sparc))
+ endif
+
+ # i686/i586 and amd64/x86_64
+-ifneq (,$(findstring $(ARCH), amd64 x86_64 i686 i586))
++ifneq (,$(findstring $(ARCH), amd64 x86_64 i686 i586 i486 i386))
+ ifeq ($(ARCH_DATA_MODEL), 64)
+ ARCH_DATA_MODEL = 64
+ MAKE_ARGS += LP64=1
+@@ -92,7 +92,7 @@ ifneq (,$(findstring $(ARCH), amd64 x86_
+ VM_PLATFORM = linux_amd64
+ else
+ ARCH_DATA_MODEL = 32
+- PLATFORM = linux-i586
++ PLATFORM = linux_i486
+ VM_PLATFORM = linux_i486
+ endif
+ HS_ARCH = x86
+Index: b/hotspot/agent/src/os/linux/ps_core.c
+===================================================================
+--- a/hotspot/agent/src/os/linux/ps_core.c
++++ b/hotspot/agent/src/os/linux/ps_core.c
+@@ -551,11 +551,16 @@ static bool core_handle_prstatus(struct
+ return false;
+
+ // copy regs
++#if defined(__FreeBSD_kernel__)
++ memcpy(&newthr->regs, &prstat->pr_reg, sizeof(struct user_regs_struct));
++#else
+ memcpy(&newthr->regs, prstat->pr_reg, sizeof(struct user_regs_struct));
++#endif
+
+ if (is_debug()) {
+ print_debug("integer regset\n");
+ #ifdef i386
++#ifdef __linux__
+ // print the regset
+ print_debug("\teax = 0x%x\n", newthr->regs.eax);
+ print_debug("\tebx = 0x%x\n", newthr->regs.ebx);
+@@ -566,9 +571,21 @@ static bool core_handle_prstatus(struct
+ 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);
++#elif defined(__FreeBSD_kernel__)
++ 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
+ #endif
+
+ #if defined(amd64) || defined(x86_64)
++#ifdef __linux__
+ // print the regset
+ print_debug("\tr15 = 0x%lx\n", newthr->regs.r15);
+ print_debug("\tr14 = 0x%lx\n", newthr->regs.r14);
+@@ -597,6 +614,27 @@ static bool core_handle_prstatus(struct
+ 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);
++#elif defined(__FreeBSD_kernel__)
++ 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("\trip = 0x%lx\n", newthr->regs.r_rip);
++ print_debug("\tcs = 0x%lx\n", newthr->regs.r_cs);
++ print_debug("\trsp = 0x%lx\n", newthr->regs.r_rsp);
++ print_debug("\tss = 0x%lx\n", newthr->regs.r_ss);
++#endif
+ #endif
+ }
+
+Index: b/hotspot/agent/src/os/linux/ps_proc.c
+===================================================================
+--- a/hotspot/agent/src/os/linux/ps_proc.c
++++ b/hotspot/agent/src/os/linux/ps_proc.c
+@@ -42,6 +42,22 @@
+ #define __WALL 0x40000000 // Copied from /usr/include/linux/wait.h
+ #endif
+
++#ifndef PTRACE_PEEKDATA
++#define PTRACE_PEEKDATA PT_READ_D
++#endif
++
++#ifndef PTRACE_ATTACH
++#define PTRACE_ATTACH PT_ATTACH
++#endif
++
++#ifndef PTRACE_DETACH
++#define PTRACE_DETACH PT_DETACH
++#endif
++
++#ifndef PTRACE_CONT
++#define PTRACE_CONT PT_CONTINUE
++#endif
++
+ // This file has the libproc implementation specific to live process
+ // For core files, refer to ps_core.c
+
+@@ -59,7 +75,11 @@ static inline uintptr_t align(uintptr_t
+ // before calling process_read_data.
+
+ static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
++#if defined(__FreeBSD_kernel__)
++ int rslt;
++#else
+ long rslt;
++#endif
+ size_t i, words;
+ uintptr_t end_addr = addr + size;
+ uintptr_t aligned_addr = align(addr, sizeof(long));
+@@ -67,36 +87,62 @@ static bool process_read_data(struct ps_
+ if (aligned_addr != addr) {
+ char *ptr = (char *)&rslt;
+ errno = 0;
++#if defined(__FreeBSD_kernel__)
++ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, (caddr_t) aligned_addr, 0);
++#else
+ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
++#endif
+ if (errno) {
+ print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
+ return false;
+ }
+ for (; aligned_addr != addr; aligned_addr++, ptr++);
++#if defined(__FreeBSD_kernel__)
++ for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
++#else
+ for (; ((intptr_t)aligned_addr % sizeof(long)) && aligned_addr < end_addr;
++#endif
+ aligned_addr++)
+ *(buf++) = *(ptr++);
+ }
+
++#if defined(__FreeBSD_kernel__)
++ words = (end_addr - aligned_addr) / sizeof(int);
++#else
+ words = (end_addr - aligned_addr) / sizeof(long);
++#endif
+
+ // assert((intptr_t)aligned_addr % sizeof(long) == 0);
+ for (i = 0; i < words; i++) {
+ errno = 0;
++#if defined(__FreeBSD_kernel__)
++ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, (caddr_t) aligned_addr, 0);
++#else
+ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
++#endif
+ if (errno) {
+ print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
+ return false;
+ }
++#if defined(__FreeBSD_kernel__)
++ *(int *)buf = rslt;
++ buf += sizeof(int);
++ aligned_addr += sizeof(int);
++#else
+ *(long *)buf = rslt;
+ buf += sizeof(long);
+ aligned_addr += sizeof(long);
++#endif
+ }
+
+ if (aligned_addr != end_addr) {
+ char *ptr = (char *)&rslt;
+ errno = 0;
++#if defined(__FreeBSD_kernel__)
++ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, (caddr_t) aligned_addr, 0);
++#else
+ rslt = ptrace(PTRACE_PEEKDATA, ph->pid, aligned_addr, 0);
++#endif
+ if (errno) {
+ print_debug("ptrace(PTRACE_PEEKDATA, ..) failed for %d bytes @ %lx\n", size, addr);
+ return false;
+@@ -135,7 +181,11 @@ static bool process_get_lwp_regs(struct
+ #endif
+
+ #ifdef PTRACE_GETREGS_REQ
++#if defined(__FreeBSD_kernel__)
++ if (ptrace_getregs(PTRACE_GETREGS_REQ, pid, (caddr_t) user, 0) < 0) {
++#else
+ if (ptrace_getregs(PTRACE_GETREGS_REQ, pid, user, NULL) < 0) {
++#endif
+ print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
+ return false;
+ }
+@@ -216,7 +266,11 @@ static bool ptrace_waitpid(pid_t pid) {
+
+ // attach to a process/thread specified by "pid"
+ static bool ptrace_attach(pid_t pid, char* err_buf, size_t err_buf_len) {
++#if defined(__FreeBSD_kernel__)
++ if (ptrace(PTRACE_ATTACH, pid, NULL, 0) < 0) {
++#else
+ if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0) {
++#endif
+ char buf[200];
+ char* msg = strerror_r(errno, buf, sizeof(buf));
+ snprintf(err_buf, err_buf_len, "ptrace(PTRACE_ATTACH, ..) failed for %d: %s", pid, msg);
+@@ -313,7 +367,11 @@ static bool read_lib_info(struct ps_proc
+
+ // detach a given pid
+ static bool ptrace_detach(pid_t pid) {
++#if defined(__FreeBSD_kernel__)
++ if (pid && ptrace(PTRACE_DETACH, pid, NULL, 0) < 0) {
++#else
+ if (pid && ptrace(PTRACE_DETACH, pid, NULL, NULL) < 0) {
++#endif
+ print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
+ return false;
+ } else {
+Index: b/hotspot/agent/src/os/linux/libproc.h
+===================================================================
+--- a/hotspot/agent/src/os/linux/libproc.h
++++ b/hotspot/agent/src/os/linux/libproc.h
+@@ -28,6 +28,10 @@
+ #include <jni.h>
+ #include <unistd.h>
+ #include <stdint.h>
++#if defined(__FreeBSD_kernel__)
++#include <sys/types.h>
++#include <machine/reg.h>
++#endif
+ #include "proc_service.h"
+
+ #ifdef ALT_SASRCDIR
+@@ -73,6 +77,10 @@ combination of ptrace and /proc calls.
+ #define user_regs_struct pt_regs
+ #endif
+
++#if defined(__FreeBSD_kernel__)
++#define user_regs_struct reg
++#endif
++
+ // This C bool type must be int for compatibility with Linux calls and
+ // it would be a mistake to equivalence it to C++ bool on many platforms
+
+Index: b/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
+===================================================================
+--- a/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
++++ b/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
+@@ -367,7 +367,7 @@ JNIEXPORT jlongArray JNICALL Java_sun_jv
+
+ #ifdef i386
+ #define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
+-
++#ifdef __linux__
+ regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs;
+ regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs;
+ regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes;
+@@ -383,12 +383,28 @@ JNIEXPORT jlongArray JNICALL Java_sun_jv
+ regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip;
+ regs[REG_INDEX(CS)] = (uintptr_t) gregs.xcs;
+ regs[REG_INDEX(SS)] = (uintptr_t) gregs.xss;
+-
++#elif defined(__FreeBSD_kernel__)
++ 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
+ #endif /* i386 */
+
+ #ifdef amd64
+ #define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
+-
++#ifdef __linux__
+ regs[REG_INDEX(R15)] = gregs.r15;
+ regs[REG_INDEX(R14)] = gregs.r14;
+ regs[REG_INDEX(R13)] = gregs.r13;
+@@ -414,7 +430,27 @@ JNIEXPORT jlongArray JNICALL Java_sun_jv
+ regs[REG_INDEX(ES)] = gregs.es;
+ regs[REG_INDEX(FS)] = gregs.fs;
+ regs[REG_INDEX(GS)] = gregs.gs;
+-
++#elif defined(__FreeBSD_kernel__)
++ 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;
++#endif
+ #endif /* amd64 */
+
+ #if defined(sparc) || defined(sparcv9)
+Index: b/hotspot/make/linux/makefiles/saproc.make
+===================================================================
+--- a/hotspot/make/linux/makefiles/saproc.make
++++ b/hotspot/make/linux/makefiles/saproc.make
+@@ -90,6 +90,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
+ -I$(GENERATED) \
+ -I$(BOOT_JAVA_HOME)/include \
+ -I$(BOOT_JAVA_HOME)/include/$(Platform_os_family) \
++ -I$(BOOT_JAVA_HOME)/include/bsd \
+ $(ALT_SAINCDIR) \
+ $(SASRCFILES) \
+ $(SA_LFLAGS) \