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