i386 java binaries causing 100% cpu on amd64
Arne H. Juul
arnej at pvv.ntnu.no
Thu Feb 23 01:57:48 PST 2006
On Wed, 22 Feb 2006, Ashley Moran wrote:
> I have an Althlon 64 server running 6.0-rel in amd64 mode. I'm trying to
> compile JDK 1.5 on it, and I've gone about it two ways:
>
> * installing the binary package of the native JDK 1.4 created on my i386
> desktop
> * installing emulators/linux_base and the Linux JDK 1.4
>
> In both cases, when I run java -version, it does nothing but takes up 100%
> CPU. I've stress-tested the system by running an i386 version of the
> misc/chef port, and that runs, so the issue is not with i386 binaries in
> general.
this sounds like the problem I saw where the jdk tries to execute code
from the data segment, and the amd64 CPU actually honors the execute
protection (i386 traditionally has no notion of execute protection).
I think you can use an i386 version of jdk 1.5 to bootstrap, or
recompile your i386 jdk 1.4 with the patches below.
> Date: Thu, 16 Feb 2006 22:39:30 +0100
> From: Arne Juul <Arne.Juul at europe.yahoo-inc.com>
> To: freebsd-java at freebsd.org
> Subject: executing data needs mprotect with PROT_EXEC
>
> I've been trying to run some FreeBSD4 packages
> inside a jail on a FreeBSD6 / amd64 box; and I've
> hit a problem with ports/jdk.
>
> A couple of places the VM uses an array of
> integers, puts code in it, and executes it.
>
> This doesn't work on machines where the CPU
> honors the PROT_EXEC settings; this can be
> different on different machines (depending on
> BIOS settings probably).
>
> The right fix is to call mprotect() from jdk to allow
> execution of the memory in question, something like this:
--- ../../hotspot/src/os_cpu/bsd_i486/vm/os_bsd_i486.cpp Tue Feb
14 21:12:46 2006
+++ ../../hotspot/src/os_cpu/bsd_i486/vm/os_bsd_i486.cpp Wed Feb
15 16:30:49 2006
@@ -561,6 +562,9 @@
}
#else
static void (*fixcw)(void) = CAST_TO_FN_PTR(void (*)(void),
code_template);
+
+ ::mprotect((void *)code_template, sizeof(code_template),
+ PROT_EXEC | PROT_READ | PROT_WRITE);
#endif
fixcw();
--- ../../hotspot/src/cpu/i486/vm/vm_version_i486.cpp Thu Sep 11
03:40:14 2003
+++ ../../hotspot/src/cpu/i486/vm/vm_version_i486.cpp Tue Feb 14
23:34:40 2006
@@ -9,6 +9,8 @@
# include "incls/_precompiled.incl"
# include "incls/_vm_version_i486.cpp.incl"
+#include <sys/types.h>
+#include <sys/mman.h>
int VM_Version::_cpu;
int VM_Version::_cpuFeatures;
@@ -145,6 +147,10 @@
ResourceMark rm;
// Making this stub must be FIRST use of assembler
CodeBuffer* c = new CodeBuffer(address(stubCode), sizeof(stubCode));
+
+ ::mprotect((void *)stubCode, sizeof(stubCode),
+ PROT_EXEC | PROT_READ | PROT_WRITE);
+
VM_Version_StubGenerator g(c);
getPsrInfo_stub = CAST_TO_FN_PTR(_getPsrInfo_stub_t,
g.generate_getPsrInfo());
More information about the freebsd-java
mailing list