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