1 /* $NetBSD: palproc.S,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $ */ 2 3 //++ 4 // Copyright (c) 1996-99 Intel Corp. 5 // 6 // 7 // Module Name: 8 // 9 // palproc.s 10 // 11 // Abstract: 12 // 13 // Contains an implementation for making PAL PROC calls on 14 // IA-64 architecture. 15 // 16 // 17 // 18 // Revision History: 19 // 20 //-- 21 22 .file "palproc.s" 23 24 #include "palproc.h" 25 26 27 //----------------------------------------------------------------------------- 28 //++ 29 // MakeStaticPALCall 30 // 31 // This routine is called whenever an architected static calling convention 32 // based PAL call is to be made. This call does use RSE actually, but our policy 33 // in making static PAL calls before memory is available is to make sure that 34 // we do not nest too deep and allocate beyond 96 banked registers. In other 35 // words we carefully code calls and control flow before memory is available. 36 // 37 // Arguments : All parameters set up to do static PAL call. 38 // 39 // On Entry : 40 // 41 // Return Value: 42 // 43 // As per static calling conventions. 44 // 45 //-- 46 //--------------------------------------------------------------------------- 47 PROCEDURE_ENTRY(MakeStaticPALCall) 48 49 NESTED_SETUP (5,8,0,0) 50 mov loc3 = b5 51 mov loc4 = r2 52 mov loc7 = r1;; 53 54 movl loc6 = PAL_MC_CLEAR_LOG 55 mov r2 = psr;; 56 mov loc5 = r2 57 58 cmp.eq p6,p7 = r28,loc6;; 59 (p7)movl loc6 = PAL_MC_DYNAMIC_STATE;; 60 (p7)cmp.eq p6,p7 = r28,loc6;; 61 62 (p7)movl loc6 = PAL_MC_ERROR_INFO;; 63 (p7)cmp.eq p6,p7 = r28,loc6;; 64 65 (p7)movl loc6 = PAL_MC_RESUME;; 66 (p7)cmp.eq p6,p7 = r28,loc6 67 68 mov loc6 = 0x1;; 69 (p7)dep r2 = loc6,r2,13,1;; // psr.ic = 1 70 71 // p6 will be true, if it is one of the MCHK calls. There has been lots of debate 72 // on psr.ic for these values. For now, do not do any thing to psr.ic 73 74 // (p6)dep r2 = r0,r2,13,1;; // psr.ic = 0 75 dep r2 = r0,r2,14,1;; // psr.i = 0 76 77 mov psr.l = r2 78 srlz.d;; // Needs data serailization. 79 srlz.i;; // Needs instruction serailization. 80 81 StaticGetPALLocalIP: 82 mov loc2 = ip;; 83 add loc2 = StaticComeBackFromPALCall - StaticGetPALLocalIP,loc2;; 84 mov b0 = loc2 // return address after Pal call 85 mov r28 = in1 // get the input parameters to PAL call 86 mov r29 = in2 87 mov r30 = in3;; 88 mov r31 = in4 89 mov b5 = in0;; // get the PalProcEntrypt from input 90 br.sptk b5 // Take the plunge. 91 92 StaticComeBackFromPALCall: 93 94 mov psr.l = loc5;; 95 srlz.d;; // Needs data serailization. 96 srlz.i;; // Needs instruction serailization. 97 98 mov b5 = loc3 99 mov r2 = loc4 100 mov r1 = loc7 101 102 NESTED_RETURN 103 104 PROCEDURE_EXIT(MakeStaticPALCall) 105 106 107 //----------------------------------------------------------------------------- 108 //++ 109 // MakeStackedPALCall 110 // 111 // This routine is called whenever an architected stacked calling convention 112 // based PAL call is to be made. This call is made after memory is available. 113 // Although stacked calls could be made directly from 'C', there is a PAL 114 // requirement which forces the index to be in GR28 and hence this stub is 115 // needed 116 // 117 // Arguments : All parameters set up to do stacted PAL call. 118 // 119 // On Entry : 120 // in0: PAL_PROC entrypoint 121 // in1-in4 : PAL_PROC arguments 122 // 123 // Return Value: 124 // 125 // As per stacked calling conventions. 126 // 127 //-- 128 //--------------------------------------------------------------------------- 129 PROCEDURE_ENTRY(MakeStackedPALCall) 130 131 NESTED_SETUP (5,8,4,0) 132 mov loc3 = b5 133 mov loc4 = r2 134 mov loc7 = r1 135 mov r2 = psr;; 136 mov loc5 = r2;; 137 dep r2 = r0,r2,14,1;; // psr.i = 0 138 mov psr.l = r2 139 srlz.d;; // Needs data serailization. 140 srlz.i;; // Needs instruction serailization. 141 142 StackedGetPALLocalIP: 143 mov r28 = in1 // get the input parameters to PAL call 144 mov out0 = in1 145 mov out1 = in2;; 146 mov out2 = in3 147 mov out3 = in4 148 mov b5 = in0;; // get the PalProcEntrypt from input 149 br.call.dpnt b0=b5;; // Take the plunge. 150 151 StackedComeBackFromPALCall: 152 153 mov psr.l = loc5;; 154 srlz.d;; // Needs data serailization. 155 srlz.i;; // Needs instruction serailization. 156 mov b5 = loc3 157 mov r2 = loc4 158 mov r1 = loc7 159 160 NESTED_RETURN 161 162 PROCEDURE_EXIT(MakeStackedPALCall) 163 164