Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Feb 2006 22:39:30 +0100
From:      Arne Juul <Arne.Juul@europe.yahoo-inc.com>
To:        freebsd-java@freebsd.org
Subject:   executing data needs mprotect with PROT_EXEC
Message-ID:  <43F4F112.8010202@europe.yahoo-inc.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070902020207040407010707
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

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());


patches also attached in case the mail client mangles them :-)

    -  Arne H. J.

--------------070902020207040407010707
Content-Type: text/plain;
 name="patch-os_bsd_i486.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch-os_bsd_i486.cpp"

--- ../../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();

--------------070902020207040407010707
Content-Type: text/plain;
 name="patch-vm_version_i486.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch-vm_version_i486.cpp"

--- ../../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());
 

--------------070902020207040407010707--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?43F4F112.8010202>