palproc.S revision 1.1 1 /* $NetBSD: palproc.S,v 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