Merge pull request #2061 from lubinszARM:pr_restart_syscall

PiperOrigin-RevId: 301700868
This commit is contained in:
gVisor bot
2020-03-18 17:11:43 -07:00
2 changed files with 13 additions and 1 deletions
+4
View File
@@ -100,6 +100,9 @@ type State struct {
// FeatureSet is a pointer to the currently active feature set.
FeatureSet *cpuid.FeatureSet
// OrigR0 stores the value of register R0.
OrigR0 uint64
}
// Proto returns a protobuf representation of the system registers in State.
@@ -150,6 +153,7 @@ func (s *State) Fork() State {
aarch64FPState: s.aarch64FPState.fork(),
TPValue: s.TPValue,
FeatureSet: s.FeatureSet,
OrigR0: s.OrigR0,
}
}
+9 -1
View File
@@ -50,13 +50,21 @@ func (c *context64) SyscallArgs() SyscallArguments {
}
// RestartSyscall implements Context.RestartSyscall.
// Prepare for system call restart, OrigR0 will be restored to R0.
// Please see the linux code as reference:
// arch/arm64/kernel/signal.c:do_signal()
func (c *context64) RestartSyscall() {
c.Regs.Pc -= SyscallWidth
c.Regs.Regs[8] = uint64(restartSyscallNr)
// R0 will be backed up into OrigR0 when entering doSyscall().
// Please see the linux code as reference:
// arch/arm64/kernel/syscall.c:el0_svc_common().
// Here we restore it back.
c.Regs.Regs[0] = uint64(c.OrigR0)
}
// RestartSyscallWithRestartBlock implements Context.RestartSyscallWithRestartBlock.
func (c *context64) RestartSyscallWithRestartBlock() {
c.Regs.Pc -= SyscallWidth
c.Regs.Regs[0] = uint64(c.OrigR0)
c.Regs.Regs[8] = uint64(restartSyscallNr)
}