h_execregs.S revision 1.2 1 /* $NetBSD: h_execregs.S,v 1.2 2025/02/28 16:08:19 riastradh Exp $ */
2
3 /*-
4 * Copyright (c) 2025 The NetBSD Foundation, Inc.
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 #define _LOCORE
30
31 #include <sys/syscall.h>
32
33 #include <machine/asm.h>
34 #include <machine/vmparam.h>
35
36 #include "execregs.h"
37
38 _ENTRY(execregs_start)
39 .callinfo frame=(NEXECREGS*4), calls
40 .entry
41
42 ldo (NEXECREGS*4)(%sp), %sp /* space for NEXECREGS */
43 stw %t1, (4*(0 - NEXECREGS))(%sp) /* order matches execregs.h */
44 stw %t2, (4*(1 - NEXECREGS))(%sp)
45 /* sp: stack pointer */
46 stw %t3, (4*(2 - NEXECREGS))(%sp)
47 /* cr17/iisq_head: privileged */
48 /* cr17/iisq_tail: privileged */
49 /* cr18/iioq_head: privileged */
50 /* cr18/iioq_tail: privileged */
51 /* cr15/eiem: privileged */
52 /* cr22/ipsw: privileged */
53 /* sr3: privileged(?) */
54 /* cr8/pidr1: privileged */
55 /* cr20/isr: privileged */
56 /* cr21/ior: privileged */
57 /* cr19/iir: privileged */
58 /* flags: N/A(?) */
59 stw %sar, (4*(3 - NEXECREGS))(%sp)
60 stw %r1, (4*(4 - NEXECREGS))(%sp)
61 stw %rp, (4*(5 - NEXECREGS))(%sp)
62 /* r3: frame pointer (set to initial stack pointer) */
63 stw %r4, (4*(6 - NEXECREGS))(%sp)
64 stw %r5, (4*(7 - NEXECREGS))(%sp)
65 stw %r6, (4*(8 - NEXECREGS))(%sp)
66 stw %r7, (4*(9 - NEXECREGS))(%sp)
67 stw %r8, (4*(10 - NEXECREGS))(%sp)
68 stw %r9, (4*(11 - NEXECREGS))(%sp)
69 stw %r10, (4*(12 - NEXECREGS))(%sp)
70 stw %r11, (4*(13 - NEXECREGS))(%sp)
71 stw %r12, (4*(14 - NEXECREGS))(%sp)
72 stw %r13, (4*(15 - NEXECREGS))(%sp)
73 stw %r14, (4*(16 - NEXECREGS))(%sp)
74 stw %r15, (4*(17 - NEXECREGS))(%sp)
75 stw %r16, (4*(18 - NEXECREGS))(%sp)
76 stw %r17, (4*(19 - NEXECREGS))(%sp)
77 stw %r18, (4*(20 - NEXECREGS))(%sp)
78 stw %t4, (4*(21 - NEXECREGS))(%sp)
79 stw %arg3, (4*(22 - NEXECREGS))(%sp)
80 stw %arg2, (4*(23 - NEXECREGS))(%sp)
81 stw %arg1, (4*(24 - NEXECREGS))(%sp)
82 /* arg0: ps_strings */
83 stw %dp, (4*(25 - NEXECREGS))(%sp)
84 stw %ret0, (4*(26 - NEXECREGS))(%sp)
85 stw %ret1, (4*(27 - NEXECREGS))(%sp)
86 stw %r31, (4*(28 - NEXECREGS))(%sp)
87 /* sr0-sr7: space registers initialized by kernel */
88 /* cr9/pidr2: privileged */
89 /* cr12/pidr3: privileged */
90 /* cr13/pidr4: privileged */
91 /* cr0/rctr: privileged */
92 /* cr10/ccr: privileged */
93 /* cr23/eirr: privileged */
94 /* cr24: privileged */
95 /* cr25/vtop: privileged */
96 /* cr26: ??? */
97 stw %cr27, (4*(29 - NEXECREGS))(%sp)
98 stw %cr28, (4*(30 - NEXECREGS))(%sp)
99 /* cr30/fpregs: privileged */
100 /* cr31: privileged */
101
102 addc %t1, %r0, %r0 /* t1 := PSW[C/B]{0} */
103 zdep %t1, 23, 8, %t1 /* t1 := PSW */
104 stw %t1, (4*(31 - NEXECREGS))(%sp)
105
106 /* store the fp registers */
107 ldo (4*(32 - NEXECREGS))(%sp), %t1
108 fstd,ma %fr0, 8(%t1)
109 fstd,ma %fr1, 8(%t1)
110 fstd,ma %fr2, 8(%t1)
111 fstd,ma %fr3, 8(%t1)
112 fstd,ma %fr4, 8(%t1)
113 fstd,ma %fr5, 8(%t1)
114 fstd,ma %fr6, 8(%t1)
115 fstd,ma %fr7, 8(%t1)
116 fstd,ma %fr8, 8(%t1)
117 fstd,ma %fr9, 8(%t1)
118 fstd,ma %fr10, 8(%t1)
119 fstd,ma %fr11, 8(%t1)
120 fstd,ma %fr12, 8(%t1)
121 fstd,ma %fr13, 8(%t1)
122 fstd,ma %fr14, 8(%t1)
123 fstd,ma %fr15, 8(%t1)
124 fstd,ma %fr16, 8(%t1)
125 fstd,ma %fr17, 8(%t1)
126 fstd,ma %fr18, 8(%t1)
127 fstd,ma %fr19, 8(%t1)
128 fstd,ma %fr20, 8(%t1)
129 fstd,ma %fr21, 8(%t1)
130 fstd,ma %fr22, 8(%t1)
131 fstd,ma %fr23, 8(%t1)
132 fstd,ma %fr24, 8(%t1)
133 fstd,ma %fr25, 8(%t1)
134 fstd,ma %fr26, 8(%t1)
135 fstd,ma %fr27, 8(%t1)
136 fstd,ma %fr28, 8(%t1)
137 fstd,ma %fr29, 8(%t1)
138 fstd,ma %fr30, 8(%t1)
139 fstd %fr31, 0(%t1)
140
141 /* call write(STDOUT_FILENO, regs, sizeof(regs)) */
142 ldi 1, %arg0 /* arg0 := STDOUT_FILENO */
143 ldo -(4*NEXECREGS)(%sp), %arg1 /* arg1 := regs */
144 ldi (4*NEXECREGS), %arg2 /* arg2 := sizeof(regs) */
145 ldil L%SYSCALLGATE, %r1
146 ble 4(%sr2, %r1)
147 ldi SYS_write, %t1
148
149 comb,<>,n %r0, %t1, 2f /* bail if write failed */
150 ldi (4*NEXECREGS), %t1 /* bail if wrong # bytes */
151 comb,<>,n %ret0, %t1, 2f
152
153 /* call exit(0) */
154 ldi 0, %arg0
155 1: ldil L%SYSCALLGATE, %r1
156 ble 4(%sr2, %r1)
157 ldi SYS_exit, %t1
158 break 0, 0 /* paranoia */
159
160 2: /* call exit(127) */
161 b 1b
162 ldi 127, %arg0
163 EXIT(execregs_start)
164
165 /* main stub to simplify linking */
166 LEAF_ENTRY(main)
167 break 0, 0 /* paranoia */
168 EXIT(main)
169