X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fmips-linux-os.c;h=70f988e8f467df0b0c4e3681e93440fd5d0f2a8c;hb=b7d22ded1428e8d3e87c37164aa6742dd28aa6ce;hp=1028b837d2b579a8efcc10c66c17c3a49d062410;hpb=28c2c3d4a880a183427123cf7a79c39674a02348;p=sbcl.git diff --git a/src/runtime/mips-linux-os.c b/src/runtime/mips-linux-os.c index 1028b83..70f988e 100644 --- a/src/runtime/mips-linux-os.c +++ b/src/runtime/mips-linux-os.c @@ -49,20 +49,26 @@ arch_os_thread_cleanup(struct thread *thread) os_context_register_t * os_context_register_addr(os_context_t *context, int offset) { - return &(((struct sigcontext *)&(context->uc_mcontext))->sc_regs[offset]); + mcontext_t *mctx = &context->uc_mcontext; + struct sigcontext *ctx = (struct sigcontext *)mctx; + return &ctx->sc_regs[offset]; } os_context_register_t * os_context_fpregister_addr(os_context_t *context, int offset) { - return &(((struct sigcontext *)&(context->uc_mcontext))->sc_fpregs[offset]); + mcontext_t *mctx = &context->uc_mcontext; + struct sigcontext *ctx = (struct sigcontext *)mctx; + return &ctx->sc_fpregs[offset]; } os_context_register_t * os_context_pc_addr(os_context_t *context) { /* Why do I get all the silly ports? -- CSR, 2002-08-11 */ - return &(((struct sigcontext *)&(context->uc_mcontext))->sc_pc); + mcontext_t *mctx = &context->uc_mcontext; + struct sigcontext *ctx = (struct sigcontext *)mctx; + return &ctx->sc_pc; } sigset_t * @@ -74,14 +80,17 @@ os_context_sigmask_addr(os_context_t *context) unsigned int os_context_fp_control(os_context_t *context) { - /* FIXME: Probably do something. */ - return 0; + mcontext_t *mctx = &context->uc_mcontext; + struct sigcontext *ctx = (struct sigcontext *)mctx; + return ctx->sc_fpc_csr; } void os_restore_fp_control(os_context_t *context) { - /* FIXME: Probably do something. */ + unsigned int ctl = os_context_fp_control(context); + ctl &= ~(FLOAT_STICKY_BITS_MASK | FLOAT_EXCEPTIONS_BYTE_MASK); + arch_set_fp_control(ctl); } unsigned int