From owner-freebsd-mips@FreeBSD.ORG Wed Oct 5 12:06:11 2011 Return-Path: Delivered-To: mips@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A9EA5106566B for ; Wed, 5 Oct 2011 12:06:11 +0000 (UTC) (envelope-from c.jayachandran@gmail.com) Received: from mail-wy0-f182.google.com (mail-wy0-f182.google.com [74.125.82.182]) by mx1.freebsd.org (Postfix) with ESMTP id 1172C8FC08 for ; Wed, 5 Oct 2011 12:06:10 +0000 (UTC) Received: by wyj26 with SMTP id 26so2168238wyj.13 for ; Wed, 05 Oct 2011 05:06:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; bh=gtHDZV875O+XfM1/6UWICRWTH6p8NWR/B/yblG6zlaQ=; b=hlfvdMKx5nub8Q5S2c6qly8f4UdJ6ndria4gM32ZemHNcpHv+HqQFm5SCTOtvMxmA2 b7nCID985UGucaiZFQ16h3E3vbvTTdeaSfz5slBwxengcNF69EX3MObIFZxt/vSE7maZ sc+zZZoJ2udtq8RTQOJKjnSvS90zpTNLlBhXk= MIME-Version: 1.0 Received: by 10.216.14.201 with SMTP id d51mr2921128wed.56.1317814556240; Wed, 05 Oct 2011 04:35:56 -0700 (PDT) Received: by 10.216.29.78 with HTTP; Wed, 5 Oct 2011 04:35:55 -0700 (PDT) In-Reply-To: <20111004215218.GY1511@deviant.kiev.zoral.com.ua> References: <20111004211144.GW1511@deviant.kiev.zoral.com.ua> <20111004215218.GY1511@deviant.kiev.zoral.com.ua> Date: Wed, 5 Oct 2011 17:05:55 +0530 Message-ID: From: "Jayachandran C." To: Kostik Belousov Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: mips@freebsd.org Subject: Re: Mips syscall entry point X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Oct 2011 12:06:11 -0000 On Wed, Oct 5, 2011 at 3:22 AM, Kostik Belousov wrote= : > On Wed, Oct 05, 2011 at 12:11:44AM +0300, Kostik Belousov wrote: >> Hi, >> below is the patch, test-compiled for XLP64 only, which converts the >> only remaining architecture MIPS to the new syscall entry sequence. >> The advantage of the conversion is sharing most of the code with all >> other architectures and avoiding duplication. Also, the implementation >> automatically feels the missed features for the MIPS, see the BUGS > s/feels/fills/, sorry >> section in the ptrace(2). > For the same reason, capsicum shall not work on MIPS. > >> >> I am asking for you help to debug and test the patch. Please keep me >> on Cc:, I am not on the list. >> >> Thank you. >> >> diff --git a/sys/mips/include/proc.h b/sys/mips/include/proc.h >> index 11a1f8e..4c0b0b6 100644 >> --- a/sys/mips/include/proc.h >> +++ b/sys/mips/include/proc.h >> @@ -67,11 +67,22 @@ struct mdproc { >> =A0 =A0 =A0 /* empty */ >> =A0}; >> >> +#ifdef _KERNEL >> =A0struct thread; >> >> =A0void mips_cpu_switch(struct thread *, struct thread *, struct mtx *); >> =A0void mips_cpu_throw(struct thread *, struct thread *); >> >> +struct syscall_args { >> + =A0 =A0 u_int code; >> + =A0 =A0 struct sysent *callp; >> + =A0 =A0 register_t args[8]; >> + =A0 =A0 int narg; >> + =A0 =A0 struct trapframe *trapframe; >> +}; >> +#define =A0 =A0 =A0HAVE_SYSCALL_ARGS_DEF 1 >> +#endif >> + >> =A0#ifdef __mips_n64 >> =A0#define =A0 =A0 =A0KINFO_PROC_SIZE 1088 >> =A0#else >> diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c >> index c800e71..9755c70 100644 >> --- a/sys/mips/mips/trap.c >> +++ b/sys/mips/mips/trap.c >> @@ -261,6 +261,133 @@ static int emulate_unaligned_access(struct trapfra= me *frame, int mode); >> >> =A0extern void fswintrberr(void); /* XXX */ >> >> +int >> +cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) >> +{ >> + =A0 =A0 struct trapframe *locr0 =3D td->td_frame; >> + =A0 =A0 struct sysentvec *se; >> + =A0 =A0 int error, nsaved; >> + >> + =A0 =A0 bzero(sa->args, sizeof(sa->args)); >> + >> + =A0 =A0 /* compute next PC after syscall instruction */ >> + =A0 =A0 td->td_pcb->pcb_tpc =3D sa->trapframe->pc; /* Remember if rest= art */ >> + =A0 =A0 if (DELAYBRANCH(sa->trapframe->cause)) =A0 /* Check BD bit */ >> + =A0 =A0 =A0 =A0 =A0 =A0 locr0->pc =3D MipsEmulateBranch(locr0, sa->tra= pframe->pc, 0, 0); >> + =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 locr0->pc +=3D sizeof(int); >> + =A0 =A0 sa->code =3D locr0->v0; >> + >> + =A0 =A0 switch (sa->code) { >> +#if defined(__mips_n32) || defined(__mips_n64) >> + =A0 =A0 case SYS___syscall: >> + =A0 =A0 =A0 =A0 =A0 =A0 /* >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* Quads fit in a single register in >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* new ABIs. >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX o64? >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> +#endif >> + =A0 =A0 case SYS_syscall: >> + =A0 =A0 =A0 =A0 =A0 =A0 /* >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* Code is first argument, followed by >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* actual args. >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->code =3D locr0->a0; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[0] =3D locr0->a1; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[1] =3D locr0->a2; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[2] =3D locr0->a3; >> + =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 3; >> +#if defined(__mips_n32) || defined(__mips_n64) >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[3] =3D locr0->t4; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[4] =3D locr0->t5; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[5] =3D locr0->t6; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[6] =3D locr0->t7; >> + =A0 =A0 =A0 =A0 =A0 =A0 nsaved +=3D 4; >> +#endif >> + =A0 =A0 =A0 =A0 =A0 =A0 break; >> + >> +#if defined(__mips_o32) >> + =A0 =A0 case SYS___syscall: >> + =A0 =A0 =A0 =A0 =A0 =A0 /* >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* Like syscall, but code is a quad, so as >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* to maintain quad alignment for the rest >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* of the arguments. >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 if (_QUAD_LOWWORD =3D=3D 0) >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sa->code =3D locr0->a0; >> + =A0 =A0 =A0 =A0 =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sa->code =3D locr0->a1; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[0] =3D locr0->a2; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[1] =3D locr0->a3; >> + =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 2; >> + =A0 =A0 =A0 =A0 =A0 =A0 break; >> +#endif >> + >> + =A0 =A0 default: >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[0] =3D locr0->a0; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[1] =3D locr0->a1; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[2] =3D locr0->a2; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[3] =3D locr0->a3; >> + =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 4; >> +#if defined (__mips_n32) || defined(__mips_n64) >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[4] =3D locr0->t4; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[5] =3D locr0->t5; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[6] =3D locr0->t6; >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->args[7] =3D locr0->t7; >> + =A0 =A0 =A0 =A0 =A0 =A0 nsaved +=3D 4; >> +#endif >> + =A0 =A0 =A0 =A0 =A0 =A0 break; >> + =A0 =A0 } >> +#ifdef TRAP_DEBUG >> + =A0 =A0 if (trap_debug) >> + =A0 =A0 =A0 =A0 =A0 =A0 printf("SYSCALL #%d pid:%u\n", code, p->p_pid)= ; >> +#endif >> + >> + =A0 =A0 se =3D td->td_proc->p_sysent; >> + =A0 =A0 if (se->sv_mask) >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->code &=3D se->sv_mask; >> + >> + =A0 =A0 if (sa->code >=3D se->sv_size) >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->callp =3D &se->sv_table[0]; >> + =A0 =A0 else >> + =A0 =A0 =A0 =A0 =A0 =A0 sa->callp =3D &se->sv_table[sa->code]; >> + >> + =A0 =A0 sa->narg =3D sa->callp->sy_narg; >> + >> + =A0 =A0 if (sa->narg > nsaved) { >> +#if defined(__mips_n32) || defined(__mips_n64) >> + =A0 =A0 =A0 =A0 =A0 =A0 /* >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* Is this right for new ABIs? =A0I think th= e 4 there >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* should be 8, size there are 8 registers t= o skip, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0* not 4, but I'm not certain. >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> + =A0 =A0 =A0 =A0 =A0 =A0 printf("SYSCALL #%u pid:%u, nargs > nsaved.\n"= , sa->code, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td->td_proc->p_pid); >> +#endif >> + =A0 =A0 =A0 =A0 =A0 =A0 error =3D copyin((caddr_t)(intptr_t)(locr0->sp= + >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 4 * sizeof(register_t)), (caddr_t)&sa-= >args[nsaved], >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(u_int)(sa->narg - nsaved) * sizeof(reg= ister_t)); >> + =A0 =A0 =A0 =A0 =A0 =A0 if (error !=3D 0) { >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 locr0->v0 =3D error; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 locr0->a3 =3D 1; >> + =A0 =A0 =A0 =A0 =A0 =A0 } >> + =A0 =A0 } else >> + =A0 =A0 =A0 =A0 =A0 =A0 error =3D 0; >> + >> + =A0 =A0 if (error =3D=3D 0) { >> + =A0 =A0 =A0 =A0 =A0 =A0 td->td_retval[0] =3D 0; >> + =A0 =A0 =A0 =A0 =A0 =A0 td->td_retval[1] =3D locr0->v1; >> + =A0 =A0 } >> + >> + =A0 =A0 return (error); >> +} >> + >> +#undef __FBSDID >> +#define __FBSDID(x) >> +#include "../../kern/subr_syscall.c" >> + >> =A0/* >> =A0 * Handle an exception. >> =A0 * Called from MipsKernGenException() or MipsUserGenException() >> @@ -527,155 +654,11 @@ dofault: >> >> =A0 =A0 =A0 case T_SYSCALL + T_USER: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct trapframe *locr0 =3D td= ->td_frame; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct sysent *callp; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 unsigned int code; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 int nargs, nsaved; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 register_t args[8]; >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 bzero(args, sizeof args); >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* note: PCPU_LAZY_INC() can= only be used if we can >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* afford occassional inaccu= racy in the count. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PCPU_LAZY_INC(cnt.v_syscall); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (td->td_ucred !=3D p->p_ucr= ed) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cred_update_th= read(td); >> -#ifdef KSE >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (p->p_flag & P_SA) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 thread_user_en= ter(td); >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* compute next PC after sysca= ll instruction */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td->td_pcb->pcb_tpc =3D trapfr= ame->pc; =A0 =A0/* Remember if restart */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (DELAYBRANCH(trapframe->cau= se)) { =A0 =A0/* Check BD bit */ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 locr0->pc =3D = MipsEmulateBranch(locr0, trapframe->pc, 0, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 0); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 locr0->pc +=3D= sizeof(int); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 code =3D locr0->v0; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 struct syscall_args sa; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 int error; >> >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 switch (code) { >> -#if defined(__mips_n32) || defined(__mips_n64) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case SYS___syscall: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Quads fit= in a single register in >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* new ABIs. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX o64? >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case SYS_syscall: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Code is f= irst argument, followed by >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* actual ar= gs. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 code =3D locr0= ->a0; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[0] =3D lo= cr0->a1; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[1] =3D lo= cr0->a2; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[2] =3D lo= cr0->a3; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 3; >> -#if defined(__mips_n32) || defined(__mips_n64) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[3] =3D lo= cr0->t4; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[4] =3D lo= cr0->t5; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[5] =3D lo= cr0->t6; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[6] =3D lo= cr0->t7; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nsaved +=3D 4; >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> - >> -#if defined(__mips_o32) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case SYS___syscall: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Like sysc= all, but code is a quad, so as >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* to mainta= in quad alignment for the rest >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* of the ar= guments. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (_QUAD_LOWW= ORD =3D=3D 0) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 code =3D locr0->a0; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 code =3D locr0->a1; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[0] =3D lo= cr0->a2; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[1] =3D lo= cr0->a3; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 2; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; >> -#endif >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 default: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[0] =3D lo= cr0->a0; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[1] =3D lo= cr0->a1; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[2] =3D lo= cr0->a2; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[3] =3D lo= cr0->a3; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nsaved =3D 4; >> -#if defined (__mips_n32) || defined(__mips_n64) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[4] =3D lo= cr0->t4; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[5] =3D lo= cr0->t5; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[6] =3D lo= cr0->t6; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 args[7] =3D lo= cr0->t7; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nsaved +=3D 4; >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> -#ifdef TRAP_DEBUG >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (trap_debug) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf("SYSCAL= L #%d pid:%u\n", code, p->p_pid); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> -#endif >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (p->p_sysent->sv_mask) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 code &=3D p->p= _sysent->sv_mask; >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (code >=3D p->p_sysent->sv_= size) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 callp =3D &p->= p_sysent->sv_table[0]; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 callp =3D &p->= p_sysent->sv_table[code]; >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nargs =3D callp->sy_narg; >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (nargs > nsaved) { >> -#if defined(__mips_n32) || defined(__mips_n64) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* XXX >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Is this r= ight for new ABIs? =A0I think the 4 there >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* should be= 8, size there are 8 registers to skip, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* not 4, bu= t I'm not certain. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf("SYSCAL= L #%u pid:%u, nargs > nsaved.\n", code, p->p_pid); >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 i =3D copyin((= caddr_t)(intptr_t)(locr0->sp + >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 4 * si= zeof(register_t)), (caddr_t)&args[nsaved], >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (u_int= )(nargs - nsaved) * sizeof(register_t)); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (i) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 locr0->v0 =3D i; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 locr0->a3 =3D 1; >> -#ifdef KTRACE >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 if (KTRPOINT(td, KTR_SYSCALL)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 =A0 ktrsyscall(code, nargs, args); >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 goto done; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> -#ifdef TRAP_DEBUG >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (trap_debug) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 for (i =3D 0; = i < nargs; i++) { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 printf("args[%d] =3D %#jx\n", i, (intmax_t)args[i]); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> -#endif >> -#ifdef SYSCALL_TRACING >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf("%s(", syscallnames[cod= e]); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 for (i =3D 0; i < nargs; i++) = { >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf("%s%#jx= ", i =3D=3D 0 ? "" : ", ", (intmax_t)args[i]); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 printf(")\n"); >> -#endif >> -#ifdef KTRACE >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (KTRPOINT(td, KTR_SYSCALL)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ktrsyscall(cod= e, nargs, args); >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td->td_retval[0] =3D 0; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td->td_retval[1] =3D locr0->v1= ; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sa.trapframe =3D trapframe; >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 error =3D syscallenter(td, &sa= ); >> >> =A0#if !defined(SMP) && (defined(DDB) || defined(DEBUG)) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (trp =3D=3D trapdebug) >> @@ -683,21 +666,7 @@ dofault: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 trp[-1].code= =3D code; >> =A0#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 STOPEVENT(p, S_SCE, nargs); >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PTRACESTOP_SC(p, td, S_PT_SCE)= ; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 i =3D (*callp->sy_call) (td, a= rgs); >> -#if 0 >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Reinitialize proc pointer= `p' as it may be >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* different if this is a ch= ild returning from fork >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* syscall. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td =3D curthread; >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 locr0 =3D td->td_frame; >> -#endif >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 trapdebug_enter(locr0, -code= ); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 cpu_set_syscall_retval(td, i); >> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* The sync'ing of I & D c= aches for SYS_ptrace() is >> @@ -705,38 +674,7 @@ dofault: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* instead of being done h= ere under a special check >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* for SYS_ptrace(). >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 done: >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* Check for misbehavior. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WITNESS_WARN(WARN_PANIC, NULL,= "System call %s returning", >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (code >=3D 0 && code <= SYS_MAXSYSCALL) ? >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 syscallnames[code] : "= ???"); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 KASSERT(td->td_critnest =3D=3D= 0, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ("System call %s retur= ning in a critical section", >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (code >=3D 0 && code <= SYS_MAXSYSCALL) ? >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 syscallnames[code] : "= ???")); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 KASSERT(td->td_locks =3D=3D 0, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ("System call %s retur= ning with %d locks held", >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (code >=3D 0 && code <= SYS_MAXSYSCALL) ? >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 syscallnames[code] : "= ???", >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 td->td_locks)); >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 userret(td, trapframe); >> -#ifdef KTRACE >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (KTRPOINT(td, KTR_SYSRET)) >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ktrsysret(code= , i, td->td_retval[0]); >> -#endif >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* This works because errno = is findable through the >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* register set. =A0If we ev= er support an emulation >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* where this is not the cas= e, this code will need >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* to be revisited. >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 STOPEVENT(p, S_SCX, code); >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PTRACESTOP_SC(p, td, S_PT_SCX)= ; >> - >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 mtx_assert(&Giant, MA_NOTOWNED= ); >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 syscallret(td, error, &sa); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (trapframe->pc); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 } This gives me a crash when I test it on XLR (32bit compile). The crash does not look obvious - I am looking at it, hope to resolve this soon. JC.