Annotation of sys/arch/powerpc/powerpc/process_machdep.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: process_machdep.c,v 1.12 2007/03/20 20:59:53 kettenis Exp $ */
! 2: /* $NetBSD: process_machdep.c,v 1.1 1996/09/30 16:34:53 ws Exp $ */
! 3:
! 4: /*
! 5: * Copyright (C) 1995, 1996 Wolfgang Solfrank.
! 6: * Copyright (C) 1995, 1996 TooLs GmbH.
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. All advertising materials mentioning features or use of this software
! 18: * must display the following acknowledgement:
! 19: * This product includes software developed by TooLs GmbH.
! 20: * 4. The name of TooLs GmbH may not be used to endorse or promote products
! 21: * derived from this software without specific prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
! 24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 26: * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
! 27: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! 28: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
! 29: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 30: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 31: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! 32: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 33: */
! 34: #include <sys/param.h>
! 35: #include <sys/systm.h>
! 36: #include <sys/proc.h>
! 37: #include <sys/ptrace.h>
! 38: #include <sys/user.h>
! 39:
! 40: #include <machine/fpu.h>
! 41: #include <machine/pcb.h>
! 42: #include <machine/psl.h>
! 43: #include <machine/reg.h>
! 44:
! 45: int
! 46: process_read_regs(struct proc *p, struct reg *regs)
! 47: {
! 48: struct cpu_info *ci = curcpu();
! 49: struct trapframe *tf = trapframe(p);
! 50: struct pcb *pcb = &p->p_addr->u_pcb;
! 51:
! 52: bcopy(tf->fixreg, regs->gpr, sizeof(regs->gpr));
! 53:
! 54: if (!(pcb->pcb_flags & PCB_FPU)) {
! 55: bzero(regs->fpr, sizeof(regs->fpr));
! 56: } else {
! 57: /* XXX What if the state is on the other cpu? */
! 58: if (p == ci->ci_fpuproc)
! 59: save_fpu();
! 60: bcopy(pcb->pcb_fpu.fpr, regs->fpr, sizeof(regs->fpr));
! 61: }
! 62:
! 63: regs->pc = tf->srr0;
! 64: regs->ps = tf->srr1; /* is this the correct value for this ? */
! 65: regs->cnd = tf->cr;
! 66: regs->lr = tf->lr;
! 67: regs->cnt = tf->ctr;
! 68: regs->xer = tf->xer;
! 69: regs->mq = 0; /* what should this really be? */
! 70:
! 71: return (0);
! 72: }
! 73:
! 74: int
! 75: process_read_fpregs(struct proc *p, struct fpreg *regs)
! 76: {
! 77: struct cpu_info *ci = curcpu();
! 78: struct pcb *pcb = &p->p_addr->u_pcb;
! 79:
! 80: if (!(pcb->pcb_flags & PCB_FPU)) {
! 81: bzero(regs->fpr, sizeof(regs->fpr));
! 82: regs->fpscr = 0;
! 83: } else {
! 84: /* XXX What if the state is on the other cpu? */
! 85: if (p == ci->ci_fpuproc)
! 86: save_fpu();
! 87: bcopy(pcb->pcb_fpu.fpr, regs->fpr, sizeof(regs->fpr));
! 88: regs->fpscr = *(u_int64_t *)&pcb->pcb_fpu.fpcsr;
! 89: }
! 90:
! 91: return (0);
! 92: }
! 93:
! 94: #ifdef PTRACE
! 95:
! 96: /*
! 97: * Set the process's program counter.
! 98: */
! 99: int
! 100: process_set_pc(struct proc *p, caddr_t addr)
! 101: {
! 102: struct trapframe *tf = trapframe(p);
! 103:
! 104: tf->srr0 = (u_int32_t)addr;
! 105: return 0;
! 106: }
! 107:
! 108: int
! 109: process_sstep(struct proc *p, int sstep)
! 110: {
! 111: struct trapframe *tf = trapframe(p);
! 112:
! 113: if (sstep)
! 114: tf->srr1 |= PSL_SE;
! 115: else
! 116: tf->srr1 &= ~PSL_SE;
! 117: return 0;
! 118: }
! 119:
! 120: int
! 121: process_write_regs(struct proc *p, struct reg *regs)
! 122: {
! 123: struct cpu_info *ci = curcpu();
! 124: struct trapframe *tf = trapframe(p);
! 125: struct pcb *pcb = &p->p_addr->u_pcb;
! 126:
! 127: bcopy(regs->gpr, tf->fixreg, sizeof(regs->gpr));
! 128:
! 129: /* XXX What if the state is on the other cpu? */
! 130: if (p == ci->ci_fpuproc) { /* release the fpu */
! 131: save_fpu();
! 132: ci->ci_fpuproc = NULL;
! 133: }
! 134:
! 135: bcopy(regs->fpr, pcb->pcb_fpu.fpr, sizeof(regs->fpr));
! 136: if (!(pcb->pcb_flags & PCB_FPU)) {
! 137: pcb->pcb_fpu.fpcsr = 0;
! 138: pcb->pcb_flags |= PCB_FPU;
! 139: }
! 140:
! 141: tf->srr0 = regs->pc;
! 142: tf->srr1 = regs->ps; /* is this the correct value for this ? */
! 143: tf->cr = regs->cnd;
! 144: tf->lr = regs->lr;
! 145: tf->ctr = regs->cnt;
! 146: tf->xer = regs->xer;
! 147: /* regs->mq = 0; what should this really be? */
! 148:
! 149: return (0);
! 150: }
! 151:
! 152: int
! 153: process_write_fpregs(struct proc *p, struct fpreg *regs)
! 154: {
! 155: struct cpu_info *ci = curcpu();
! 156: struct pcb *pcb = &p->p_addr->u_pcb;
! 157: u_int64_t fpscr = regs->fpscr;
! 158:
! 159: /* XXX What if the state is on the other cpu? */
! 160: if (p == ci->ci_fpuproc) { /* release the fpu */
! 161: save_fpu();
! 162: ci->ci_fpuproc = NULL;
! 163: }
! 164:
! 165: bcopy(regs->fpr, pcb->pcb_fpu.fpr, sizeof(regs->fpr));
! 166: pcb->pcb_fpu.fpcsr = *(double *)&fpscr;
! 167: pcb->pcb_flags |= PCB_FPU;
! 168:
! 169: return (0);
! 170: }
! 171:
! 172: #endif /* PTRACE */
CVSweb