From owner-p4-projects Fri Jun 14 3:43: 0 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F344F37B413; Fri, 14 Jun 2002 03:42:46 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id F1B7537B405 for ; Fri, 14 Jun 2002 03:42:45 -0700 (PDT) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g5EAgj035717 for perforce@freebsd.org; Fri, 14 Jun 2002 03:42:45 -0700 (PDT) (envelope-from julian@freebsd.org) Date: Fri, 14 Jun 2002 03:42:45 -0700 (PDT) Message-Id: <200206141042.g5EAgj035717@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to julian@freebsd.org using -f From: Julian Elischer Subject: PERFORCE change 12911 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://people.freebsd.org/~peter/p4db/chv.cgi?CH=12911 Change 12911 by julian@julian_jules1 on 2002/06/14 03:42:10 Start changing the API a bit. Affected files ... ... //depot/projects/kse/sys/i386/i386/vm_machdep.c#48 edit ... //depot/projects/kse/sys/kern/kern_proc.c#66 edit ... //depot/projects/kse/sys/sys/kse.h#9 edit ... //depot/projects/kse/sys/sys/proc.h#108 edit Differences ... ==== //depot/projects/kse/sys/i386/i386/vm_machdep.c#48 (text+ko) ==== @@ -309,6 +309,7 @@ void cpu_save_upcall(struct thread *td, struct kse *newkse) { + struct trapframe *tf newkse->ke_mdstorage = malloc(sizeof(struct md_store), M_TEMP, M_WAITOK); @@ -318,13 +319,21 @@ &(((struct md_store *)(newkse->ke_mdstorage))->mds_pcb); newkse->ke_frame = &(((struct md_store *)(newkse->ke_mdstorage))->mds_frame); + tf = newkse->ke_frame /* Copy the upcall pcb. Kernel mode & fp regs are here. */ /* XXXKSE this may be un-needed */ bcopy(td->td_pcb, newkse->ke_pcb, sizeof(struct pcb)); /* This copies most of the user mode register values. */ - bcopy(td->td_frame, newkse->ke_frame, sizeof(struct trapframe)); + bzero(newkse->ke_frame, sizeof(struct trapframe)); + tf->tf_edi = 0; + tf->tf_esi = 0; /* trampoline arg */ + tf->tf_ebp = 0; + tf->tf_esp = (int) newkse->ke_stackbase + newkse->ke_stacksize - 16; + tf->tf_ebx = 0; /* trampoline arg */ + tf->tf_eip = (int)newkse->ke_upcall; + /* } void ==== //depot/projects/kse/sys/kern/kern_proc.c#66 (text+ko) ==== @@ -201,6 +201,10 @@ } +/* + * No new KSEG: first call: use current KSE, don't schedule an upcall + * All other situations, do alloate a new KSE and schedule an upcall on it. + */ /* struct kse_new_args { struct kse_mailbox *mbx; int new_grp_flag; @@ -210,8 +214,12 @@ { struct kse *newkse; struct proc *p; + struct kse_mailbox mbx; + int err; p = td->td_proc; + if ((err = copyin(uap->mbx, &mbx, sizeof(mbx)))) + return (err); PROC_LOCK(p); /* * If we have no KSE mode set, just set it, and skip KSE and KSEGRP @@ -219,7 +227,7 @@ * you are effectively getting one. Instead, go directly to saving * the upcall info. */ - if (td->td_proc->p_flag & P_KSES) { + if ((td->td_proc->p_flag & P_KSES) || (uap->new_grp_flag)) { return (EINVAL); /* XXX */ /* @@ -246,20 +254,23 @@ mi_switch(); /* Save current registers to PCB. */ mtx_unlock_spin(&sched_lock); PROC_LOCK(p); + newkse->ke_upcall = mbx.kmbx_upcall; + newkse->ke_stackbase = mbx.kmbx_stackbase; + newkse->ke_stacksize = mbx.kmbx_stacksize; + newkse->ke_mailbox = uap->mbx; cpu_save_upcall(td, newkse); - newkse->ke_mailbox = uap->mbx; PROC_UNLOCK(p); /* Note that we are the returning syscall */ td->td_retval[0] = 1; td->td_retval[1] = 0; - if (td->td_proc->p_flag & P_KSES) { + if ((td->td_proc->p_flag & P_KSES) || (uap->new_grp_flag)) { thread_schedule_upcall(td, newkse); } else { /* - * Don't set this untill we are truely ready, because + * Don't set this until we are truely ready, because * things will start acting differently. Return to the - * upcall code for the first time. Assuming we set up + * calling code for the first time. Assuming we set up * the mailboxes right, all syscalls after this will be * asynchronous. */ ==== //depot/projects/kse/sys/sys/kse.h#9 (text+ko) ==== @@ -38,7 +38,8 @@ * the userland and the kernel when running a KSE-based threading system. * The only programs that should see this file are the UTS and the kernel. */ - +struct kse_mailbox; +typedef void kse_fn_t(struct kse_mailbox *mbx) /* * Each userland thread has one of these buried in it's * Thread control structure somewhere. @@ -58,10 +59,13 @@ */ struct kse_mailbox { - struct thread_mailbox *current_thread; - struct thread_mailbox *completed_threads; - unsigned int flags; - void *UTS_handle; /* The UTS can use this for anything */ + kse_fn_t *kmbx_upcall; + caddr_t kmbx_stackbase; + unsigned long int kmbx_stacksize; + struct thread_mailbox *kmbx_current_thread; + struct thread_mailbox *kmbx_completed_threads; + unsigned int kmbx_flags; + void *kmbx_UTS_handle; /* UTS can use this for anything */ }; #define KEMBXF_CRITICAL 0x00000001 ==== //depot/projects/kse/sys/sys/proc.h#108 (text+ko) ==== @@ -368,6 +368,9 @@ u_char ke_dummy; /* */ #define ke_endcopy ke_mdstorage + void *ke_upcall; + void *ke_stackbase; + u_long *ke_stacksize; void *ke_mdstorage; /* where we store the pcb and frame */ struct pcb *ke_pcb; /* the pcb saved for the upcalls */ struct trapframe *ke_frame; /* the upcall trapframe */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message