summaryrefslogtreecommitdiff
path: root/debian/patches/kfreebsd-support-hotspot.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/kfreebsd-support-hotspot.diff')
-rw-r--r--debian/patches/kfreebsd-support-hotspot.diff856
1 files changed, 856 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..d6ca10c
--- /dev/null
+++ b/debian/patches/kfreebsd-support-hotspot.diff
@@ -0,0 +1,856 @@
+Description: Initial GNU/kFreeBSD support for openjdk-7 (Hotspot part)
+ - Alter build system to consider GNU/kFreeBSD like linux
+ since this port is libc based.
+ Also treat i386 arch has i686 (uname -m return i386 on BSD*)
+ openjdk/hotspot/make/defs.make
+ - Use LOCAL_PEERCRED (from kFreeBSD kernel) instead of
+ SO_PEERCRED and alter related structs.
+ openjdk/hotspot/src/os/linux/vm/attachListener_linux.cpp
+ - Use sysctl call instead of sysinfo.
+ openjdk/hotspot/src/os/linux/vm/os_linux.cpp
+ - Change access to CPU register
+ openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+ openjdk/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
+ openjdk/hotspot/agent/src/os/linux/libproc.h
+ openjdk/hotspot/agent/src/os/linux/ps_core.c
+ (from bsd-port)
+ - Fix ptrace usage under freebsd kernel
+ openjdk/hotspot/agent/src/os/linux/ps_proc.c
+ Should not be keep like this :
+ - Undefined UINTPTR_MAX
+ openjdk/hotspot/src/share/vm/memory/allocation.hpp
+ openjdk/hotspot/src/share/vm/oops/generateOopMap.cpp
+Author: Damien Raude-Morvan <drazzib@debian.org>
+Last-Update: 2012-03-05
+Forwarded: no
+--- openjdk/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c.orig
++++ openjdk/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c
+@@ -316,7 +316,7 @@
+
+ #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;
+@@ -332,7 +332,23 @@
+ 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 */
+
+ #if ia64
+@@ -344,7 +360,7 @@
+
+ #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;
+@@ -370,7 +386,27 @@
+ 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)
+--- openjdk/hotspot/agent/src/os/linux/libproc.h.orig
++++ openjdk/hotspot/agent/src/os/linux/libproc.h
+@@ -27,6 +27,10 @@
+
+ #include <unistd.h>
+ #include <stdint.h>
++#if defined(__FreeBSD_kernel__)
++#include <sys/types.h>
++#include <machine/reg.h>
++#endif
+ #include "proc_service.h"
+
+ #if defined(sparc) || defined(sparcv9)
+@@ -112,6 +116,10 @@
+ #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
+
+--- openjdk/hotspot/agent/src/os/linux/ps_core.c.orig
++++ openjdk/hotspot/agent/src/os/linux/ps_core.c
+@@ -539,11 +539,16 @@
+ 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);
+@@ -554,9 +559,21 @@
+ 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);
+@@ -585,6 +602,27 @@
+ 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
+ }
+
+--- openjdk/hotspot/agent/src/os/linux/ps_proc.c.orig
++++ openjdk/hotspot/agent/src/os/linux/ps_proc.c
+@@ -37,6 +37,18 @@
+ #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
++
+ // This file has the libproc implementation specific to live process
+ // For core files, refer to ps_core.c
+
+@@ -54,7 +66,11 @@
+ // 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));
+@@ -62,36 +78,62 @@
+ 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;
+@@ -130,7 +172,11 @@
+ #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;
+ }
+@@ -144,7 +190,11 @@
+
+ // attach to a process/thread specified by "pid"
+ static bool ptrace_attach(pid_t pid) {
++#if defined(__FreeBSD_kernel__)
++ if (ptrace(PTRACE_ATTACH, pid, NULL, 0) < 0) {
++#else
+ if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0) {
++#endif
+ print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
+ return false;
+ } else {
+@@ -271,7 +321,11 @@
+
+ // 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 {
+--- openjdk/hotspot/make/defs.make.orig
++++ openjdk/hotspot/make/defs.make
+@@ -132,6 +132,10 @@
+ OSNAME=linux
+ endif
+
++ifeq ($(OS), GNU/kFreeBSD)
++ OSNAME=linux
++endif
++
+ # Determinations of default make arguments and platform specific settings
+ MAKE_ARGS=
+
+--- openjdk/hotspot/make/linux/Makefile.orig
++++ openjdk/hotspot/make/linux/Makefile
+@@ -234,6 +234,9 @@
+ SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
+ 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),)
+--- openjdk/hotspot/make/linux/makefiles/defs.make.orig
++++ openjdk/hotspot/make/linux/makefiles/defs.make
+@@ -91,7 +91,7 @@
+ endif
+
+ # i686
+-ifeq ($(ARCH), i686)
++ifneq (,$(filter i686 i386, $(ARCH)))
+ ARCH_DATA_MODEL = 32
+ PLATFORM = linux-i586
+ VM_PLATFORM = linux_i486
+--- openjdk/hotspot/src/os/linux/vm/attachListener_linux.cpp.orig
++++ openjdk/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,9 +341,15 @@
+
+ // 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
+ int res;
+ RESTARTABLE(::close(s), res);
+ continue;
+@@ -347,10 +357,14 @@
+ 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) {
+- int res;
++#endif
++ int res;
+ RESTARTABLE(::close(s), res);
+- continue;
++ continue;
+ }
+
+ // peer credential look okay so we read the request
+--- openjdk/hotspot/src/os/linux/vm/jvm_linux.cpp.orig
++++ openjdk/hotspot/src/os/linux/vm/jvm_linux.cpp
+@@ -169,7 +169,9 @@
+ "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
+--- openjdk/hotspot/src/os/linux/vm/os_linux.cpp.orig
++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp
+@@ -115,8 +115,13 @@
+ # include <semaphore.h>
+ # include <fcntl.h>
+ # include <string.h>
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++# include <sys/param.h>
++# include <sys/sysctl.h>
++#else
+ # include <syscall.h>
+ # include <sys/sysinfo.h>
++#endif
+ # include <gnu/libc-version.h>
+ # include <sys/ipc.h>
+ # include <sys/shm.h>
+@@ -127,6 +132,10 @@
+
+ #define MAX_PATH (2 * K)
+
++#ifndef ETIME
++#define ETIME ETIMEDOUT
++#endif
++
+ // for timer info max values which include all bits
+ #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
+ #define SEC_IN_NANOSECS 1000000000LL
+@@ -208,11 +217,22 @@
+ }
+
+ 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() {
+@@ -2161,18 +2181,22 @@
+ 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();
+ }
+
+@@ -5389,6 +5413,7 @@
+ int os::fork_and_exec(char* cmd) {
+ const char * argv[4] = {"sh", "-c", cmd, NULL};
+
++#ifdef __linux__
+ // fork() in LinuxThreads/NPTL is not async-safe. It needs to run
+ // pthread_atfork handlers and reset pthread library. All we need is a
+ // separate process to execve. Make a direct syscall to fork process.
+@@ -5396,6 +5421,9 @@
+ // the best...
+ pid_t pid = NOT_IA64(syscall(__NR_fork);)
+ IA64_ONLY(fork();)
++#else
++ pid_t pid = fork();
++#endif
+
+ if (pid < 0) {
+ // fork failed
+@@ -5404,6 +5432,7 @@
+ } else if (pid == 0) {
+ // child process
+
++#ifdef __linux__
+ // execve() in LinuxThreads will call pthread_kill_other_threads_np()
+ // first to kill every thread on the thread list. Because this list is
+ // not reset by fork() (see notes above), execve() will instead kill
+@@ -5413,6 +5442,9 @@
+ // above.
+ NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
+ IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
++#else
++ execve("/bin/sh", (char* const*)argv, environ);
++#endif
+
+ // execve failed
+ _exit(-1);
+--- openjdk/hotspot/src/os/posix/launcher/java_md.c.orig
++++ openjdk/hotspot/src/os/posix/launcher/java_md.c
+@@ -41,7 +41,7 @@
+ #include "version_comp.h"
+ #endif
+
+-#ifdef __linux__
++#if defined(__linux__) || defined(__GLIBC__)
+ #include <pthread.h>
+ #else
+ #include <thread.h>
+@@ -89,7 +89,7 @@
+ * A collection of useful strings. One should think of these as #define
+ * entries, but actual strings can be more efficient (with many compilers).
+ */
+-#ifdef __linux__
++#if defined(__linux__) || defined(__GLIBC__)
+ static const char *system_dir = "/usr/java";
+ static const char *user_dir = "/java";
+ #else /* Solaris */
+@@ -426,7 +426,7 @@
+ runpath = getenv("LD_LIBRARY_PATH");
+ #endif /* __sun */
+
+-#ifdef __linux
++#if defined(__linux__) || defined(__GLIBC__)
+ /*
+ * On linux, if a binary is running as sgid or suid, glibc sets
+ * LD_LIBRARY_PATH to the empty string for security purposes. (In
+@@ -792,7 +792,7 @@
+ jboolean
+ GetApplicationHome(char *buf, jint bufsize)
+ {
+-#ifdef __linux__
++#if defined(__linux__) || defined(__GLIBC__)
+ char *execname = GetExecname();
+ if (execname) {
+ strncpy(buf, execname, bufsize-1);
+@@ -961,7 +961,7 @@
+ }
+ }
+ }
+-#elif defined(__linux__)
++#elif defined(__linux__) || defined(__GLIBC__)
+ {
+ const char* self = "/proc/self/exe";
+ char buf[PATH_MAX+1];
+@@ -1821,7 +1821,7 @@
+ int
+ ContinueInNewThread(int (JNICALL *continuation)(void *), jlong stack_size, void * args) {
+ int rslt;
+-#ifdef __linux__
++#if defined(__linux__) || defined(__GLIBC__)
+ pthread_t tid;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+--- openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp.orig
++++ openjdk/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
+@@ -81,6 +81,7 @@
+ # include <ucontext.h>
+ # include <fpu_control.h>
+
++#ifdef __linux__
+ #ifdef AMD64
+ #define REG_SP REG_RSP
+ #define REG_PC REG_RIP
+@@ -94,6 +95,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
+
+ address os::current_stack_pointer() {
+ #ifdef SPARC_WORKS
+@@ -119,15 +168,27 @@
+ }
+
+ 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
+@@ -279,12 +340,20 @@
+ pc = (address) os::Linux::ucontext_get_pc(uc);
+
+ if (pc == (address) Fetch32PFI) {
++#if defined(__FreeBSD_kernel__)
++ uc->context_pc = intptr_t(Fetch32Resume) ;
++#else
+ uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ;
++#endif
+ return 1 ;
+ }
+ #ifdef AMD64
+ if (pc == (address) FetchNPFI) {
++#if defined(__FreeBSD_kernel__)
++ uc->context_pc = intptr_t (FetchNResume) ;
++#else
+ uc->uc_mcontext.gregs[REG_PC] = intptr_t (FetchNResume) ;
++#endif
+ return 1 ;
+ }
+ #endif // AMD64
+@@ -430,7 +499,11 @@
+ // 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);
+@@ -500,7 +573,11 @@
+ // 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;
+ }
+
+@@ -752,6 +829,7 @@
+
+ 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]);
+@@ -794,6 +872,48 @@
+ 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();
+
+@@ -824,6 +944,7 @@
+
+ // 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]);
+@@ -851,6 +972,35 @@
+ 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();
+ }
+--- openjdk/hotspot/src/share/vm/memory/allocation.hpp.orig
++++ openjdk/hotspot/src/share/vm/memory/allocation.hpp
+@@ -218,9 +218,9 @@
+ void signal_out_of_memory(size_t request, const char* whence) const;
+
+ void check_for_overflow(size_t request, const char* whence) const {
+- if (UINTPTR_MAX - request < (uintptr_t)_hwm) {
+- signal_out_of_memory(request, whence);
+- }
++// if (UINTPTR_MAX - request < (uintptr_t)_hwm) {
++// signal_out_of_memory(request, whence);
++// }
+ }
+
+ public:
+--- openjdk/hotspot/src/share/vm/oops/generateOopMap.cpp.orig
++++ openjdk/hotspot/src/share/vm/oops/generateOopMap.cpp
+@@ -970,11 +970,11 @@
+ // The product of bbNo and _state_len can get large if there are lots of
+ // basic blocks and stack/locals/monitors. Need to check to make sure
+ // we don't overflow the capacity of a pointer.
+- if ((unsigned)bbNo > UINTPTR_MAX / sizeof(CellTypeState) / _state_len) {
+- report_error("The amount of memory required to analyze this method "
+- "exceeds addressable range");
+- return;
+- }
++// if ((unsigned)bbNo > UINTPTR_MAX / sizeof(CellTypeState) / _state_len) {
++// report_error("The amount of memory required to analyze this method "
++// "exceeds addressable range");
++// return;
++// }
+
+ CellTypeState *basicBlockState =
+ NEW_RESOURCE_ARRAY(CellTypeState, bbNo * _state_len);