* syscall - system call request C handler. A system call is * essentially treated as a trap by reusing the frame layout. */
| 1106 | * essentially treated as a trap by reusing the frame layout. |
| 1107 | */ |
| 1108 | void |
| 1109 | syscall(struct trapframe *frame) |
| 1110 | { |
| 1111 | struct thread *td; |
| 1112 | register_t orig_tf_eflags; |
| 1113 | ksiginfo_t ksi; |
| 1114 | |
| 1115 | #ifdef DIAGNOSTIC |
| 1116 | if (!(TRAPF_USERMODE(frame) && |
| 1117 | (curpcb->pcb_flags & PCB_VM86CALL) == 0)) { |
| 1118 | panic("syscall"); |
| 1119 | /* NOT REACHED */ |
| 1120 | } |
| 1121 | #endif |
| 1122 | orig_tf_eflags = frame->tf_eflags; |
| 1123 | |
| 1124 | td = curthread; |
| 1125 | td->td_frame = frame; |
| 1126 | |
| 1127 | syscallenter(td); |
| 1128 | |
| 1129 | /* |
| 1130 | * Traced syscall. |
| 1131 | */ |
| 1132 | if ((orig_tf_eflags & PSL_T) && !(orig_tf_eflags & PSL_VM)) { |
| 1133 | frame->tf_eflags &= ~PSL_T; |
| 1134 | ksiginfo_init_trap(&ksi); |
| 1135 | ksi.ksi_signo = SIGTRAP; |
| 1136 | ksi.ksi_code = TRAP_TRACE; |
| 1137 | ksi.ksi_addr = (void *)frame->tf_eip; |
| 1138 | trapsignal(td, &ksi); |
| 1139 | } |
| 1140 | |
| 1141 | KASSERT(PCB_USER_FPU(td->td_pcb), |
| 1142 | ("System call %s returning with kernel FPU ctx leaked", |
| 1143 | syscallname(td->td_proc, td->td_sa.code))); |
| 1144 | KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td), |
| 1145 | ("System call %s returning with mangled pcb_save", |
| 1146 | syscallname(td->td_proc, td->td_sa.code))); |
| 1147 | |
| 1148 | syscallret(td); |
| 1149 | } |
no test coverage detected