MdePkg/Library/BaseLib/Ipf/AsmPalCall.s File Reference
Detailed Description
Contains an implementation of CallPalProcStacked on Itanium-based
architecture.
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name: AsmPalCall.s
AsmPalCall
Makes a PAL procedure call.
This is function to make a PAL procedure call. Based on the Index
value this API will make static or stacked PAL call. The following table
describes the usage of PAL Procedure Index Assignment. Architected procedures
may be designated as required or optional. If a PAL procedure is specified
as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
Status field of the
PAL_CALL_RETURN structure.
This indicates that the procedure is not present in this PAL implementation.
It is the caller's responsibility to check for this return code after calling
any optional PAL procedure.
No parameter checking is performed on the 5 input parameters, but there are
some common rules that the caller should follow when making a PAL call. Any
address passed to PAL as buffers for return parameters must be 8-byte aligned.
Unaligned addresses may cause undefined results. For those parameters defined
as reserved or some fields defined as reserved must be zero filled or the invalid
argument return value may be returned or undefined result may occur during the
execution of the procedure. If the PalEntryPoint does not point to a valid
PAL entry point then the system behavior is undefined. This function is only
available on IPF.
On Entry :
in0: PAL_PROC entrypoint
in1-in4 : PAL_PROC arguments
Return Value:
As per stacked calling conventions.
PAL function calls
define PAL_MC_CLEAR_LOG 0x0015
define PAL_MC_DYNAMIC_STATE 0x0018
define PAL_MC_ERROR_INFO 0x0019
define PAL_MC_RESUME 0x001a
.text
.proc AsmPalCall
.type AsmPalCall,
AsmPalCall::
alloc loc1 = ar.pfs,5,8,4,0
mov loc0 = b0
mov loc3 = b5
mov loc4 = r2
mov loc7 = r1
mov r2 = psr;;
mov r28 = in1
mov loc5 = r2;;
movl loc6 = 0x100;;
cmp.ge p6,p7 = r28,loc6;;
(p6) movl loc6 = 0x1FF;;
(p7) br.dpnt.few PalCallStatic;; // 0 ~ 255 make a static Pal Call
(p6) cmp.le p6,p7 = r28,loc6;;
(p6) br.dpnt.few PalCallStacked;; // 256 ~ 511 make a stacked Pal Call
(p7) movl loc6 = 0x300;;
(p7) cmp.ge p6,p7 = r28,loc6;;
(p7) br.dpnt.few PalCallStatic;; // 512 ~ 767 make a static Pal Call
(p6) movl loc6 = 0x3FF;;
(p6) cmp.le p6,p7 = r28,loc6;;
(p6) br.dpnt.few PalCallStacked;; // 768 ~ 1023 make a stacked Pal Call
(p7) mov r8 = 0xFFFFFFFFFFFFFFFF;; // > 1024 return invalid
(p7) br.dpnt.few ComeBackFromPALCall;;
PalCallStatic:
movl loc6 = PAL_MC_CLEAR_LOG;;
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
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 = ComeBackFromPALCall - StaticGetPALLocalIP,loc2;;
mov b0 = loc2 // return address after 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.
PalCallStacked:
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 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.
ComeBackFromPALCall:
mov psr.l = loc5 ;;
srlz.d // Needs data serailization.
srlz.i // Needs instruction serailization.
mov b5 = loc3
mov r2 = loc4
mov r1 = loc7
mov b0 = loc0
mov ar.pfs = loc1;;
br.ret.dpnt b0;;
.endp AsmPalCall