Home | History | Annotate | Line # | Download | only in hppa
      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