From owner-p4-projects Mon Jun 3 14:42:25 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9A3B437B401; Mon, 3 Jun 2002 14:42:09 -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 7CABC37B409 for ; Mon, 3 Jun 2002 14:42:08 -0700 (PDT) Received: (from perforce@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g53Lg8q52366 for perforce@freebsd.org; Mon, 3 Jun 2002 14:42:08 -0700 (PDT) (envelope-from julian@freebsd.org) Date: Mon, 3 Jun 2002 14:42:08 -0700 (PDT) Message-Id: <200206032142.g53Lg8q52366@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: perforce set sender to julian@freebsd.org using -f From: Julian Elischer Subject: PERFORCE change 12336 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=12336 Change 12336 by julian@julian_ref on 2002/06/03 14:41:50 Additions to Alpha support from: Bernd Walter Affected files ... ... //depot/projects/kse/sys/alpha/alpha/vm_machdep.c#23 edit Differences ... ==== //depot/projects/kse/sys/alpha/alpha/vm_machdep.c#23 (text+ko) ==== @@ -242,23 +242,26 @@ void cpu_exit(struct thread *td) { - /* KSEXXX */ + alpha_fpstate_drop(td); } void cpu_thread_exit(struct thread *td) { - /* KSEXXX */ + + return; } void cpu_thread_setup(struct thread *td) { - /* KSEXXX */ + + td->td_pcb = + (struct pcb *)(td->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; + td->td_frame = (struct trapframe *)((caddr_t)td->td_pcb) - 1; } -/* KSEXXX */ struct md_store { struct pcb mds_pcb; struct trapframe mds_frame; @@ -267,13 +270,72 @@ void cpu_save_upcall(struct thread *td, struct kse *newkse) { - /* KSEXXX */ + + newkse->ke_mdstorage = malloc(sizeof(struct md_store), M_TEMP, + M_WAITOK); + /* Note: use of M_WAITOK means it won't fail. */ + /* set up shortcuts in MI section */ + newkse->ke_pcb = + &(((struct md_store *)(newkse->ke_mdstorage))->mds_pcb); + newkse->ke_frame = + &(((struct md_store *)(newkse->ke_mdstorage))->mds_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)); } void cpu_set_upcall(struct thread *td, void *pcb) { - /* KSEXXX */ + struct pcb *pcb2; + + td->td_flags |= TDF_UPCALLING; + + /* 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 *)((caddr_t)pcb2) - 1; + + /* + * Arrange for continuation at fork_return(), which + * will return to exception_return(). Note that the child + * process doesn't stay in the kernel for long! + */ + pcb2->pcb_hw.apcb_ksp = (u_int64_t)td->td_frame; + pcb2->pcb_context[0] = (u_int64_t)fork_return; /* s0: a0 */ + pcb2->pcb_context[1] = (u_int64_t)exception_return; /* s1: ra */ + pcb2->pcb_context[2] = (u_long)td; /* s2: a1 */ + pcb2->pcb_context[7] = (u_int64_t)fork_trampoline; /* ra: magic*/ +#ifdef SMP + /* + * We start off at a nesting level of 1 within the kernel. + */ + td->td_md.md_kernnest = 1; +#endif } /* @@ -284,19 +346,46 @@ void cpu_set_retval(struct thread *td, int retval, int aux, int success) { - /* KSEXXX */ + struct trapframe *frame; + + frame = td->td_frame; + frame->tf_regs[FRAME_V0] = (u_int64_t)retval; + frame->tf_regs[FRAME_A3] = (success) ? 0 : ~0; + frame->tf_regs[FRAME_A4] = (u_int64_t)aux; } void cpu_free_kse_mdstorage(struct kse *kse) { - /* KSEXXX */ + + free(kse->ke_mdstorage, M_TEMP); + kse->ke_mdstorage = NULL; + kse->ke_pcb = NULL; + kse->ke_frame = NULL; } int cpu_export_context(struct thread *td) { - /* KSEXXX */ + /* XXXKSE */ +#if 0 + struct trapframe *frame; + struct thread_mailbox *tm; + struct trapframe *uframe; + int error; + + frame = td->td_frame; + tm = td->td_mailbox; + uframe = &tm->ctx.tfrm.tf_tf; + error = copyout(frame, uframe, sizeof(*frame)); + /* + * "What about the fp regs?" I hear you ask.... XXXKSE + * Don't know where gs and "onstack" come from. + * May need to fiddle a few other values too. + */ + return (error); +#endif + return (0); } void To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message