summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/arch/syscalls_arm64.go
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2020-04-13 21:22:36 +0000
committergVisor bot <gvisor-bot@google.com>2020-04-13 21:22:36 +0000
commit4ecfb10d3489c33de488eebf1b4d7f72b96c8800 (patch)
treee01d940661dfcf480d64602985261649f7f56ac3 /pkg/sentry/arch/syscalls_arm64.go
parent177e29429d0118710eee48f77f7dbc7eb9c9f4e7 (diff)
parent7e5d67ee90867ba3a2cc0bf1abc59a6c0a47203b (diff)
Merge release-20200323.0-144-g7e5d67e (automated)
Diffstat (limited to 'pkg/sentry/arch/syscalls_arm64.go')
-rwxr-xr-xpkg/sentry/arch/syscalls_arm64.go13
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])},