[prev in list] [next in list] [prev in thread] [next in thread] 

List:       netbsd-current-users
Subject:    Re: Help needed with FPE handling
From:       Martti Kuparinen <martti.kuparinen () iki ! fi>
Date:       2010-06-18 18:26:24
Message-ID: 4C1BBA50.10205 () iki ! fi
[Download RAW message or body]

18.06.2010 18:57, Matthias Drochner wrote:

> I don't have an amd64 to test. How does it fail?

sys_float.c:(.text+0x242): undefined reference to `skip_sse2_insn'
make[3]: *** 
[/home/pkgsrc/wip/erlang/work.x86_64/otp_src_R14A/bin/x86_64-unknown-netbsd5.99.30/beam.smp] 
Error 1

so the x86_64 code should really have same functionality like the other #ifdef 
fragments have now. And no, patch-as is not my patch originally.

> Why are you doing it differently than all the other OSes?

The good thing is that NetBSD/i386 seems to work but the NetBSD/amd64 code 
needs to look like the other 64-bit BSDs. I tried the OpenBSD/amd64 code but it 
didn't work and I don't have more time to investigate this now.

In the old Erlang R12B-0 code, that function had


#elif defined(__FreeBSD__) && defined(__x86_64__)
     mcontext_t *mc = &uc->uc_mcontext;
     struct savefpu *savefpu = (struct savefpu*)&mc->mc_fpstate;
     struct envxmm *envxmm = &savefpu->sv_env;
     if (envxmm->en_mxcsr & 0x000D) {
         envxmm->en_mxcsr &= ~(0x003F|0x0680);
         skip_sse2_insn(mc);
     }
     envxmm->en_sw &= ~0xFF;
#elif defined(__FreeBSD__) && defined(__i386__)
     mcontext_t *mc = &uc->uc_mcontext;
     union savefpu *savefpu = (union savefpu*)&mc->mc_fpstate;
     if (mc->mc_fpformat == _MC_FPFMT_XMM) {
         struct envxmm *envxmm = &savefpu->sv_xmm.sv_env;
         if (envxmm->en_mxcsr & 0x000D) {
             envxmm->en_mxcsr &= ~(0x003F|0x0680);
             skip_sse2_insn(mc);
         }
         envxmm->en_sw &= ~0xFF;
     } else {
         struct env87 *env87 = &savefpu->sv_87.sv_env;
         env87->en_sw &= ~0xFF;
     }
#elif defined(__OpenBSD__) && defined(__x86_64__)
     struct fxsave64 *fxsave = uc->sc_fpstate;
     if (fxsave->fx_mxcsr & 0x000D) {
         fxsave->fx_mxcsr &= ~(0x003F|0x0680);
         skip_sse2_insn(uc);
     }
     fxsave->fx_fsw &= ~0xFF;
#elif defined(__sun__) && defined(__x86_64__)
     mcontext_t *mc = &uc->uc_mcontext;
     struct fpchip_state *fpstate = &mc->fpregs.fp_reg_set.fpchip_state;
     if (fpstate->mxcsr & 0x000D) {
         fpstate->mxcsr &= ~(0x003F|0x0680);
         skip_sse2_insn(mc);
     }
     fpstate->sw &= ~0xFF;
#endif
     set_current_fp_exception();
}


but in the latest version the code has been rewritten not to use skip_sse2_insn 
and it looks like this


#elif defined(__FreeBSD__) && defined(__x86_64__)
     mcontext_t *mc = &uc->uc_mcontext;
     struct savefpu *savefpu = (struct savefpu*)&mc->mc_fpstate;
     struct envxmm *envxmm = &savefpu->sv_env;
     pc = mc_pc(mc);
     envxmm->en_mxcsr = 0x1F80;
     envxmm->en_sw &= ~0xFF;
#elif defined(__FreeBSD__) && defined(__i386__)
     mcontext_t *mc = &uc->uc_mcontext;
     union savefpu *savefpu = (union savefpu*)&mc->mc_fpstate;
     pc = mc_pc(mc);
     if (mc->mc_fpformat == _MC_FPFMT_XMM) {
         struct envxmm *envxmm = &savefpu->sv_xmm.sv_env;
         envxmm->en_mxcsr = 0x1F80;
         envxmm->en_sw &= ~0xFF;
     } else {
         struct env87 *env87 = &savefpu->sv_87.sv_env;
         env87->en_sw &= ~0xFF;
     }
#elif defined(__OpenBSD__) && defined(__x86_64__)
     struct fxsave64 *fxsave = uc->sc_fpstate;
     pc = mc_pc(uc);
     fxsave->fx_mxcsr = 0x1F80;
     fxsave->fx_fsw &= ~0xFF;
#elif defined(__sun__) && defined(__x86_64__)
     mcontext_t *mc = &uc->uc_mcontext;
     struct fpchip_state *fpstate = &mc->fpregs.fp_reg_set.fpchip_state;
     pc = mc_pc(mc);
     fpstate->mxcsr = 0x1F80;
     fpstate->sw &= ~0xFF;
#endif


I don't know (yet) how to write the NetBSD/amd64 code as this "gregs[REG_RIP]" 
looks so different that in other BSDs (and I haven't look that the other BSD 
source codes).

So feel free to update your pkgsrc/wip and take a look at the updated patch-as 
and figure out how it should be implemented for NetBSD/amd64 :-)

Martti
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic