- 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:
Matthew N. Dodd 2002-09-22 01:32:48 +00:00
parent be0e6bfc0b
commit e58de9c6bc
2 changed files with 8 additions and 26 deletions

View File

@ -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.

View File

@ -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.