summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/exception.S
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-04-10 18:38:11 +0000
committerkib <kib@FreeBSD.org>2010-04-10 18:38:11 +0000
commit76d6c015c73ed644251aad688c3238ce1aa2fedc (patch)
tree9f0987be21050fb44668e41a253c8773dc3b9d51 /sys/amd64/amd64/exception.S
parenta98b1eb99d6bf1fe47d49c33fcdcab7c8709ed7c (diff)
downloadFreeBSD-src-76d6c015c73ed644251aad688c3238ce1aa2fedc.zip
FreeBSD-src-76d6c015c73ed644251aad688c3238ce1aa2fedc.tar.gz
Handle a case when non-canonical address is loaded into the fsbase or
gsbase MSR. MFC after: 3 days
Diffstat (limited to 'sys/amd64/amd64/exception.S')
-rw-r--r--sys/amd64/amd64/exception.S30
1 files changed, 28 insertions, 2 deletions
diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S
index 3d6401e..bbc304a 100644
--- a/sys/amd64/amd64/exception.S
+++ b/sys/amd64/amd64/exception.S
@@ -668,7 +668,8 @@ ld_fs: movw %ax,%fs
movl $MSR_FSBASE,%ecx
movl PCB_FSBASE(%r8),%eax
movl PCB_FSBASE+4(%r8),%edx
- wrmsr
+ .globl ld_fsbase
+ld_fsbase: wrmsr
1:
/* Restore %gs and gsbase */
movw TF_GS(%rsp),%si
@@ -685,7 +686,8 @@ ld_gs: movw %si,%gs
movl $MSR_KGSBASE,%ecx
movl PCB_GSBASE(%r8),%eax
movl PCB_GSBASE+4(%r8),%edx
- wrmsr
+ .globl ld_gsbase
+ld_gsbase: wrmsr
1: .globl ld_es
ld_es: movw TF_ES(%rsp),%es
.globl ld_ds
@@ -798,6 +800,30 @@ gs_load_fault:
call trap
movw $KUG32SEL,TF_GS(%rsp)
jmp doreti
+
+ ALIGN_TEXT
+ .globl fsbase_load_fault
+fsbase_load_fault:
+ movl $T_PROTFLT,TF_TRAPNO(%rsp)
+ movq %rsp, %rdi
+ call trap
+ movq PCPU(CURTHREAD),%r8
+ movq TD_PCB(%r8),%r8
+ movq $0,PCB_FSBASE(%r8)
+ jmp doreti
+
+ ALIGN_TEXT
+ .globl gsbase_load_fault
+gsbase_load_fault:
+ popfq
+ movl $T_PROTFLT,TF_TRAPNO(%rsp)
+ movq %rsp, %rdi
+ call trap
+ movq PCPU(CURTHREAD),%r8
+ movq TD_PCB(%r8),%r8
+ movq $0,PCB_GSBASE(%r8)
+ jmp doreti
+
#ifdef HWPMC_HOOKS
ENTRY(end_exceptions)
#endif
OpenPOWER on IntegriCloud