summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-12-19 09:36:59 +0000
committerkib <kib@FreeBSD.org>2014-12-19 09:36:59 +0000
commit492a1d38b56fd9795afa90eb289407c047cd6000 (patch)
tree5f73c9103f4a4a929bffffc74cc6417c69e4c4d2
parentbf071386224cba73f4bec31a49ad96bc73e96677 (diff)
downloadFreeBSD-src-492a1d38b56fd9795afa90eb289407c047cd6000.zip
FreeBSD-src-492a1d38b56fd9795afa90eb289407c047cd6000.tar.gz
MFC r275833:
The iret instruction may generate #np and #ss fault, besides #gp. When returning to usermode, the handler for that exceptions is also executed with wrong gs base. Handle all three possible faults in the same way, checking for iret fault, and performing full iret.
-rw-r--r--sys/amd64/amd64/exception.S9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S
index 25b89d8..49d61f6 100644
--- a/sys/amd64/amd64/exception.S
+++ b/sys/amd64/amd64/exception.S
@@ -154,9 +154,13 @@ IDTVEC(xmm)
IDTVEC(tss)
TRAP_ERR(T_TSSFLT)
IDTVEC(missing)
- TRAP_ERR(T_SEGNPFLT)
+ subq $TF_ERR,%rsp
+ movl $T_SEGNPFLT,TF_TRAPNO(%rsp)
+ jmp prot_addrf
IDTVEC(stk)
- TRAP_ERR(T_STKFLT)
+ subq $TF_ERR,%rsp
+ movl $T_STKFLT,TF_TRAPNO(%rsp)
+ jmp prot_addrf
IDTVEC(align)
TRAP_ERR(T_ALIGNFLT)
@@ -319,6 +323,7 @@ IDTVEC(page)
IDTVEC(prot)
subq $TF_ERR,%rsp
movl $T_PROTFLT,TF_TRAPNO(%rsp)
+prot_addrf:
movq $0,TF_ADDR(%rsp)
movq %rdi,TF_RDI(%rsp) /* free up a GP register */
leaq doreti_iret(%rip),%rdi
OpenPOWER on IntegriCloud