h_execregs.S revision 1.1 1 /* $NetBSD: h_execregs.S,v 1.1 2025/02/27 00:55:32 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 /* call write(STDOUT_FILENO, regs, sizeof(regs)) */
103 ldi 1, %arg0 /* arg0 := STDOUT_FILENO */
104 ldo -(4*NEXECREGS)(%sp), %arg1 /* arg1 := regs */
105 ldi (4*NEXECREGS), %arg2 /* arg2 := sizeof(regs) */
106 ldil L%SYSCALLGATE, %r1
107 ble 4(%sr2, %r1)
108 ldi SYS_write, %t1
109
110 comb,<>,n %r0, %t1, 2f /* bail if write failed */
111 ldi (4*NEXECREGS), %t1 /* bail if wrong # bytes */
112 comb,<>,n %ret0, %t1, 2f
113
114 /* call exit(0) */
115 ldi 0, %arg0
116 1: ldil L%SYSCALLGATE, %r1
117 ble 4(%sr2, %r1)
118 ldi SYS_exit, %t1
119 break 0, 0 /* paranoia */
120
121 2: /* call exit(127) */
122 b 1b
123 ldi 127, %arg0
124 EXIT(execregs_start)
125
126 /* main stub to simplify linking */
127 LEAF_ENTRY(main)
128 break 0, 0 /* paranoia */
129 EXIT(main)
130