Lines Matching +full:ia32 +full:- +full:3 +full:a

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
19 * 3. All advertising materials mentioning features or use of this software
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
83 #include <compat/ia32/ia32_signal.h>
127 p = td->td_proc; in ia32_fetch_syscall_args()
128 frame = td->td_frame; in ia32_fetch_syscall_args()
129 sa = &td->td_sa; in ia32_fetch_syscall_args()
132 if (__predict_false(frame->tf_cs == 7 && frame->tf_rip == 2)) { in ia32_fetch_syscall_args()
135 * frame to what it would be for a direct int 0x80 instead in ia32_fetch_syscall_args()
138 error = fueword32((void *)frame->tf_rsp, &eip); in ia32_fetch_syscall_args()
139 if (error == -1) in ia32_fetch_syscall_args()
141 cs = fuword16((void *)(frame->tf_rsp + sizeof(u_int32_t))); in ia32_fetch_syscall_args()
142 if (cs == -1) in ia32_fetch_syscall_args()
146 * Unwind in-kernel frame after all stack frame pieces in ia32_fetch_syscall_args()
149 frame->tf_rip = eip; in ia32_fetch_syscall_args()
150 frame->tf_cs = cs; in ia32_fetch_syscall_args()
151 frame->tf_rsp += 2 * sizeof(u_int32_t); in ia32_fetch_syscall_args()
152 frame->tf_err = 7; /* size of lcall $7,$0 */ in ia32_fetch_syscall_args()
156 params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t); in ia32_fetch_syscall_args()
157 sa->code = frame->tf_rax; in ia32_fetch_syscall_args()
158 sa->original_code = sa->code; in ia32_fetch_syscall_args()
161 * Need to check if this is a 32 bit or 64 bit syscall. in ia32_fetch_syscall_args()
163 if (sa->code == SYS_syscall) { in ia32_fetch_syscall_args()
168 if (error == -1) in ia32_fetch_syscall_args()
170 sa->code = tmp; in ia32_fetch_syscall_args()
172 } else if (sa->code == SYS___syscall) { in ia32_fetch_syscall_args()
174 * Like syscall, but code is a quad, so as to maintain in ia32_fetch_syscall_args()
176 * We use a 32-bit fetch in case params is not in ia32_fetch_syscall_args()
180 if (error == -1) in ia32_fetch_syscall_args()
182 sa->code = tmp; in ia32_fetch_syscall_args()
185 if (sa->code >= p->p_sysent->sv_size) in ia32_fetch_syscall_args()
186 sa->callp = &nosys_sysent; in ia32_fetch_syscall_args()
188 sa->callp = &p->p_sysent->sv_table[sa->code]; in ia32_fetch_syscall_args()
190 if (params != NULL && sa->callp->sy_narg != 0) in ia32_fetch_syscall_args()
192 (u_int)(sa->callp->sy_narg * sizeof(int))); in ia32_fetch_syscall_args()
196 for (i = 0; i < sa->callp->sy_narg; i++) in ia32_fetch_syscall_args()
197 sa->args[i] = args[i]; in ia32_fetch_syscall_args()
200 td->td_retval[0] = 0; in ia32_fetch_syscall_args()
201 td->td_retval[1] = frame->tf_rdx; in ia32_fetch_syscall_args()
218 orig_tf_rflags = frame->tf_rflags; in ia32_syscall()
220 td->td_frame = frame; in ia32_syscall()
228 frame->tf_rflags &= ~PSL_T; in ia32_syscall()
232 ksi.ksi_addr = (void *)frame->tf_rip; in ia32_syscall()
237 amd64_syscall_ret_flush_l1d(td->td_errno); in ia32_syscall()
271 lcall_addr = PROC_PS_STRINGS(curproc) - in setup_lcall_gate()
272 (_binary_elf_vdso32_so_1_end - _binary_elf_vdso32_so_1_start) + in setup_lcall_gate()