From: Christophe R. <cr...@us...> - 2002-07-11 15:17:04
|
Update of /cvsroot/sbcl/sbcl/src/runtime In directory usw-pr-cvs1:/tmp/cvs-serv29652/src/runtime Modified Files: ppc-linux-os.c Log Message: 0.7.5.10: Begin to fix floating point exceptions on PPC ... write an os_context_fp_control function ... use it in CONTEXT-FLOATING-POINT-MODES (this, unlike on the SPARC and Alpha ports, doesn't fix all the normal-user problems. After the first return from the Lisp debugger on the PPC, the FLOATING-POINT-MODES are (almost) cleared, which means that the second bad floating point operation is not trapped). Index: ppc-linux-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ppc-linux-os.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ppc-linux-os.c 18 Mar 2002 17:59:37 -0000 1.1 +++ ppc-linux-os.c 11 Jul 2002 15:17:01 -0000 1.2 @@ -67,6 +67,17 @@ return &context->uc_sigmask; } +unsigned long +os_context_fp_control(os_context_t *context) +{ + /* So this may look like nice, well behaved code. However, closer + inspection reveals that gpr is simply the general purpose + registers, and PT_FPSCR is an offset that is larger than 32 + (the number of ppc registers), but that happens to get the + right answer. -- CSR, 2002-07-11 */ + return &((context->uc_mcontext.regs)->gpr[PT_FPSCR]); +} + void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { /* see ppc-arch.c */ |