Curle
d588e232c4
This branch has been dedicated to purely the UEFI bootloader. As such, all other code has been removed. This code can be compiled with Visual Studio, gcc or llvm.
162 lines
5.0 KiB
ArmAsm
162 lines
5.0 KiB
ArmAsm
//++
|
|
// 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)
|
|
|