Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/ia32/ia32_syscall.c
Show First 20 Lines • Show All 201 Lines • ▼ Show 20 Lines | |||||
#include "../../kern/subr_syscall.c" | #include "../../kern/subr_syscall.c" | ||||
void | void | ||||
ia32_syscall(struct trapframe *frame) | ia32_syscall(struct trapframe *frame) | ||||
{ | { | ||||
struct thread *td; | struct thread *td; | ||||
register_t orig_tf_rflags; | register_t orig_tf_rflags; | ||||
int error; | |||||
ksiginfo_t ksi; | ksiginfo_t ksi; | ||||
orig_tf_rflags = frame->tf_rflags; | orig_tf_rflags = frame->tf_rflags; | ||||
td = curthread; | td = curthread; | ||||
td->td_frame = frame; | td->td_frame = frame; | ||||
error = syscallenter(td); | syscallenter(td); | ||||
/* | /* | ||||
* Traced syscall. | * Traced syscall. | ||||
*/ | */ | ||||
if (orig_tf_rflags & PSL_T) { | if (orig_tf_rflags & PSL_T) { | ||||
frame->tf_rflags &= ~PSL_T; | frame->tf_rflags &= ~PSL_T; | ||||
ksiginfo_init_trap(&ksi); | ksiginfo_init_trap(&ksi); | ||||
ksi.ksi_signo = SIGTRAP; | ksi.ksi_signo = SIGTRAP; | ||||
ksi.ksi_code = TRAP_TRACE; | ksi.ksi_code = TRAP_TRACE; | ||||
ksi.ksi_addr = (void *)frame->tf_rip; | ksi.ksi_addr = (void *)frame->tf_rip; | ||||
trapsignal(td, &ksi); | trapsignal(td, &ksi); | ||||
} | } | ||||
syscallret(td, error); | syscallret(td); | ||||
amd64_syscall_ret_flush_l1d(error); | amd64_syscall_ret_flush_l1d(td->td_errno); | ||||
} | } | ||||
static void | static void | ||||
ia32_syscall_enable(void *dummy) | ia32_syscall_enable(void *dummy) | ||||
{ | { | ||||
setidt(IDT_SYSCALL, pti ? &IDTVEC(int0x80_syscall_pti) : | setidt(IDT_SYSCALL, pti ? &IDTVEC(int0x80_syscall_pti) : | ||||
&IDTVEC(int0x80_syscall), SDT_SYSIGT, SEL_UPL, 0); | &IDTVEC(int0x80_syscall), SDT_SYSIGT, SEL_UPL, 0); | ||||
▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines |