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