Module Name: src
Committed By: maxv
Date: Sat Feb 24 17:12:10 UTC 2018
Modified Files:
src/sys/arch/amd64/amd64: locore.S
Log Message:
Use %rax instead of %r15 in the non-SVS case, to reduce the diff against
SVS. In SVS we use %rax instead of %r15 because the following instructions
cannot be encoded:
movq %r15,SVS_UTLS+UTLS_SCRATCH
movq SVS_UTLS+UTLS_RSP0,%r15
To generate a diff of this commit:
cvs rdiff -u -r1.155 -r1.156 src/sys/arch/amd64/amd64/locore.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.155 src/sys/arch/amd64/amd64/locore.S:1.156
--- src/sys/arch/amd64/amd64/locore.S:1.155 Thu Feb 22 14:57:11 2018
+++ src/sys/arch/amd64/amd64/locore.S Sat Feb 24 17:12:10 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.155 2018/02/22 14:57:11 maxv Exp $ */
+/* $NetBSD: locore.S,v 1.156 2018/02/24 17:12:10 maxv Exp $ */
/*
* Copyright-o-rama!
@@ -1358,6 +1358,7 @@ END(lwp_trampoline)
* Entry points of the 'syscall' instruction, 64bit and 32bit mode.
*/
+#define SP(x) (x)-(TF_SS+8)(%rax)
.macro SYSCALL_ENTRY name,is_svs
IDTVEC(\name)
@@ -1376,40 +1377,32 @@ IDTVEC(\name)
*/
swapgs
-#define SP(x,reg) (x)-(TF_SS+8)(reg)
-
+ /* Get the LWP's kernel stack pointer in %rax */
.if \is_svs
movq %rax,SVS_UTLS+UTLS_SCRATCH
movq SVS_UTLS+UTLS_RSP0,%rax
+ .else
+ movq %rax,CPUVAR(SCRATCH)
+ movq CPUVAR(CURLWP),%rax
+ movq L_PCB(%rax),%rax
+ movq PCB_RSP0(%rax),%rax
+ .endif
- /* Make stack look like an 'int nn' frame */
- movq $(LSEL(LUDATA_SEL, SEL_UPL)),SP(TF_SS,%rax) /* user %ss */
- movq %rsp,SP(TF_RSP,%rax) /* user %rsp */
- movq %r11,SP(TF_RFLAGS,%rax) /* user %rflags */
- movq $(LSEL(LUCODE_SEL, SEL_UPL)),SP(TF_CS,%rax) /* user %cs */
- movq %rcx,SP(TF_RIP,%rax) /* user %rip */
- leaq SP(0,%rax),%rsp /* %rsp now valid after frame */
+ /* Make stack look like an 'int nn' frame */
+ movq $(LSEL(LUDATA_SEL, SEL_UPL)),SP(TF_SS) /* user %ss */
+ movq %rsp,SP(TF_RSP) /* user %rsp */
+ movq %r11,SP(TF_RFLAGS) /* user %rflags */
+ movq $(LSEL(LUCODE_SEL, SEL_UPL)),SP(TF_CS) /* user %cs */
+ movq %rcx,SP(TF_RIP) /* user %rip */
+ leaq SP(0),%rsp /* %rsp now valid after frame */
+ /* Restore %rax */
+ .if \is_svs
movq SVS_UTLS+UTLS_SCRATCH,%rax
.else
- movq %r15,CPUVAR(SCRATCH)
- movq CPUVAR(CURLWP),%r15
- movq L_PCB(%r15),%r15
- movq PCB_RSP0(%r15),%r15 /* LWP's kernel stack pointer */
-
- /* Make stack look like an 'int nn' frame */
- movq $(LSEL(LUDATA_SEL, SEL_UPL)),SP(TF_SS,%r15) /* user %ss */
- movq %rsp,SP(TF_RSP,%r15) /* user %rsp */
- movq %r11,SP(TF_RFLAGS,%r15) /* user %rflags */
- movq $(LSEL(LUCODE_SEL, SEL_UPL)),SP(TF_CS,%r15) /* user %cs */
- movq %rcx,SP(TF_RIP,%r15) /* user %rip */
- leaq SP(0,%r15),%rsp /* %rsp now valid after frame */
-
- movq CPUVAR(SCRATCH),%r15
+ movq CPUVAR(SCRATCH),%rax
.endif
-#undef SP
-
movq $2,TF_ERR(%rsp) /* syscall instruction size */
movq $T_ASTFLT,TF_TRAPNO(%rsp)
#else