From: Nikodemus S. <de...@us...> - 2009-05-13 18:13:54
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv974/src/runtime Modified Files: bsd-os.c bsd-os.h x86-bsd-os.c x86-bsd-os.h Log Message: 1.0.28.46: implement os_restore_fp_control() for OpenBSD x86 Fixes problems with the floating point modes being forgotten. Also fixes one of the float tests by clearing the exception flags first, insuring that the right exception is raised. Patch by Josh Elsasser. Index: bsd-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- bsd-os.c 22 Mar 2009 20:07:50 -0000 1.62 +++ bsd-os.c 13 May 2009 18:13:48 -0000 1.63 @@ -70,7 +70,11 @@ #include <sys/types.h> #include <sys/resource.h> #include <sys/stat.h> +#include <sys/sysctl.h> #include <dlfcn.h> +#ifdef LISP_FEATURE_X86 +#include <machine/cpu.h> +#endif static void openbsd_init(); #endif @@ -481,9 +485,16 @@ #endif #ifdef __OpenBSD__ + +int openbsd_use_fxsave = 0; + void openbsd_init() { +#ifdef LISP_FEATURE_X86 + int mib[2]; + size_t size; +#endif /* * Show a warning if it looks like the memory available after * allocating the spaces won't be at least this much. @@ -495,6 +506,14 @@ #endif struct rlimit rl; +#ifdef LISP_FEATURE_X86 + /* Save the machdep.osfxsr sysctl for use by os_restore_fp_control() */ + mib[0] = CTL_MACHDEP; + mib[1] = CPU_OSFXSR; + size = sizeof (openbsd_use_fxsave); + sysctl(mib, 2, &openbsd_use_fxsave, &size, NULL, 0); +#endif + /* OpenBSD, like NetBSD, counts mmap()ed space against the * process's data size limit. If the soft limit is lower than the * hard limit then try to yank it up, this lets users in the Index: bsd-os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/bsd-os.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- bsd-os.h 17 Mar 2009 11:27:08 -0000 1.25 +++ bsd-os.h 13 May 2009 18:13:48 -0000 1.26 @@ -65,6 +65,9 @@ typedef struct sigcontext os_context_t; #define SIG_MEMORY_FAULT SIGSEGV +#if defined(LISP_FEATURE_X86) +extern int openbsd_use_fxsave; +#endif #elif defined __NetBSD__ Index: x86-bsd-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-bsd-os.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- x86-bsd-os.c 26 Sep 2007 11:24:02 -0000 1.16 +++ x86-bsd-os.c 13 May 2009 18:13:48 -0000 1.17 @@ -19,6 +19,12 @@ #include "machine/npx.h" #endif +#if defined(LISP_FEATURE_OPENBSD) +#include <machine/frame.h> +#include <machine/npx.h> +#include <stddef.h> +#endif + /* KLUDGE: There is strong family resemblance in the signal context * stuff in FreeBSD and OpenBSD, but in detail they're different in * almost every line of code. It would be nice to find some way to @@ -237,3 +243,19 @@ #endif } #endif + +#if defined(LISP_FEATURE_OPENBSD) +void +os_restore_fp_control(os_context_t *context) +{ + struct sigframe *frame; + union savefpu *fpu; + + frame = (struct sigframe *)((char*)context - offsetof(struct sigframe, sf_sc)); + fpu = frame->sf_fpstate; + if (openbsd_use_fxsave) + __asm__ __volatile__ ("fldcw %0" : : "m" (fpu->sv_xmm.sv_env.en_cw)); + else + __asm__ __volatile__ ("fldcw %0" : : "m" (fpu->sv_87.sv_env.en_cw)); +} +#endif Index: x86-bsd-os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/x86-bsd-os.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- x86-bsd-os.h 26 Sep 2007 11:24:02 -0000 1.11 +++ x86-bsd-os.h 13 May 2009 18:13:48 -0000 1.12 @@ -35,4 +35,9 @@ void os_restore_fp_control(os_context_t *context); #endif +#if defined LISP_FEATURE_OPENBSD +#define RESTORE_FP_CONTROL_FROM_CONTEXT +void os_restore_fp_control(os_context_t *context); +#endif + #endif /* _X86_BSD_OS_H */ |