From 077a0fb8b68fb3e586f9856c34c915627df0e9ae Mon Sep 17 00:00:00 2001 From: Peter Grehan Date: Fri, 9 Jul 2004 11:00:41 +0000 Subject: [PATCH] - correctly set the return value for the copyin/out fault buffer to 1 so setfault would return correctly when a page fault was invalid (e.g. a syscall with a bad parameter). This caused an endless DSI loop, seen when running sendmail which does a setlogin() call with a NULL pointer. - introduce KTR_SYSC tracing. expose the syscallnames[] array to make the tracing more readable. --- sys/powerpc/aim/trap.c | 12 ++++++++++-- sys/powerpc/powerpc/trap.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index 742003ca9ba4..2738c5737df1 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -97,9 +97,7 @@ int setfault(faultbuf); /* defined in locore.S */ int badaddr(void *, size_t); int badaddr_read(void *, size_t, int *); -#ifdef WITNESS extern char *syscallnames[]; -#endif struct powerpc_exception { u_int vector; @@ -321,6 +319,7 @@ handle_onfault(struct trapframe *frame) frame->srr0 = (*fb)[0]; frame->fixreg[1] = (*fb)[1]; frame->fixreg[2] = (*fb)[2]; + frame->fixreg[3] = 1; frame->cr = (*fb)[3]; bcopy(&(*fb)[4], &frame->fixreg[13], 19 * sizeof(register_t)); @@ -396,6 +395,12 @@ syscall(struct trapframe *frame) } else error = 0; + CTR5(KTR_SYSC, "syscall: p=%s %s(%x %x %x)", p->p_comm, + syscallnames[code], + frame->fixreg[FIRSTARG], + frame->fixreg[FIRSTARG+1], + frame->fixreg[FIRSTARG+2]); + #ifdef KTRACE if (KTRPOINT(td, KTR_SYSCALL)) ktrsyscall(code, narg, (register_t *)params); @@ -413,6 +418,9 @@ syscall(struct trapframe *frame) STOPEVENT(p, S_SCE, narg); error = (*callp->sy_call)(td, params); + + CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", p->p_comm, + syscallnames[code], td->td_retval[0]); } switch (error) { case 0: diff --git a/sys/powerpc/powerpc/trap.c b/sys/powerpc/powerpc/trap.c index 742003ca9ba4..2738c5737df1 100644 --- a/sys/powerpc/powerpc/trap.c +++ b/sys/powerpc/powerpc/trap.c @@ -97,9 +97,7 @@ int setfault(faultbuf); /* defined in locore.S */ int badaddr(void *, size_t); int badaddr_read(void *, size_t, int *); -#ifdef WITNESS extern char *syscallnames[]; -#endif struct powerpc_exception { u_int vector; @@ -321,6 +319,7 @@ handle_onfault(struct trapframe *frame) frame->srr0 = (*fb)[0]; frame->fixreg[1] = (*fb)[1]; frame->fixreg[2] = (*fb)[2]; + frame->fixreg[3] = 1; frame->cr = (*fb)[3]; bcopy(&(*fb)[4], &frame->fixreg[13], 19 * sizeof(register_t)); @@ -396,6 +395,12 @@ syscall(struct trapframe *frame) } else error = 0; + CTR5(KTR_SYSC, "syscall: p=%s %s(%x %x %x)", p->p_comm, + syscallnames[code], + frame->fixreg[FIRSTARG], + frame->fixreg[FIRSTARG+1], + frame->fixreg[FIRSTARG+2]); + #ifdef KTRACE if (KTRPOINT(td, KTR_SYSCALL)) ktrsyscall(code, narg, (register_t *)params); @@ -413,6 +418,9 @@ syscall(struct trapframe *frame) STOPEVENT(p, S_SCE, narg); error = (*callp->sy_call)(td, params); + + CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", p->p_comm, + syscallnames[code], td->td_retval[0]); } switch (error) { case 0: