- Move the init of %gs and pcb_gs before user_ldt_free().
- Always call load_gs() - Trim comments. This addresses some of the issues raised by BDE.
This commit is contained in:
parent
be0e6bfc0b
commit
e58de9c6bc
@ -853,6 +853,10 @@ exec_setregs(td, entry, stack, ps_strings)
|
||||
struct trapframe *regs = td->td_frame;
|
||||
struct pcb *pcb = td->td_pcb;
|
||||
|
||||
/* Reset pc->pcb_gs and %gs before possibly invalidating it. */
|
||||
pcb->pcb_gs = _udatasel;
|
||||
load_gs(_udatasel);
|
||||
|
||||
if (td->td_proc->p_md.md_ldt)
|
||||
user_ldt_free(td);
|
||||
|
||||
@ -869,19 +873,6 @@ exec_setregs(td, entry, stack, ps_strings)
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
regs->tf_ebx = ps_strings;
|
||||
|
||||
/* reset %gs as well */
|
||||
if (pcb == PCPU_GET(curpcb))
|
||||
load_gs(_udatasel);
|
||||
|
||||
/*
|
||||
* Always reset pcb->pcb_gs to udatasel, it will be loaded into gs
|
||||
* by cpu_switch_load_gs when this process returns from the system
|
||||
* call. Failing to reset pcb_gs here can cause cpu_switch_load_gs
|
||||
* to trigger a general protection fault if the parent process had
|
||||
* modified gs to point at a LDT entry.
|
||||
*/
|
||||
pcb->pcb_gs = _udatasel;
|
||||
|
||||
/*
|
||||
* Reset the hardware debug registers if they were in use.
|
||||
* They won't have any meaning for the newly exec'd process.
|
||||
|
@ -853,6 +853,10 @@ exec_setregs(td, entry, stack, ps_strings)
|
||||
struct trapframe *regs = td->td_frame;
|
||||
struct pcb *pcb = td->td_pcb;
|
||||
|
||||
/* Reset pc->pcb_gs and %gs before possibly invalidating it. */
|
||||
pcb->pcb_gs = _udatasel;
|
||||
load_gs(_udatasel);
|
||||
|
||||
if (td->td_proc->p_md.md_ldt)
|
||||
user_ldt_free(td);
|
||||
|
||||
@ -869,19 +873,6 @@ exec_setregs(td, entry, stack, ps_strings)
|
||||
/* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
|
||||
regs->tf_ebx = ps_strings;
|
||||
|
||||
/* reset %gs as well */
|
||||
if (pcb == PCPU_GET(curpcb))
|
||||
load_gs(_udatasel);
|
||||
|
||||
/*
|
||||
* Always reset pcb->pcb_gs to udatasel, it will be loaded into gs
|
||||
* by cpu_switch_load_gs when this process returns from the system
|
||||
* call. Failing to reset pcb_gs here can cause cpu_switch_load_gs
|
||||
* to trigger a general protection fault if the parent process had
|
||||
* modified gs to point at a LDT entry.
|
||||
*/
|
||||
pcb->pcb_gs = _udatasel;
|
||||
|
||||
/*
|
||||
* Reset the hardware debug registers if they were in use.
|
||||
* They won't have any meaning for the newly exec'd process.
|
||||
|
Loading…
x
Reference in New Issue
Block a user