summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-08-18 08:47:27 +0000
committerkib <kib@FreeBSD.org>2008-08-18 08:47:27 +0000
commit0d74400a62306625ffa8bb35cba7925b956ec864 (patch)
tree42ad3ba8578b6509c62721c7dec184daa649fb73
parentbcf5f4ae388cfb02d90c9ced7c2d75c212de4ae4 (diff)
downloadFreeBSD-src-0d74400a62306625ffa8bb35cba7925b956ec864.zip
FreeBSD-src-0d74400a62306625ffa8bb35cba7925b956ec864.tar.gz
The doreti_iret_fault code is always called with gs base MSR containing
kernel gs base, because %rip is adjusted only on kernel-mode trap caused by iretq execution. On the other hand, the stack contains (hardware part of) trap frame from the usermode. As a consequence, checking for frame mode and doing swapgs causes the kernel to enter trap() with usermode gs base. Remove the check for mode and conditional swapgs, we already have right gs base in the MSR. Submitted by: Nate Eldredge <neldredge math ucsd edu> MFC after: 3 days
-rw-r--r--sys/amd64/amd64/exception.S9
1 files changed, 3 insertions, 6 deletions
diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S
index f1cbe35..fd0a7ca 100644
--- a/sys/amd64/amd64/exception.S
+++ b/sys/amd64/amd64/exception.S
@@ -636,13 +636,10 @@ doreti_iret:
.globl doreti_iret_fault
doreti_iret_fault:
subq $TF_RIP,%rsp /* space including tf_err, tf_trapno */
- testb $SEL_RPL_MASK,TF_CS(%rsp) /* Did we come from kernel? */
- jz 1f /* already running with kernel GS.base */
- swapgs
-1: testl $PSL_I,TF_RFLAGS(%rsp)
- jz 2f
+ testl $PSL_I,TF_RFLAGS(%rsp)
+ jz 1f
sti
-2: movq %rdi,TF_RDI(%rsp)
+1: movq %rdi,TF_RDI(%rsp)
movq %rsi,TF_RSI(%rsp)
movq %rdx,TF_RDX(%rsp)
movq %rcx,TF_RCX(%rsp)
OpenPOWER on IntegriCloud