xref: /openbsd/sys/arch/hppa/hppa/process_machdep.c (revision e27aa0a3)
1*e27aa0a3Skettenis /*	$OpenBSD: process_machdep.c,v 1.21 2012/08/29 18:58:45 kettenis Exp $	*/
24247ce11Smickey 
34247ce11Smickey /*
4fef2e65fSmickey  * Copyright (c) 1999-2004 Michael Shalayeff
54247ce11Smickey  * All rights reserved.
64247ce11Smickey  *
74247ce11Smickey  * Redistribution and use in source and binary forms, with or without
84247ce11Smickey  * modification, are permitted provided that the following conditions
94247ce11Smickey  * are met:
104247ce11Smickey  * 1. Redistributions of source code must retain the above copyright
114247ce11Smickey  *    notice, this list of conditions and the following disclaimer.
124247ce11Smickey  * 2. Redistributions in binary form must reproduce the above copyright
134247ce11Smickey  *    notice, this list of conditions and the following disclaimer in the
144247ce11Smickey  *    documentation and/or other materials provided with the distribution.
154247ce11Smickey  *
164247ce11Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
174247ce11Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
184247ce11Smickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19fef2e65fSmickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20fef2e65fSmickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21fef2e65fSmickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22fef2e65fSmickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23fef2e65fSmickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24fef2e65fSmickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25fef2e65fSmickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26fef2e65fSmickey  * THE POSSIBILITY OF SUCH DAMAGE.
274247ce11Smickey  */
284247ce11Smickey 
29975db92eSmickey #include <sys/param.h>
304247ce11Smickey #include <sys/systm.h>
31975db92eSmickey #include <sys/proc.h>
32975db92eSmickey #include <sys/ptrace.h>
336ed51ea5Smickey #include <sys/user.h>
34975db92eSmickey 
35975755daSmickey #include <machine/cpufunc.h>
3641f648c2Sjsing #include <machine/fpu.h>
375c8bcbfaSkettenis #include <machine/frame.h>
38975755daSmickey 
39975db92eSmickey int
process_read_regs(struct proc * p,struct reg * regs)40ae9924d2Sjsing process_read_regs(struct proc *p, struct reg *regs)
41975db92eSmickey {
427673df72Smickey 	struct trapframe *tf = p->p_md.md_regs;
437673df72Smickey 
44*e27aa0a3Skettenis 	regs->r_regs[ 0] = tf->tf_ipsw;
457673df72Smickey 	regs->r_regs[ 1] = tf->tf_r1;
467673df72Smickey 	regs->r_regs[ 2] = tf->tf_rp;
477673df72Smickey 	regs->r_regs[ 3] = tf->tf_r3;
487673df72Smickey 	regs->r_regs[ 4] = tf->tf_r4;
497673df72Smickey 	regs->r_regs[ 5] = tf->tf_r5;
507673df72Smickey 	regs->r_regs[ 6] = tf->tf_r6;
517673df72Smickey 	regs->r_regs[ 7] = tf->tf_r7;
527673df72Smickey 	regs->r_regs[ 8] = tf->tf_r8;
537673df72Smickey 	regs->r_regs[ 9] = tf->tf_r9;
547673df72Smickey 	regs->r_regs[10] = tf->tf_r10;
557673df72Smickey 	regs->r_regs[11] = tf->tf_r11;
567673df72Smickey 	regs->r_regs[12] = tf->tf_r12;
577673df72Smickey 	regs->r_regs[13] = tf->tf_r13;
587673df72Smickey 	regs->r_regs[14] = tf->tf_r14;
597673df72Smickey 	regs->r_regs[15] = tf->tf_r15;
607673df72Smickey 	regs->r_regs[16] = tf->tf_r16;
617673df72Smickey 	regs->r_regs[17] = tf->tf_r17;
627673df72Smickey 	regs->r_regs[18] = tf->tf_r18;
637673df72Smickey 	regs->r_regs[19] = tf->tf_t4;
647673df72Smickey 	regs->r_regs[20] = tf->tf_t3;
657673df72Smickey 	regs->r_regs[21] = tf->tf_t2;
667673df72Smickey 	regs->r_regs[22] = tf->tf_t1;
677673df72Smickey 	regs->r_regs[23] = tf->tf_arg3;
687673df72Smickey 	regs->r_regs[24] = tf->tf_arg2;
697673df72Smickey 	regs->r_regs[25] = tf->tf_arg1;
707673df72Smickey 	regs->r_regs[26] = tf->tf_arg0;
717673df72Smickey 	regs->r_regs[27] = tf->tf_dp;
727673df72Smickey 	regs->r_regs[28] = tf->tf_ret0;
737673df72Smickey 	regs->r_regs[29] = tf->tf_ret1;
747673df72Smickey 	regs->r_regs[30] = tf->tf_sp;
757673df72Smickey 	regs->r_regs[31] = tf->tf_r31;
76*e27aa0a3Skettenis 
77*e27aa0a3Skettenis 	regs->r_sar	 = tf->tf_sar;
78*e27aa0a3Skettenis 
79*e27aa0a3Skettenis 	regs->r_pcsqh	 = tf->tf_iisq_head;
80*e27aa0a3Skettenis 	regs->r_pcsqt	 = tf->tf_iisq_tail;
81*e27aa0a3Skettenis 	regs->r_pcoqh	 = tf->tf_iioq_head;
82*e27aa0a3Skettenis 	regs->r_pcoqt	 = tf->tf_iioq_tail;
83*e27aa0a3Skettenis 
84*e27aa0a3Skettenis 	regs->r_sr0	 = tf->tf_sr0;
85*e27aa0a3Skettenis 	regs->r_sr1	 = tf->tf_sr1;
86*e27aa0a3Skettenis 	regs->r_sr2	 = tf->tf_sr2;
87*e27aa0a3Skettenis 	regs->r_sr3	 = tf->tf_sr3;
88*e27aa0a3Skettenis 	regs->r_sr4	 = tf->tf_sr4;
89*e27aa0a3Skettenis 	regs->r_sr5	 = tf->tf_sr5;
90*e27aa0a3Skettenis 	regs->r_sr6	 = tf->tf_sr6;
91*e27aa0a3Skettenis 	regs->r_sr7	 = tf->tf_sr7;
92*e27aa0a3Skettenis 
93*e27aa0a3Skettenis 	regs->r_cr26	 = 0;
94*e27aa0a3Skettenis 	regs->r_cr27	 = tf->tf_cr27;
958b66c37bSmickey 
962be7f011Smickey 	return (0);
97975db92eSmickey }
98975db92eSmickey 
99975db92eSmickey int
process_read_fpregs(struct proc * p,struct fpreg * fpregs)100ae9924d2Sjsing process_read_fpregs(struct proc *p, struct fpreg *fpregs)
101975db92eSmickey {
10241f648c2Sjsing 	fpu_proc_save(p);
103975755daSmickey 
1042f8e4113Sjsing 	bcopy(&p->p_addr->u_pcb.pcb_fpstate->hfp_regs, fpregs, 32 * 8);
105975755daSmickey 
1062be7f011Smickey 	return (0);
107975db92eSmickey }
108975db92eSmickey 
109477189dbSmiod #ifdef PTRACE
110477189dbSmiod 
111477189dbSmiod int
process_write_regs(struct proc * p,struct reg * regs)112ae9924d2Sjsing process_write_regs(struct proc *p, struct reg *regs)
113477189dbSmiod {
1147673df72Smickey 	struct trapframe *tf = p->p_md.md_regs;
1157673df72Smickey 
1167673df72Smickey 	tf->tf_r1   = regs->r_regs[ 1];
1177673df72Smickey 	tf->tf_rp   = regs->r_regs[ 2];
1187673df72Smickey 	tf->tf_r3   = regs->r_regs[ 3];
1197673df72Smickey 	tf->tf_r4   = regs->r_regs[ 4];
1207673df72Smickey 	tf->tf_r5   = regs->r_regs[ 5];
1217673df72Smickey 	tf->tf_r6   = regs->r_regs[ 6];
1227673df72Smickey 	tf->tf_r7   = regs->r_regs[ 7];
1237673df72Smickey 	tf->tf_r8   = regs->r_regs[ 8];
1247673df72Smickey 	tf->tf_r9   = regs->r_regs[ 9];
1257673df72Smickey 	tf->tf_r10  = regs->r_regs[10];
1267673df72Smickey 	tf->tf_r11  = regs->r_regs[11];
1277673df72Smickey 	tf->tf_r12  = regs->r_regs[12];
1287673df72Smickey 	tf->tf_r13  = regs->r_regs[13];
1297673df72Smickey 	tf->tf_r14  = regs->r_regs[14];
1307673df72Smickey 	tf->tf_r15  = regs->r_regs[15];
1317673df72Smickey 	tf->tf_r16  = regs->r_regs[16];
1327673df72Smickey 	tf->tf_r17  = regs->r_regs[17];
1337673df72Smickey 	tf->tf_r18  = regs->r_regs[18];
1347673df72Smickey 	tf->tf_t4   = regs->r_regs[19];
1357673df72Smickey 	tf->tf_t3   = regs->r_regs[20];
1367673df72Smickey 	tf->tf_t2   = regs->r_regs[21];
1377673df72Smickey 	tf->tf_t1   = regs->r_regs[22];
1387673df72Smickey 	tf->tf_arg3 = regs->r_regs[23];
1397673df72Smickey 	tf->tf_arg2 = regs->r_regs[24];
1407673df72Smickey 	tf->tf_arg1 = regs->r_regs[25];
1417673df72Smickey 	tf->tf_arg0 = regs->r_regs[26];
1427673df72Smickey 	tf->tf_dp   = regs->r_regs[27];
1437673df72Smickey 	tf->tf_ret0 = regs->r_regs[28];
1447673df72Smickey 	tf->tf_ret1 = regs->r_regs[29];
1457673df72Smickey 	tf->tf_sp   = regs->r_regs[30];
1467673df72Smickey 	tf->tf_r31  = regs->r_regs[31];
147*e27aa0a3Skettenis 
148*e27aa0a3Skettenis 	tf->tf_sar  = regs->r_sar;
149*e27aa0a3Skettenis 
150*e27aa0a3Skettenis 	tf->tf_iioq_head = regs->r_pcoqh | HPPA_PC_PRIV_USER;
151*e27aa0a3Skettenis 	tf->tf_iioq_tail = regs->r_pcoqt | HPPA_PC_PRIV_USER;
1528b66c37bSmickey 
1532be7f011Smickey 	return (0);
154477189dbSmiod }
155477189dbSmiod 
156975db92eSmickey int
process_write_fpregs(struct proc * p,struct fpreg * fpregs)157ae9924d2Sjsing process_write_fpregs(struct proc *p, struct fpreg *fpregs)
158975db92eSmickey {
15941f648c2Sjsing 	fpu_proc_flush(p);
160975755daSmickey 
1612f8e4113Sjsing 	bcopy(fpregs, &p->p_addr->u_pcb.pcb_fpstate->hfp_regs, 32 * 8);
162fdf00c76Smickey 
1632be7f011Smickey 	return (0);
164975db92eSmickey }
165975db92eSmickey 
1667bfbef72Skettenis /* process_sstep() is in trap.c */
167975db92eSmickey 
168975db92eSmickey int
process_set_pc(struct proc * p,caddr_t addr)169ae9924d2Sjsing process_set_pc(struct proc *p, caddr_t addr)
170975db92eSmickey {
1715c8bcbfaSkettenis 	p->p_md.md_regs->tf_iioq_head = (register_t)addr | HPPA_PC_PRIV_USER;
1725c8bcbfaSkettenis 	p->p_md.md_regs->tf_iioq_tail = p->p_md.md_regs->tf_iioq_head + 4;
1732be7f011Smickey 
1742be7f011Smickey 	return (0);
175975db92eSmickey }
1764247ce11Smickey 
177477189dbSmiod #endif	/* PTRACE */
178