1/* $NetBSD: process_machdep.c,v 1.5 2018/05/18 20:10:25 reinoud Exp $ */ 2 3/*- 4 * Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 30/* from sys/arch/amd64/amd64/process_machdep.c */ 31/* 32 * This file may seem a bit stylized, but that so that it's easier to port. 33 * Functions to be implemented here are: 34 * 35 * process_read_regs(proc, regs) 36 * Get the current user-visible register set from the process 37 * and copy it into the regs structure (<machine/reg.h>). 38 * The process is stopped at the time read_regs is called. 39 * 40 * process_write_regs(proc, regs) 41 * Update the current register set from the passed in regs 42 * structure. Take care to avoid clobbering special CPU 43 * registers or privileged bits in the PSL. 44 * The process is stopped at the time write_regs is called. 45 * 46 * process_read_fpregs(proc, regs, sz) 47 * Get the current user-visible register set from the process 48 * and copy it into the regs structure (<machine/reg.h>). 49 * The process is stopped at the time read_fpregs is called. 50 * 51 * process_write_fpregs(proc, regs, sz) 52 * Update the current register set from the passed in regs 53 * structure. Take care to avoid clobbering special CPU 54 * registers or privileged bits in the PSL. 55 * The process is stopped at the time write_fpregs is called. 56 * 57 * process_read_dbregs(proc, regs, sz) 58 * Get the current user-visible register set from the process 59 * and copy it into the regs structure (<machine/reg.h>). 60 * The process is stopped at the time read_dbregs is called. 61 * 62 * process_write_dbregs(proc, regs, sz) 63 * Update the current register set from the passed in regs 64 * structure. Take care to avoid clobbering special CPU 65 * registers or privileged bits in the PSL. 66 * The process is stopped at the time write_dbregs is called. 67 * 68 * process_sstep(proc) 69 * Arrange for the process to trap after executing a single instruction. 70 * 71 * process_set_pc(proc) 72 * Set the process's program counter. 73 */ 74 75#include <sys/cdefs.h> 76__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.5 2018/05/18 20:10:25 reinoud Exp $"); 77 78#include <sys/types.h> 79#include <sys/param.h> 80#include <sys/ptrace.h> 81 82#include <sys/ucontext.h> 83#include <machine/pcb.h> 84#include <sys/lwp.h> 85 86#include <machine/thunk.h> 87 88int 89process_read_regs(struct lwp *l, struct reg *regs) 90{ 91 struct pcb *pcb = lwp_getpcb(l); 92 ucontext_t *ucp; 93 register_t *reg; 94 95 ucp = &pcb->pcb_userret_ucp; 96 reg = (register_t *) &ucp->uc_mcontext.__gregs; 97 98 memcpy(regs, reg, sizeof(__gregset_t)); 99 100 return 0; 101} 102 103int 104process_read_fpregs(struct lwp *l, struct fpreg *regs, size_t *sz) 105{ 106 struct pcb *pcb = lwp_getpcb(l); 107 ucontext_t *ucp; 108 register_t *reg; 109 110 ucp = &pcb->pcb_userret_ucp; 111 reg = (register_t *) &ucp->uc_mcontext.__fpregs; 112 113 *sz = sizeof(__fpregset_t); 114 memcpy(regs, reg, *sz); 115 116 return 0; 117} 118 119int 120process_write_regs(struct lwp *l, const struct reg *regs) 121{ 122thunk_printf("%s called, not implemented\n", __func__); 123 return 0; 124} 125 126int 127process_write_fpregs(struct lwp *l, const struct fpreg *regs, size_t sz) 128{ 129thunk_printf("%s called, not implemented\n", __func__); 130 return 0; 131} 132 133int 134process_sstep(struct lwp *l, int sstep) 135{ 136thunk_printf("%s called, not implemented\n", __func__); 137 return 0; 138} 139 140int 141process_set_pc(struct lwp *l, void *addr) 142{ 143thunk_printf("%s called, not implemented\n", __func__); 144 return 0; 145} 146 147int 148process_write_dbregs(struct lwp *l, const struct dbreg *regs, size_t sz) 149{ 150thunk_printf("%s called, not implemented\n", __func__); 151 return 0; 152} 153 154int 155process_read_dbregs(struct lwp *l, struct dbreg *regs, size_t *sz) 156{ 157thunk_printf("%s called, not implemented\n", __func__); 158 return 0; 159} 160 161