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