Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Oct 2011 17:05:55 +0530
From:      "Jayachandran C." <c.jayachandran@gmail.com>
To:        Kostik Belousov <kostikbel@gmail.com>
Cc:        mips@freebsd.org
Subject:   Re: Mips syscall entry point
Message-ID:  <CA%2B7sy7BfMgyw5E%2BP6QzcH02Fn4eMNiD%2B__d0Ji8Fjq9rXBg5Lg@mail.gmail.com>
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>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Oct 5, 2011 at 3:22 AM, Kostik Belousov <kostikbel@gmail.com> 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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2B7sy7BfMgyw5E%2BP6QzcH02Fn4eMNiD%2B__d0Ji8Fjq9rXBg5Lg>