void
ia32_syscall(struct trapframe *frame)
{
	struct thread *td;
	struct syscall_args sa;
	register_t orig_tf_rflags;
	int error;
	ksiginfo_t ksi;

	orig_tf_rflags = frame->tf_rflags;
	td = curthread;
	td->td_frame = frame;

	error = syscallenter(td, &sa);

	/*
	 * Traced syscall.
	 */
	if (orig_tf_rflags & PSL_T) {
		frame->tf_rflags &= ~PSL_T;
		ksiginfo_init_trap(&ksi);
		ksi.ksi_signo = SIGTRAP;
		ksi.ksi_code = TRAP_TRACE;
		ksi.ksi_addr = (void *)frame->tf_rip;
		trapsignal(td, &ksi);
	}

	syscallret(td, error, &sa);
}
Exemple #2
0
static void
syscall(struct thread *td, struct trapframe *frame)
{
	int error;

	td->td_sa.nap = 4;

	error = syscallenter(td);
	KASSERT(error != 0 || td->td_ar == NULL,
	    ("returning from syscall with td_ar set!"));
	syscallret(td, error);
}
Exemple #3
0
void
syscall(struct trapframe *frame)
{
	struct thread *td;
	struct syscall_args sa;
	int error;

	td = curthread;
	td->td_frame = frame;

	error = syscallenter(td, &sa);
	syscallret(td, error, &sa);
}
Exemple #4
0
static void
syscall(struct thread *td, trapframe_t *frame)
{
	struct syscall_args sa;
	int error;

#ifndef __ARM_EABI__
	sa.insn = *(uint32_t *)(frame->tf_pc - INSN_SIZE);
	switch (sa.insn & SWI_OS_MASK) {
	case 0: /* XXX: we need our own one. */
		break;
	default:
		call_trapsignal(td, SIGILL, 0);
		userret(td, frame);
		return;
	}
#endif
	sa.nap = 4;

	error = syscallenter(td, &sa);
	KASSERT(error != 0 || td->td_ar == NULL,
	    ("returning from syscall with td_ar set!"));
	syscallret(td, error, &sa);
}