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/kernel/task_syscall.go | |
parent | 177e29429d0118710eee48f77f7dbc7eb9c9f4e7 (diff) | |
parent | 7e5d67ee90867ba3a2cc0bf1abc59a6c0a47203b (diff) |
Merge release-20200323.0-144-g7e5d67e (automated)
Diffstat (limited to 'pkg/sentry/kernel/task_syscall.go')
-rw-r--r-- | pkg/sentry/kernel/task_syscall.go | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/pkg/sentry/kernel/task_syscall.go b/pkg/sentry/kernel/task_syscall.go index d555d69a8..3d7a734ef 100644 --- a/pkg/sentry/kernel/task_syscall.go +++ b/pkg/sentry/kernel/task_syscall.go @@ -194,6 +194,19 @@ func (t *Task) executeSyscall(sysno uintptr, args arch.SyscallArguments) (rval u // // The syscall path is very hot; avoid defer. func (t *Task) doSyscall() taskRunState { + // Save value of the register which is clobbered in the following + // t.Arch().SetReturn(-ENOSYS) operation. This is dedicated to arm64. + // + // On x86, register rax was shared by syscall number and return + // value, and at the entry of the syscall handler, the rax was + // saved to regs.orig_rax which was exposed to user space. + // But on arm64, syscall number was passed through X8, and the X0 + // was shared by the first syscall argument and return value. The + // X0 was saved to regs.orig_x0 which was not exposed to user space. + // So we have to do the same operation here to save the X0 value + // into the task context. + t.Arch().SyscallSaveOrig() + sysno := t.Arch().SyscallNo() args := t.Arch().SyscallArgs() @@ -269,6 +282,7 @@ func (*runSyscallAfterSyscallEnterStop) execute(t *Task) taskRunState { return (*runSyscallExit)(nil) } args := t.Arch().SyscallArgs() + return t.doSyscallInvoke(sysno, args) } |