proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[dragonfly.git] / sys / i386 / i386 / machdep.c
index 7b5444d..c96a536 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)machdep.c     7.4 (Berkeley) 6/3/91
  * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $
- * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.8 2003/06/21 07:54:55 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.12 2003/06/25 03:55:53 dillon Exp $
  */
 
 #include "apm.h"
@@ -720,6 +720,8 @@ sendsig(catcher, sig, mask, code)
 }
 
 /*
+ * osigreturn_args(struct osigcontext *sigcntxp)
+ *
  * System call to cleanup state after a signal
  * has been taken.  Reset signal mask and
  * stack state from context left by sendsig (above).
@@ -732,14 +734,11 @@ sendsig(catcher, sig, mask, code)
 #define        CS_SECURE(cs)           (ISPL(cs) == SEL_UPL)
 
 int
-osigreturn(p, uap)
-       struct proc *p;
-       struct osigreturn_args /* {
-               struct osigcontext *sigcntxp;
-       } */ *uap;
+osigreturn(struct osigreturn_args *uap)
 {
-       register struct osigcontext *scp;
-       register struct trapframe *regs = p->p_md.md_regs;
+       struct proc *p = curproc;
+       struct osigcontext *scp;
+       struct trapframe *regs = p->p_md.md_regs;
        int eflags;
 
        scp = uap->sigcntxp;
@@ -837,13 +836,13 @@ osigreturn(p, uap)
        return(EJUSTRETURN);
 }
 
+/*
+ * sigreturn(ucontext_t *sigcntxp)
+ */
 int
-sigreturn(p, uap)
-       struct proc *p;
-       struct sigreturn_args /* {
-               ucontext_t *sigcntxp;
-       } */ *uap;
+sigreturn(struct sigreturn_args *uap)
 {
+       struct proc *p = curproc;
        struct trapframe *regs;
        ucontext_t *ucp;
        int cs, eflags;
@@ -853,7 +852,7 @@ sigreturn(p, uap)
        if (!useracc((caddr_t)ucp, sizeof(struct osigcontext), VM_PROT_READ))
                return (EFAULT);
        if (((struct osigcontext *)ucp)->sc_trapno == 0x01d516)
-               return (osigreturn(p, (struct osigreturn_args *)uap));
+               return (osigreturn((struct osigreturn_args *)uap));
 
        /*
         * Since ucp is not an osigcontext but a ucontext_t, we have to
@@ -1865,15 +1864,15 @@ init386(first)
        /*
         * Prevent lowering of the ipl if we call tsleep() early.
         */
-       safepri = cpl;
+       gd = &CPU_prvspace[0].globaldata;
 
-       thread0.td_kstack = (void *)proc0paddr;
+       lwkt_init_thread(&thread0, proc0paddr);
+       gd->gd_curthread = &thread0;
+       safepri = thread0.td_cpl = SWI_MASK | HWI_MASK;
+       thread0.td_switch = cpu_heavy_switch;   /* YYY eventually LWKT */
        proc0.p_addr = (void *)thread0.td_kstack;
        proc0.p_thread = &thread0;
        thread0.td_proc = &proc0;
-       thread0.td_pcb = (struct pcb *)
-           ((char *)proc0paddr + UPAGES*PAGE_SIZE - sizeof(struct pcb));
-       thread0.td_kstack = (char *)proc0paddr;
        thread0.td_flags = TDF_RUNNING;
 
        atdevbase = ISA_HOLE_START + KERNBASE;
@@ -1912,7 +1911,6 @@ init386(first)
        gdt_segs[GPRIV_SEL].ssd_limit = atop(0 - 1);
        gdt_segs[GPROC0_SEL].ssd_base = (int) &common_tss;
 #endif
-       gd = &CPU_prvspace[0].globaldata;
        gd->gd_prvspace = &CPU_prvspace[0];
        /*
         * Note: on both UP and SMP curthread must be set non-NULL
@@ -2073,7 +2071,6 @@ init386(first)
        thread0.td_pcb->pcb_mpnest = 1;
 #endif
        thread0.td_pcb->pcb_ext = 0;
-       thread0.td_switch = cpu_heavy_switch;   /* YYY eventually LWKT */
        proc0.p_md.md_regs = &proc0_tf;
 }
 
@@ -2086,20 +2083,15 @@ void
 cpu_gdinit(struct globaldata *gd, int cpu)
 {
        char *sp;
-       struct pcb *pcb;
 
-       if (cpu == 0)
-           gd->gd_curthread = &thread0;
-       else
+       TAILQ_INIT(&gd->gd_tdfreeq);    /* for pmap_{new,dispose}_thread() */
+       if (cpu)
            gd->gd_curthread = &gd->gd_idlethread;
        sp = gd->gd_prvspace->idlestack;
-       gd->gd_idlethread.td_kstack = sp;
-       pcb = (struct pcb *)(sp + sizeof(gd->gd_prvspace->idlestack)) - 1;
-       gd->gd_idlethread.td_pcb = pcb;
-       gd->gd_idlethread.td_sp = (char *)pcb - 16 - sizeof(void *);
+       lwkt_init_thread(&gd->gd_idlethread, sp);
        gd->gd_idlethread.td_switch = cpu_lwkt_switch;
+       gd->gd_idlethread.td_sp -= sizeof(void *);
        *(void **)gd->gd_idlethread.td_sp = cpu_idle_restore;
-       TAILQ_INIT(&gd->gd_tdfreeq);    /* for pmap_{new,dispose}_thread() */
 }
 
 #if defined(I586_CPU) && !defined(NO_F00F_HACK)
@@ -2441,7 +2433,7 @@ set_dbregs(p, dbregs)
                 * from within kernel mode?
                 */
                
-               if (suser(p) != 0) {
+               if (suser_cred(p->p_ucred, 0) != 0) {
                        if (dbregs->dr7 & 0x3) {
                                /* dr0 is enabled */
                                if (dbregs->dr0 >= VM_MAXUSER_ADDRESS)