53 lines
1.6 KiB
Diff
53 lines
1.6 KiB
Diff
Index: sys/amd64/amd64/exception.S
|
|
===================================================================
|
|
--- sys/amd64/amd64/exception.S (revision 286969)
|
|
+++ sys/amd64/amd64/exception.S (working copy)
|
|
@@ -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
|
|
Index: sys/amd64/amd64/machdep.c
|
|
===================================================================
|
|
--- sys/amd64/amd64/machdep.c (revision 286969)
|
|
+++ sys/amd64/amd64/machdep.c (working copy)
|
|
@@ -428,6 +428,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *
|
|
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
|
regs->tf_cs = _ucodesel;
|
|
regs->tf_ds = _udatasel;
|
|
+ regs->tf_ss = _udatasel;
|
|
regs->tf_es = _udatasel;
|
|
regs->tf_fs = _ufssel;
|
|
regs->tf_gs = _ugssel;
|
|
Index: sys/amd64/amd64/trap.c
|
|
===================================================================
|
|
--- sys/amd64/amd64/trap.c (revision 286969)
|
|
+++ sys/amd64/amd64/trap.c (working copy)
|
|
@@ -473,8 +473,6 @@ trap(struct trapframe *frame)
|
|
goto out;
|
|
|
|
case T_STKFLT: /* stack fault */
|
|
- break;
|
|
-
|
|
case T_PROTFLT: /* general protection fault */
|
|
case T_SEGNPFLT: /* segment not present fault */
|
|
if (td->td_intr_nesting_level != 0)
|