Lines Matching +full:reg +full:- +full:addr

1 /*-
52 #include <x86/reg.h>
68 td->td_frame->tf_rsp = stack; in linux_set_upcall()
74 td->td_frame->tf_rax = 0; in linux_set_upcall()
85 if (args->level > 3) in linux_iopl()
89 if ((error = securelevel_gt(td->td_ucred, 0)) != 0) in linux_iopl()
91 td->td_frame->tf_rflags = (td->td_frame->tf_rflags & ~PSL_IOPL) | in linux_iopl()
92 (args->level * (PSL_IOPL / 3)); in linux_iopl()
100 struct proc *p = td->td_proc; in linux_pause()
106 sigmask = td->td_sigmask; in linux_pause()
118 pcb = td->td_pcb; in linux_arch_prctl()
119 LINUX_CTR2(arch_prctl, "0x%x, %p", args->code, args->addr); in linux_arch_prctl()
121 switch (args->code) { in linux_arch_prctl()
123 if (args->addr < VM_MAXUSER_ADDRESS) { in linux_arch_prctl()
125 pcb->pcb_gsbase = args->addr; in linux_arch_prctl()
126 td->td_frame->tf_gs = _ugssel; in linux_arch_prctl()
132 if (args->addr < VM_MAXUSER_ADDRESS) { in linux_arch_prctl()
134 pcb->pcb_fsbase = args->addr; in linux_arch_prctl()
135 td->td_frame->tf_fs = _ufssel; in linux_arch_prctl()
141 error = copyout(&pcb->pcb_fsbase, PTRIN(args->addr), in linux_arch_prctl()
142 sizeof(args->addr)); in linux_arch_prctl()
145 error = copyout(&pcb->pcb_gsbase, PTRIN(args->addr), in linux_arch_prctl()
146 sizeof(args->addr)); in linux_arch_prctl()
150 error = copyout(&cet, PTRIN(args->addr), sizeof(cet)); in linux_arch_prctl()
153 linux_msg(td, "unsupported arch_prctl code %#x", args->code); in linux_arch_prctl()
167 pcb = td->td_pcb; in linux_set_cloned_tls()
169 pcb->pcb_fsbase = (register_t)desc; in linux_set_cloned_tls()
170 td->td_frame->tf_fs = _ufssel; in linux_set_cloned_tls()
221 bsd_to_linux_regset(const struct reg *b_reg, struct linux_pt_regset *l_regset) in bsd_to_linux_regset()
224 l_regset->r15 = b_reg->r_r15; in bsd_to_linux_regset()
225 l_regset->r14 = b_reg->r_r14; in bsd_to_linux_regset()
226 l_regset->r13 = b_reg->r_r13; in bsd_to_linux_regset()
227 l_regset->r12 = b_reg->r_r12; in bsd_to_linux_regset()
228 l_regset->rbp = b_reg->r_rbp; in bsd_to_linux_regset()
229 l_regset->rbx = b_reg->r_rbx; in bsd_to_linux_regset()
230 l_regset->r11 = b_reg->r_r11; in bsd_to_linux_regset()
231 l_regset->r10 = b_reg->r_r10; in bsd_to_linux_regset()
232 l_regset->r9 = b_reg->r_r9; in bsd_to_linux_regset()
233 l_regset->r8 = b_reg->r_r8; in bsd_to_linux_regset()
234 l_regset->rax = b_reg->r_rax; in bsd_to_linux_regset()
235 l_regset->rcx = b_reg->r_rcx; in bsd_to_linux_regset()
236 l_regset->rdx = b_reg->r_rdx; in bsd_to_linux_regset()
237 l_regset->rsi = b_reg->r_rsi; in bsd_to_linux_regset()
238 l_regset->rdi = b_reg->r_rdi; in bsd_to_linux_regset()
239 l_regset->orig_rax = b_reg->r_rax; in bsd_to_linux_regset()
240 l_regset->rip = b_reg->r_rip; in bsd_to_linux_regset()
241 l_regset->cs = b_reg->r_cs; in bsd_to_linux_regset()
242 l_regset->eflags = b_reg->r_rflags; in bsd_to_linux_regset()
243 l_regset->rsp = b_reg->r_rsp; in bsd_to_linux_regset()
244 l_regset->ss = b_reg->r_ss; in bsd_to_linux_regset()
245 l_regset->fs_base = 0; in bsd_to_linux_regset()
246 l_regset->gs_base = 0; in bsd_to_linux_regset()
247 l_regset->ds = b_reg->r_ds; in bsd_to_linux_regset()
248 l_regset->es = b_reg->r_es; in bsd_to_linux_regset()
249 l_regset->fs = b_reg->r_fs; in bsd_to_linux_regset()
250 l_regset->gs = b_reg->r_gs; in bsd_to_linux_regset()
254 linux_to_bsd_regset(struct reg *b_reg, const struct linux_pt_regset *l_regset) in linux_to_bsd_regset()
257 b_reg->r_r15 = l_regset->r15; in linux_to_bsd_regset()
258 b_reg->r_r14 = l_regset->r14; in linux_to_bsd_regset()
259 b_reg->r_r13 = l_regset->r13; in linux_to_bsd_regset()
260 b_reg->r_r12 = l_regset->r12; in linux_to_bsd_regset()
261 b_reg->r_rbp = l_regset->rbp; in linux_to_bsd_regset()
262 b_reg->r_rbx = l_regset->rbx; in linux_to_bsd_regset()
263 b_reg->r_r11 = l_regset->r11; in linux_to_bsd_regset()
264 b_reg->r_r10 = l_regset->r10; in linux_to_bsd_regset()
265 b_reg->r_r9 = l_regset->r9; in linux_to_bsd_regset()
266 b_reg->r_r8 = l_regset->r8; in linux_to_bsd_regset()
267 b_reg->r_rax = l_regset->rax; in linux_to_bsd_regset()
268 b_reg->r_rcx = l_regset->rcx; in linux_to_bsd_regset()
269 b_reg->r_rdx = l_regset->rdx; in linux_to_bsd_regset()
270 b_reg->r_rsi = l_regset->rsi; in linux_to_bsd_regset()
271 b_reg->r_rdi = l_regset->rdi; in linux_to_bsd_regset()
272 b_reg->r_rax = l_regset->orig_rax; in linux_to_bsd_regset()
273 b_reg->r_rip = l_regset->rip; in linux_to_bsd_regset()
274 b_reg->r_cs = l_regset->cs; in linux_to_bsd_regset()
275 b_reg->r_rflags = l_regset->eflags; in linux_to_bsd_regset()
276 b_reg->r_rsp = l_regset->rsp; in linux_to_bsd_regset()
277 b_reg->r_ss = l_regset->ss; in linux_to_bsd_regset()
278 b_reg->r_ds = l_regset->ds; in linux_to_bsd_regset()
279 b_reg->r_es = l_regset->es; in linux_to_bsd_regset()
280 b_reg->r_fs = l_regset->fs; in linux_to_bsd_regset()
281 b_reg->r_gs = l_regset->gs; in linux_to_bsd_regset()
285 linux_ptrace_get_syscall_info_machdep(const struct reg *reg, in linux_ptrace_get_syscall_info_machdep() argument
289 si->arch = LINUX_ARCH_AMD64; in linux_ptrace_get_syscall_info_machdep()
290 si->instruction_pointer = reg->r_rip; in linux_ptrace_get_syscall_info_machdep()
291 si->stack_pointer = reg->r_rsp; in linux_ptrace_get_syscall_info_machdep()
302 pcb = td->td_pcb; in linux_ptrace_getregs_machdep()
306 l_regset->fs_base = pcb->pcb_fsbase; in linux_ptrace_getregs_machdep()
307 l_regset->gs_base = pcb->pcb_gsbase; in linux_ptrace_getregs_machdep()
316 * In Linux, the syscall number - passed to the syscall in linux_ptrace_getregs_machdep()
317 * as rax - is preserved in orig_rax; rax gets overwritten in linux_ptrace_getregs_machdep()
320 l_regset->orig_rax = lwpinfo.pl_syscall_code; in linux_ptrace_getregs_machdep()
329 linux_ptrace_peekuser(struct thread *td, pid_t pid, void *addr, void *data) in linux_ptrace_peekuser() argument
331 struct linux_pt_regset reg; in linux_ptrace_peekuser() local
332 struct reg b_reg; in linux_ptrace_peekuser()
336 if ((uintptr_t)addr & (sizeof(data) -1) || (uintptr_t)addr < 0) in linux_ptrace_peekuser()
338 if ((uintptr_t)addr >= sizeof(struct linux_pt_regset)) { in linux_ptrace_peekuser()
340 "not implemented; returning EINVAL", (uintptr_t)addr); in linux_ptrace_peekuser()
344 if (LINUX_URO(addr, fs_base)) in linux_ptrace_peekuser()
346 if (LINUX_URO(addr, gs_base)) in linux_ptrace_peekuser()
350 bsd_to_linux_regset(&b_reg, &reg); in linux_ptrace_peekuser()
351 val = *(&reg.r15 + ((uintptr_t)addr / sizeof(reg.r15))); in linux_ptrace_peekuser()
363 uintptr_t reg; member
369 .reg = offsetof(struct linux_pt_regset, gs),
373 .reg = offsetof(struct linux_pt_regset, fs),
377 .reg = offsetof(struct linux_pt_regset, ds),
381 .reg = offsetof(struct linux_pt_regset, es),
385 .reg = offsetof(struct linux_pt_regset, cs),
389 .reg = offsetof(struct linux_pt_regset, ss),
395 linux_ptrace_pokeuser(struct thread *td, pid_t pid, void *addr, void *data) in linux_ptrace_pokeuser() argument
397 struct linux_pt_regset reg; in linux_ptrace_pokeuser() local
398 struct reg b_reg, b_reg1; in linux_ptrace_pokeuser()
401 if ((uintptr_t)addr & (sizeof(data) -1) || (uintptr_t)addr < 0) in linux_ptrace_pokeuser()
403 if ((uintptr_t)addr >= sizeof(struct linux_pt_regset)) { in linux_ptrace_pokeuser()
405 "not implemented; returning EINVAL", (uintptr_t)addr); in linux_ptrace_pokeuser()
409 if (LINUX_URO(addr, fs_base)) in linux_ptrace_pokeuser()
411 if (LINUX_URO(addr, gs_base)) in linux_ptrace_pokeuser()
414 if ((uintptr_t)addr == linux_segregs_off[i].reg) { in linux_ptrace_pokeuser()
423 bsd_to_linux_regset(&b_reg, &reg); in linux_ptrace_pokeuser()
424 *(&reg.r15 + ((uintptr_t)addr / sizeof(reg.r15))) = (uint64_t)data; in linux_ptrace_pokeuser()
425 linux_to_bsd_regset(&b_reg1, &reg); in linux_ptrace_pokeuser()