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