Adjust the fix in r236953, by not generating the signal manually, but

performing the return to usermode using full return path.  This
consolidates the handling of exceptional situations in less number of
places, and is less code as well.

Reviewed by:   jhb
MFC after:     1 week
This commit is contained in:
kib 2012-06-18 21:08:48 +00:00
parent 545343a302
commit 4eede7506a

View File

@ -977,16 +977,10 @@ amd64_syscall(struct thread *td, int traced)
* If the user-supplied value of %rip is not a canonical
* address, then some CPUs will trigger a ring 0 #GP during
* the sysret instruction. However, the fault handler would
* execute with the user's %gs and %rsp in ring 0 which would
* not be safe. Instead, preemptively kill the thread with a
* SIGBUS.
* execute in ring 0 with the user's %gs and %rsp which would
* not be safe. Instead, use the full return path which
* catches the problem safely.
*/
if (td->td_frame->tf_rip >= VM_MAXUSER_ADDRESS) {
ksiginfo_init_trap(&ksi);
ksi.ksi_signo = SIGBUS;
ksi.ksi_code = BUS_OBJERR;
ksi.ksi_trapno = T_PROTFLT;
ksi.ksi_addr = (void *)td->td_frame->tf_rip;
trapsignal(td, &ksi);
}
if (td->td_frame->tf_rip >= VM_MAXUSER_ADDRESS)
set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
}