1/*	$NetBSD$	*/
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//---------------------------------------------------------------------------
47PROCEDURE_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
81StaticGetPALLocalIP:
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
92StaticComeBackFromPALCall:
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
104PROCEDURE_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//---------------------------------------------------------------------------
129PROCEDURE_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
142StackedGetPALLocalIP:
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
151StackedComeBackFromPALCall:
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
162PROCEDURE_EXIT(MakeStackedPALCall)
163
164