PERFORCE change 28118 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 4 18:03:23 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=28118
Change 28118 by peter at peter_daintree on 2003/04/04 18:03:01
no dbregs, ldt, kse
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/vm_machdep.c#10 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/vm_machdep.c#10 (text+ko) ====
@@ -99,22 +99,8 @@
register_t savecrit;
p1 = td1->td_proc;
- if ((flags & RFPROC) == 0) {
- if ((flags & RFMEM) == 0) {
- /* unshare user LDT */
- struct mdproc *mdp1 = &p1->p_md;
- struct proc_ldt *pldt = mdp1->md_ldt;
- if (pldt && pldt->ldt_refcnt > 1) {
- pldt = user_ldt_alloc(mdp1, pldt->ldt_len);
- if (pldt == NULL)
- panic("could not copy LDT");
- mdp1->md_ldt = pldt;
- set_user_ldt(mdp1);
- user_ldt_free(td1);
- }
- }
+ if ((flags & RFPROC) == 0)
return;
- }
/* Ensure that p1's pcb is up to date. */
if (td1 == curthread)
@@ -164,7 +150,6 @@
pcb2->pcb_eip = (int)fork_trampoline;
pcb2->pcb_psl = td2->td_frame->tf_eflags & ~PSL_I; /* ints disabled */
/*-
- * pcb2->pcb_dr*: cloned above.
* pcb2->pcb_savefpu: cloned above.
* pcb2->pcb_flags: cloned above.
* pcb2->pcb_onfault: cloned above (always NULL here?).
@@ -177,20 +162,6 @@
*/
pcb2->pcb_ext = 0;
- /* Copy the LDT, if necessary. */
- mtx_lock_spin(&sched_lock);
- if (mdp2->md_ldt != 0) {
- if (flags & RFMEM) {
- mdp2->md_ldt->ldt_refcnt++;
- } else {
- mdp2->md_ldt = user_ldt_alloc(mdp2,
- mdp2->md_ldt->ldt_len);
- if (mdp2->md_ldt == NULL)
- panic("could not copy LDT");
- }
- }
- mtx_unlock_spin(&sched_lock);
-
/*
* Now, cpu_switch() can schedule the new process.
* pcb_esp is loaded pointing to the cpu_switch() stack frame
@@ -228,9 +199,6 @@
struct mdproc *mdp;
mdp = &td->td_proc->p_md;
- if (mdp->md_ldt)
- user_ldt_free(td);
- reset_dbregs();
}
void
@@ -239,34 +207,11 @@
struct pcb *pcb = td->td_pcb;
npxexit(td);
- if (pcb->pcb_flags & PCB_DBREGS) {
- /*
- * disable all hardware breakpoints
- */
- reset_dbregs();
- pcb->pcb_flags &= ~PCB_DBREGS;
- }
}
void
cpu_thread_clean(struct thread *td)
{
- struct pcb *pcb;
-
- pcb = td->td_pcb;
- if (pcb->pcb_ext != 0) {
- /* XXXKSE XXXSMP not SMP SAFE.. what locks do we have? */
- /* if (pcb->pcb_ext->ext_refcount-- == 1) ?? */
- /*
- * XXX do we need to move the TSS off the allocated pages
- * before freeing them? (not done here)
- */
- mtx_lock(&Giant);
- kmem_free(kernel_map, (vm_offset_t)pcb->pcb_ext,
- ctob(IOPAGES + 1));
- mtx_unlock(&Giant);
- pcb->pcb_ext = 0;
- }
}
void
@@ -294,59 +239,6 @@
void
cpu_set_upcall(struct thread *td, void *pcb)
{
- struct pcb *pcb2;
-
- /* Point the pcb to the top of the stack. */
- pcb2 = td->td_pcb;
-
- /*
- * Copy the upcall pcb. This loads kernel regs.
- * Those not loaded individually below get their default
- * values here.
- *
- * XXXKSE It might be a good idea to simply skip this as
- * the values of the other registers may be unimportant.
- * This would remove any requirement for knowing the KSE
- * at this time (see the matching comment below for
- * more analysis) (need a good safe default).
- */
- bcopy(pcb, pcb2, sizeof(*pcb2));
-
- /*
- * Create a new fresh stack for the new thread.
- * Don't forget to set this stack value into whatever supplies
- * the address for the fault handlers.
- * The contexts are filled in at the time we actually DO the
- * upcall as only then do we know which KSE we got.
- */
- td->td_frame = (struct trapframe *)pcb2 - 1;
-
- /*
- * Set registers for trampoline to user mode. Leave space for the
- * return address on stack. These are the kernel mode register values.
- */
-#ifdef PAE
- pcb2->pcb_cr3 = vtophys(vmspace_pmap(td->td_proc->p_vmspace)->pm_pdpt);
-#else
- pcb2->pcb_cr3 = vtophys(vmspace_pmap(td->td_proc->p_vmspace)->pm_pdir);
-#endif
- pcb2->pcb_edi = 0;
- pcb2->pcb_esi = (int)fork_return; /* trampoline arg */
- pcb2->pcb_ebp = 0;
- pcb2->pcb_esp = (int)td->td_frame - sizeof(void *); /* trampoline arg */
- pcb2->pcb_ebx = (int)td; /* trampoline arg */
- pcb2->pcb_eip = (int)fork_trampoline;
- pcb2->pcb_psl &= ~(PSL_I); /* interrupts must be disabled */
- /*
- * If we didn't copy the pcb, we'd need to do the following registers:
- * pcb2->pcb_dr*: cloned above.
- * pcb2->pcb_savefpu: cloned above.
- * pcb2->pcb_flags: cloned above.
- * pcb2->pcb_onfault: cloned above (always NULL here?).
- * pcb2->pcb_gs: cloned above. XXXKSE ???
- * pcb2->pcb_ext: cleared below.
- */
- pcb2->pcb_ext = NULL;
}
/*
@@ -357,30 +249,6 @@
void
cpu_set_upcall_kse(struct thread *td, struct kse_upcall *ku)
{
-
- /*
- * Do any extra cleaning that needs to be done.
- * The thread may have optional components
- * that are not present in a fresh thread.
- * This may be a recycled thread so make it look
- * as though it's newly allocated.
- */
- cpu_thread_clean(td);
-
- /*
- * Set the trap frame to point at the beginning of the uts
- * function.
- */
- td->td_frame->tf_esp =
- (int)ku->ku_stack.ss_sp + ku->ku_stack.ss_size;
- td->td_frame->tf_eip = (int)ku->ku_func;
-
- /*
- * Pass the address of the mailbox for this kse to the uts
- * function as a parameter on the stack.
- */
- suword((void *)(td->td_frame->tf_esp + sizeof(void *)),
- (int)ku->ku_mailbox);
}
void
More information about the p4-projects
mailing list