svn commit: r211795 - in projects/arm_eabi/sys/arm: arm include
Andrew Turner
andrew at FreeBSD.org
Wed Aug 25 06:42:47 UTC 2010
Author: andrew
Date: Wed Aug 25 06:42:47 2010
New Revision: 211795
URL: http://svn.freebsd.org/changeset/base/211795
Log:
Update how syscalls are handled to use syscallenter and syscallret
Modified:
projects/arm_eabi/sys/arm/arm/elf_machdep.c
projects/arm_eabi/sys/arm/arm/trap.c
projects/arm_eabi/sys/arm/include/proc.h
Modified: projects/arm_eabi/sys/arm/arm/elf_machdep.c
==============================================================================
--- projects/arm_eabi/sys/arm/arm/elf_machdep.c Wed Aug 25 03:14:32 2010 (r211794)
+++ projects/arm_eabi/sys/arm/arm/elf_machdep.c Wed Aug 25 06:42:47 2010 (r211795)
@@ -76,7 +76,7 @@ struct sysentvec elf32_freebsd_sysvec =
.sv_maxssiz = NULL,
.sv_flags = SV_ABI_FREEBSD | SV_ILP32,
.sv_set_syscall_retval = cpu_set_syscall_retval,
- .sv_fetch_syscall_args = NULL, /* XXXKIB */
+ .sv_fetch_syscall_args = cpu_fetch_syscall_args,
.sv_syscallnames = syscallnames,
};
Modified: projects/arm_eabi/sys/arm/arm/trap.c
==============================================================================
--- projects/arm_eabi/sys/arm/arm/trap.c Wed Aug 25 03:14:32 2010 (r211794)
+++ projects/arm_eabi/sys/arm/arm/trap.c Wed Aug 25 06:42:47 2010 (r211795)
@@ -861,98 +861,76 @@ badaddr_read(void *addr, size_t size, vo
return (rv);
}
-#define MAXARGS 8
+int
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+{
+ struct proc *p;
+ struct trapframe *frame;
+ u_int nap;
+ register_t *ap;
+ uint32_t insn;
+ int error;
+
+ p = td->td_proc;
+ frame = td->td_frame;
+ insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE);
+ sa->code = insn & 0x000fffff;
+
+ ap = &frame->tf_r0;
+ nap = 4;
+ if (sa->code == SYS_syscall) {
+ sa->code = *ap++;
+ nap--;
+ } else if (sa->code == SYS___syscall) {
+ sa->code = ap[_QUAD_LOWWORD];
+ nap -= 2;
+ ap += 2;
+ }
+ if (p->p_sysent->sv_mask)
+ sa->code &= p->p_sysent->sv_mask;
+
+ if (sa->code >= p->p_sysent->sv_size)
+ sa->callp = &p->p_sysent->sv_table[0];
+ else
+ sa->callp = &p->p_sysent->sv_table[sa->code];
+
+ sa->narg = sa->callp->sy_narg;
+ KASSERT(sa->narg <= sizeof(sa->args) / sizeof(sa->args[0]),
+ ("Too many syscall arguments!"));
+ error = 0;
+ memcpy(sa->args, ap, nap * sizeof(register_t));
+ if (sa->narg > nap) {
+ error = copyin((void *)frame->tf_usr_sp, sa->args + nap,
+ (sa->narg - nap) * sizeof(register_t));
+ }
+ if (error == 0) {
+ td->td_retval[0] = 0;
+ td->td_retval[1] = 0;
+ }
+
+ return (error);
+}
+
static void
syscall(struct thread *td, trapframe_t *frame, u_int32_t insn)
{
- struct proc *p = td->td_proc;
- int code, error;
- u_int nap, nargs;
- register_t *ap, *args, copyargs[MAXARGS];
- struct sysent *callp;
+ struct syscall_args sa;
+ int error;
- PCPU_INC(cnt.v_syscall);
- td->td_pticks = 0;
- if (td->td_ucred != td->td_proc->p_ucred)
- cred_update_thread(td);
switch (insn & SWI_OS_MASK) {
case 0: /* XXX: we need our own one. */
- nap = 4;
break;
default:
call_trapsignal(td, SIGILL, 0);
userret(td, frame);
return;
}
- code = insn & 0x000fffff;
- td->td_pticks = 0;
- ap = &frame->tf_r0;
- if (code == SYS_syscall) {
- code = *ap++;
-
- nap--;
- } else if (code == SYS___syscall) {
- code = ap[_QUAD_LOWWORD];
- nap -= 2;
- ap += 2;
- }
- if (p->p_sysent->sv_mask)
- code &= p->p_sysent->sv_mask;
- if (code >= p->p_sysent->sv_size)
- callp = &p->p_sysent->sv_table[0];
- else
- callp = &p->p_sysent->sv_table[code];
- nargs = callp->sy_narg;
- memcpy(copyargs, ap, nap * sizeof(register_t));
- if (nargs > nap) {
- error = copyin((void *)frame->tf_usr_sp, copyargs + nap,
- (nargs - nap) * sizeof(register_t));
- if (error)
- goto bad;
- }
- args = copyargs;
- error = 0;
-#ifdef KTRACE
- if (KTRPOINT(td, KTR_SYSCALL))
- ktrsyscall(code, nargs, args);
-#endif
-
- CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td,
- td->td_proc->p_pid, td->td_name, code);
- if (error == 0) {
- td->td_retval[0] = 0;
- td->td_retval[1] = 0;
- STOPEVENT(p, S_SCE, callp->sy_narg);
- PTRACESTOP_SC(p, td, S_PT_SCE);
- AUDIT_SYSCALL_ENTER(code, td);
- error = (*callp->sy_call)(td, args);
- AUDIT_SYSCALL_EXIT(error, td);
- KASSERT(td->td_ar == NULL,
- ("returning from syscall with td_ar set!"));
- }
-bad:
- cpu_set_syscall_retval(td, error);
-
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
- KASSERT(td->td_critnest == 0,
- ("System call %s returning in a critical section",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
- KASSERT(td->td_locks == 0,
- ("System call %s returning with %d locks held",
- (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
- td->td_locks));
-
- userret(td, frame);
- CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
- td->td_proc->p_pid, td->td_name, code);
-
- STOPEVENT(p, S_SCX, code);
- PTRACESTOP_SC(p, td, S_PT_SCX);
-#ifdef KTRACE
- if (KTRPOINT(td, KTR_SYSRET))
- ktrsysret(code, error, td->td_retval[0]);
-#endif
+
+ error = syscallenter(td, &sa);
+
+ KASSERT(td->td_ar == NULL, ("returning from syscall with td_ar set!"));
+
+ syscallret(td, error, &sa);
}
void
Modified: projects/arm_eabi/sys/arm/include/proc.h
==============================================================================
--- projects/arm_eabi/sys/arm/include/proc.h Wed Aug 25 03:14:32 2010 (r211794)
+++ projects/arm_eabi/sys/arm/include/proc.h Wed Aug 25 06:42:47 2010 (r211795)
@@ -60,6 +60,21 @@ struct mdproc {
void *md_sigtramp;
};
+#ifdef __ARM_EABI__
+#define KINFO_PROC_SIZE 816
+#else
#define KINFO_PROC_SIZE 792
+#endif
+
+#ifdef _KERNEL
+struct syscall_args {
+ u_int code;
+ struct sysent *callp;
+ register_t args[8];
+ int narg;
+};
+#define HAVE_SYSCALL_ARGS_DEF 1
+
+#endif
#endif /* !_MACHINE_PROC_H_ */
More information about the svn-src-projects
mailing list