diff options
author | kib <kib@FreeBSD.org> | 2010-04-10 18:38:11 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-04-10 18:38:11 +0000 |
commit | 76d6c015c73ed644251aad688c3238ce1aa2fedc (patch) | |
tree | 9f0987be21050fb44668e41a253c8773dc3b9d51 /sys/amd64/amd64/exception.S | |
parent | a98b1eb99d6bf1fe47d49c33fcdcab7c8709ed7c (diff) | |
download | FreeBSD-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.S | 30 |
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 |