[Openmcl-cvs-notifications] r10030 - in /trunk/source/lisp-kernel: memory.c pmcl-kernel.c x86-exceptions.h
gb at clozure.com
gb at clozure.com
Tue Jul 15 09:15:31 EDT 2008
Author: gb
Date: Tue Jul 15 09:15:30 2008
New Revision: 10030
Log:
Solaris-isms. Can (sort of) load a Linux image (skipping over the
platform check in the image loader), run a little bit of lisp code
and handle some faults before getting into shared-lib reinitialization
code (which needs to be re-worked for Solaris.)
UnProtectMemory(): Solaris kludges are just that. Something else is
going on here, and whatever it is likely has a better solution. (For
the time being, use mprotect() to make a single page writable, else
use mmap(). Some calls to mprotect on multiple pages claim that pages
in the range aren't mapped, which doesn't sound right.)
Note that dlsym() and friends will need different (from Linux) pseudo-handle
constants.
Modified:
trunk/source/lisp-kernel/memory.c
trunk/source/lisp-kernel/pmcl-kernel.c
trunk/source/lisp-kernel/x86-exceptions.h
Modified: trunk/source/lisp-kernel/memory.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/memory.c (original)
+++ trunk/source/lisp-kernel/memory.c Tue Jul 15 09:15:30 2008
@@ -90,11 +90,13 @@
UnProtectMemory(LogicalAddress addr, natural nbytes)
{
#ifdef SOLARIS
- return addr =3D=3D mmap(addr,nbytes,PROT_READ|PROT_WRITE|PROT_EXEC,
- MAP_PRIVATE | MAP_FIXED | MAP_ANON,-1,0);
-#else
+ if (nbytes > page_size) {
+ return addr !=3D mmap(addr,nbytes,PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_PRIVATE | MAP_FIXED | MAP_ANON,-1,0);
+ }
+#endif
return mprotect(addr, nbytes, PROT_READ|PROT_WRITE|PROT_EXEC);
-#endif
+
}
=
void
Modified: trunk/source/lisp-kernel/pmcl-kernel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/pmcl-kernel.c (original)
+++ trunk/source/lisp-kernel/pmcl-kernel.c Tue Jul 15 09:15:30 2008
@@ -350,7 +350,7 @@
#define MAXIMUM_MAPPABLE_MEMORY (512L<<30L)
#endif
#ifdef SOLARIS
-#define MAXIMUM_MAPPABLE_MEMORY (1024L<<30L)
+#define MAXIMUM_MAPPABLE_MEMORY (128L<<30L)
#endif
#ifdef LINUX
#ifdef X8664
@@ -680,7 +680,7 @@
#ifdef SOLARIS
fixed_map_ok =3D true;
#endif
- raise_limit();
+ raise_limit(); /* From Andi Kleen: observe rlimits */
start =3D mmap((void *)want,
totalsize + heap_segment_size,
PROT_NONE,
@@ -1956,7 +1956,7 @@
void *
xFindSymbol(void* handle, char *name)
{
-#if defined(LINUX) || defined(FREEBSD)
+#if defined(LINUX) || defined(FREEBSD) || defined(SOLARIS)
return dlsym(handle, name);
#endif
#ifdef DARWIN
@@ -1985,7 +1985,7 @@
void *
get_r_debug()
{
-#if defined(LINUX) || defined(FREEBSD)
+#if defined(LINUX) || defined(FREEBSD) || defined(SOLARIS)
#if WORD_SIZE =3D=3D 64
extern Elf64_Dyn _DYNAMIC[];
Elf64_Dyn *dp;
Modified: trunk/source/lisp-kernel/x86-exceptions.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/x86-exceptions.h (original)
+++ trunk/source/lisp-kernel/x86-exceptions.h Tue Jul 15 09:15:30 2008
@@ -147,8 +147,8 @@
=
#ifdef SOLARIS
#define SIGNUM_FOR_INTN_TRAP SIGSEGV
-#define IS_MAYBE_INT_TRAP(info,xp) (((info->si_code) &0x7f) =3D=3D 0)
-#define SIGRETURN(context)
+#define IS_MAYBE_INT_TRAP(info,xp) (((info)->si_code) =3D=3D SEGV_MAPERR)
+#define SIGRETURN(context) setcontext(context)
#endif
=
/* Please go away. */
More information about the Openmcl-cvs-notifications
mailing list