Messages in this thread | | | Date | Tue, 30 Apr 2013 16:42:00 +0200 | From | Mikael Pettersson <> | Subject | RE: X86 fpu registers in a signal handler's ucontext |
| |
Warlich, Christof writes: > Mikael Pettersson <mikpe@it.uu.se> writes: > > Write to the fpstate ->mxcsr and ->swd fields in the sigaction handler's uc_mcontext. > > To me, "sigaction handler's uc_mcontext" sounds like userspace, which really confuses me: > Even in most recent glibc-2.17, uc_mcontext is of type mcontext_t, which us defined as: > > typedef struct { > gregset_t gregs; > fpregset_t fpregs; > } mcontext_t; > > typedef struct fpregset { > union { > struct fpchip_state { > int state[27]; > int status; > } fpchip_state; > struct fp_emul_space { > char fp_emul[246]; > char fp_epad[2]; > } fp_emul_space; > int f_fpregs[62]; > } fp_reg_set; > long int f_wregs[33]; > } fpregset_t; > > So there is no fpstate whatsoever.
You're looking at the wrong header: glibc-2.17/sysdeps/i386/sys/ucontext.h is legacy SVR4. Instead look at glibc-2.17/sysdeps/unix/sysv/linux/x86/sys/ucontext.h.
(If the old one got installed on your system then something there is seriously wrong.)
The only quirk is that to access ->mxcsr on 32-bit you have to check if the high half of ->status contains FXSR_MAGIC and if so you need to cast that pointer to struct _fpstate*.
| |