git: 053cbecd29f8 - stable/13 - linux(4): Simplify %r10 restoring on amd64

From: Dmitry Chagin <dchagin_at_FreeBSD.org>
Date: Thu, 29 Jun 2023 08:20:45 UTC
The branch stable/13 has been updated by dchagin:

URL: https://cgit.FreeBSD.org/src/commit/?id=053cbecd29f8f167628f5316d064557323af6ee8

commit 053cbecd29f8f167628f5316d064557323af6ee8
Author:     Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-05-28 14:06:23 +0000
Commit:     Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-06-29 08:16:01 +0000

    linux(4): Simplify %r10 restoring on amd64
    
    Restore %r10 at system call entry to avoid doing this multiply times.
    
    Differential Revision:  https://reviews.freebsd.org/D40154
    MFC after:              1 month
    
    (cherry picked from commit 185bd9fa3096595350ebe7bcd7e0ddcf17773030)
---
 sys/amd64/linux/linux_machdep.c | 6 ------
 sys/amd64/linux/linux_sysvec.c  | 6 +++---
 2 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/sys/amd64/linux/linux_machdep.c b/sys/amd64/linux/linux_machdep.c
index 6ac0ab0cd3d7..155ea918cd0a 100644
--- a/sys/amd64/linux/linux_machdep.c
+++ b/sys/amd64/linux/linux_machdep.c
@@ -350,12 +350,6 @@ linux_ptrace_getregs_machdep(struct thread *td, pid_t pid,
 		linux_msg(td, "PT_LWPINFO failed with error %d", error);
 		return (error);
 	}
-	if ((lwpinfo.pl_flags & PL_FLAG_SCE) != 0) {
-		/*
-		 * Undo the mangling done in exception.S:fast_syscall_common().
-		 */
-		l_regset->r10 = l_regset->rcx;
-	}
 	if ((lwpinfo.pl_flags & (PL_FLAG_SCE | PL_FLAG_SCX)) != 0) {
 		/*
 		 * In Linux, the syscall number - passed to the syscall
diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c
index 3681dc881485..fea1e274ac95 100644
--- a/sys/amd64/linux/linux_sysvec.c
+++ b/sys/amd64/linux/linux_sysvec.c
@@ -166,6 +166,9 @@ linux_fetch_syscall_args(struct thread *td)
 	else
 		sa->callp = &p->p_sysent->sv_table[sa->code];
 
+	/* Restore r10 earlier to avoid doing this multiply times. */
+	frame->tf_r10 = frame->tf_rcx;
+
 	td->td_retval[0] = 0;
 	return (0);
 }
@@ -180,7 +183,6 @@ linux_set_syscall_retval(struct thread *td, int error)
 	switch (error) {
 	case 0:
 		frame->tf_rax = td->td_retval[0];
-		frame->tf_r10 = frame->tf_rcx;
 		break;
 
 	case ERESTART:
@@ -191,7 +193,6 @@ linux_set_syscall_retval(struct thread *td, int error)
 		 *
 		 */
 		frame->tf_rip -= frame->tf_err;
-		frame->tf_r10 = frame->tf_rcx;
 		break;
 
 	case EJUSTRETURN:
@@ -199,7 +200,6 @@ linux_set_syscall_retval(struct thread *td, int error)
 
 	default:
 		frame->tf_rax = bsd_to_linux_errno(error);
-		frame->tf_r10 = frame->tf_rcx;
 		break;
 	}