diff options
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.S | 161 |
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) + |