1 /* $NetBSD: prom_disp.S,v 1.2 1997/04/06 08:41:00 cgd Exp $ */ 2 3 /* 4 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. 5 * All rights reserved. 6 * 7 * Author: Chris G. Demetriou 8 * 9 * Permission to use, copy, modify and distribute this software and 10 * its documentation is hereby granted, provided that both the copyright 11 * notice and this permission notice appear in all copies of the 12 * software, derivative works or modified versions, and any portions 13 * thereof, and that both notices appear in supporting documentation. 14 * 15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 17 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 * 19 * Carnegie Mellon requests users of this software to return to 20 * 21 * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU 22 * School of Computer Science 23 * Carnegie Mellon University 24 * Pittsburgh PA 15213-3890 25 * 26 * any improvements or extensions that they make and grant Carnegie the 27 * rights to redistribute these changes. 28 */ 29 30 #ifndef _LOCORE 31 #include "include/asm.h" 32 #include "include/prom.h" 33 #include "include/rpb.h" 34 #endif 35 36 .globl prom_dispatch_v 37 .comm prom_dispatch_v,16 38 39 .text 40 .align 4 41 42 /* 43 * Dispatcher routine. Implements prom's calling machinery, saves our 44 * callee-saved registers as required by C. 45 */ 46 #define D_RA (7*8) 47 #define D_S0 (8*8) 48 #define D_S1 (9*8) 49 #define D_S2 (10*8) 50 #define D_S3 (11*8) 51 #define D_S4 (12*8) 52 #define D_S5 (13*8) 53 #define D_S6 (14*8) 54 #define DISPATCH_FRAME_SIZE (15*8) 55 #define DISPATCH_REGS IM_RA|IM_S0|IM_S1|IM_S2|IM_S3|IM_S4|IM_S5|IM_S6 56 57 NESTED(prom_dispatch, 5, DISPATCH_FRAME_SIZE, ra, DISPATCH_REGS, 0) 58 LDGP(pv) 59 60 lda sp, -DISPATCH_FRAME_SIZE(sp) 61 stq ra, D_RA(sp) 62 stq s0, D_S0(sp) 63 stq s1, D_S1(sp) 64 stq s2, D_S2(sp) 65 stq s3, D_S3(sp) 66 stq s4, D_S4(sp) 67 stq s5, D_S5(sp) 68 stq s6, D_S6(sp) 69 70 /* Lord have mercy because.. I would not. */ 71 /* #define STUPID_PROM_IS_32_BITS */ 72 #ifdef STUPID_PROM_IS_32_BITS 73 ldah s0, 0x2000(zero) /* hack for hack */ 74 lda s0, (0x2000-8)(s0) 75 76 stq sp, 0(s0) 77 or s0, zero, sp 78 #endif /* STUPID_PROM_IS_32_BITS */ 79 80 lda pv, prom_dispatch_v 81 ldq v0, 0(pv) /* routine */ 82 ldq pv, 8(pv) /* routine_arg */ 83 84 jsr ra, (v0) 85 86 #ifdef STUPID_PROM_IS_32_BITS 87 ldah s0, 0x2000(zero) /* hack for hack */ 88 lda s0, (0x2000-8)(s0) 89 90 ldq sp, 0(s0) 91 #endif /* STUPID_PROM_IS_32_BITS */ 92 93 ldq ra, D_RA(sp) 94 ldq s0, D_S0(sp) 95 ldq s1, D_S1(sp) 96 ldq s2, D_S2(sp) 97 ldq s3, D_S3(sp) 98 ldq s4, D_S4(sp) 99 ldq s5, D_S5(sp) 100 ldq s6, D_S6(sp) 101 lda sp, DISPATCH_FRAME_SIZE(sp) 102 RET 103 END(prom_dispatch) 104 105 #undef D_RA 106 #undef D_S0 107 #undef D_S1 108 #undef D_S2 109 #undef D_S3 110 #undef D_S4 111 #undef D_S5 112 #undef D_S6 113 #undef DISPATCH_FRAME_SIZE 114 #undef DISPATCH_REGS 115