diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-04-13 21:22:36 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-04-13 21:22:36 +0000 |
commit | 4ecfb10d3489c33de488eebf1b4d7f72b96c8800 (patch) | |
tree | e01d940661dfcf480d64602985261649f7f56ac3 /pkg/sentry/arch/syscalls_arm64.go | |
parent | 177e29429d0118710eee48f77f7dbc7eb9c9f4e7 (diff) | |
parent | 7e5d67ee90867ba3a2cc0bf1abc59a6c0a47203b (diff) |
Merge release-20200323.0-144-g7e5d67e (automated)
Diffstat (limited to 'pkg/sentry/arch/syscalls_arm64.go')
-rwxr-xr-x | pkg/sentry/arch/syscalls_arm64.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/pkg/sentry/arch/syscalls_arm64.go b/pkg/sentry/arch/syscalls_arm64.go index dc13b6124..92d062513 100755 --- a/pkg/sentry/arch/syscalls_arm64.go +++ b/pkg/sentry/arch/syscalls_arm64.go @@ -18,6 +18,17 @@ package arch const restartSyscallNr = uintptr(128) +// SyscallSaveOrig save the value of the register R0 which is clobbered in +// syscall handler(doSyscall()). +// +// In linux, at the entry of the syscall handler(el0_svc_common()), value of R0 +// is saved to the pt_regs.orig_x0 in kernel code. But currently, the orig_x0 +// was not accessible to the user space application, so we have to do the same +// operation in the sentry code to save the R0 value into the App context. +func (c *context64) SyscallSaveOrig() { + c.OrigR0 = c.Regs.Regs[0] +} + // SyscallNo returns the syscall number according to the 64-bit convention. func (c *context64) SyscallNo() uintptr { return uintptr(c.Regs.Regs[8]) @@ -40,7 +51,7 @@ func (c *context64) SyscallNo() uintptr { // R30: the link register. func (c *context64) SyscallArgs() SyscallArguments { return SyscallArguments{ - SyscallArgument{Value: uintptr(c.Regs.Regs[0])}, + SyscallArgument{Value: uintptr(c.OrigR0)}, SyscallArgument{Value: uintptr(c.Regs.Regs[1])}, SyscallArgument{Value: uintptr(c.Regs.Regs[2])}, SyscallArgument{Value: uintptr(c.Regs.Regs[3])}, |