Annotation of sys/arch/powerpc/powerpc/process_machdep.c, Revision 1.1.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