Merge pull request #2664 from lubinszARM:pr_sigfp
PiperOrigin-RevId: 311153824
This commit is contained in:
commit
06ded1c437
|
@ -19,6 +19,7 @@ import (
|
|||
"syscall"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
|
@ -134,6 +135,11 @@ func (c *context64) SignalSetup(st *Stack, act *SignalAct, info *SignalInfo, alt
|
|||
c.Regs.Regs[1] = uint64(infoAddr)
|
||||
c.Regs.Regs[2] = uint64(ucAddr)
|
||||
c.Regs.Regs[30] = uint64(act.Restorer)
|
||||
|
||||
// Save the thread's floating point state.
|
||||
c.sigFPState = append(c.sigFPState, c.aarch64FPState)
|
||||
// Signal handler gets a clean floating point state.
|
||||
c.aarch64FPState = newAarch64FPState()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -155,5 +161,21 @@ func (c *context64) SignalRestore(st *Stack, rt bool) (linux.SignalSet, SignalSt
|
|||
c.Regs.Sp = uc.MContext.Sp
|
||||
c.Regs.Pstate = uc.MContext.Pstate
|
||||
|
||||
// Restore floating point state.
|
||||
l := len(c.sigFPState)
|
||||
if l > 0 {
|
||||
c.aarch64FPState = c.sigFPState[l-1]
|
||||
// NOTE(cl/133042258): State save requires that any slice
|
||||
// elements from '[len:cap]' to be zero value.
|
||||
c.sigFPState[l-1] = nil
|
||||
c.sigFPState = c.sigFPState[0 : l-1]
|
||||
} else {
|
||||
// This might happen if sigreturn(2) calls are unbalanced with
|
||||
// respect to signal handler entries. This is not expected so
|
||||
// don't bother to do anything fancy with the floating point
|
||||
// state.
|
||||
log.Warningf("sigreturn unable to restore application fpstate")
|
||||
}
|
||||
|
||||
return uc.Sigset, uc.Stack, nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue