aboutsummaryrefslogtreecommitdiff
path: root/gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S
diff options
context:
space:
mode:
Diffstat (limited to 'gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S')
-rw-r--r--gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S161
1 files changed, 161 insertions, 0 deletions
diff --git a/gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S b/gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S
new file mode 100644
index 0000000..c304a78
--- /dev/null
+++ b/gnu-efi/gnu-efi-3.0/lib/ia64/palproc.S
@@ -0,0 +1,161 @@
+//++
+// Copyright (c) 1996-99 Intel Corp.
+//
+//
+// Module Name:
+//
+// palproc.s
+//
+// Abstract:
+//
+// Contains an implementation for making PAL PROC calls on
+// IA-64 architecture.
+//
+//
+//
+// Revision History:
+//
+//--
+
+ .file "palproc.s"
+
+#include "palproc.h"
+
+
+//-----------------------------------------------------------------------------
+//++
+// MakeStaticPALCall
+//
+// This routine is called whenever an architected static calling convention
+// based PAL call is to be made. This call does use RSE actually, but our policy
+// in making static PAL calls before memory is available is to make sure that
+// we do not nest too deep and allocate beyond 96 banked registers. In other
+// words we carefully code calls and control flow before memory is available.
+//
+// Arguments : All parameters set up to do static PAL call.
+//
+// On Entry :
+//
+// Return Value:
+//
+// As per static calling conventions.
+//
+//--
+//---------------------------------------------------------------------------
+PROCEDURE_ENTRY(MakeStaticPALCall)
+
+ NESTED_SETUP (5,8,0,0)
+ mov loc3 = b5
+ mov loc4 = r2
+ mov loc7 = r1;;
+
+ movl loc6 = PAL_MC_CLEAR_LOG
+ mov r2 = psr;;
+ mov loc5 = r2
+
+ cmp.eq p6,p7 = r28,loc6;;
+ (p7)movl loc6 = PAL_MC_DYNAMIC_STATE;;
+ (p7)cmp.eq p6,p7 = r28,loc6;;
+
+ (p7)movl loc6 = PAL_MC_ERROR_INFO;;
+ (p7)cmp.eq p6,p7 = r28,loc6;;
+
+ (p7)movl loc6 = PAL_MC_RESUME;;
+ (p7)cmp.eq p6,p7 = r28,loc6
+
+ mov loc6 = 0x1;;
+ (p7)dep r2 = loc6,r2,13,1;; // psr.ic = 1
+
+// p6 will be true, if it is one of the MCHK calls. There has been lots of debate
+// on psr.ic for these values. For now, do not do any thing to psr.ic
+
+// (p6)dep r2 = r0,r2,13,1;; // psr.ic = 0
+ dep r2 = r0,r2,14,1;; // psr.i = 0
+
+ mov psr.l = r2
+ srlz.d;; // Needs data serailization.
+ srlz.i;; // Needs instruction serailization.
+
+StaticGetPALLocalIP:
+ mov loc2 = ip;;
+ add loc2 = StaticComeBackFromPALCall - StaticGetPALLocalIP,loc2;;
+ mov b0 = loc2 // return address after Pal call
+ mov r28 = in1 // get the input parameters to PAL call
+ mov r29 = in2
+ mov r30 = in3;;
+ mov r31 = in4
+ mov b5 = in0;; // get the PalProcEntrypt from input
+ br.sptk b5 // Take the plunge.
+
+StaticComeBackFromPALCall:
+
+ mov psr.l = loc5;;
+ srlz.d;; // Needs data serailization.
+ srlz.i;; // Needs instruction serailization.
+
+ mov b5 = loc3
+ mov r2 = loc4
+ mov r1 = loc7
+
+ NESTED_RETURN
+
+PROCEDURE_EXIT(MakeStaticPALCall)
+
+
+//-----------------------------------------------------------------------------
+//++
+// MakeStackedPALCall
+//
+// This routine is called whenever an architected stacked calling convention
+// based PAL call is to be made. This call is made after memory is available.
+// Although stacked calls could be made directly from 'C', there is a PAL
+// requirement which forces the index to be in GR28 and hence this stub is
+// needed
+//
+// Arguments : All parameters set up to do stacted PAL call.
+//
+// On Entry :
+// in0: PAL_PROC entrypoint
+// in1-in4 : PAL_PROC arguments
+//
+// Return Value:
+//
+// As per stacked calling conventions.
+//
+//--
+//---------------------------------------------------------------------------
+PROCEDURE_ENTRY(MakeStackedPALCall)
+
+ NESTED_SETUP (5,8,4,0)
+ mov loc3 = b5
+ mov loc4 = r2
+ mov loc7 = r1
+ mov r2 = psr;;
+ mov loc5 = r2;;
+ dep r2 = r0,r2,14,1;; // psr.i = 0
+ mov psr.l = r2
+ srlz.d;; // Needs data serailization.
+ srlz.i;; // Needs instruction serailization.
+
+StackedGetPALLocalIP:
+ mov r28 = in1 // get the input parameters to PAL call
+ mov out0 = in1
+ mov out1 = in2;;
+ mov out2 = in3
+ mov out3 = in4
+ mov b5 = in0;; // get the PalProcEntrypt from input
+ br.call.dpnt b0=b5;; // Take the plunge.
+
+StackedComeBackFromPALCall:
+
+ mov psr.l = loc5;;
+ srlz.d;; // Needs data serailization.
+ srlz.i;; // Needs instruction serailization.
+ mov b5 = loc3
+ mov r2 = loc4
+ mov r1 = loc7
+
+ NESTED_RETURN
+
+PROCEDURE_EXIT(MakeStackedPALCall)
+