171 lines
5.3 KiB
ArmAsm
171 lines
5.3 KiB
ArmAsm
|
//++
|
||
|
// Copyright (c) 1996-99 Intel Corp.
|
||
|
// All Rights Reserved
|
||
|
//
|
||
|
// INTEL CORPORATION PROPRIETARY INFORMATION
|
||
|
//
|
||
|
// This software is supplied under the terms of a license
|
||
|
// agreement or nondisclosure agreement with Intel Corpo-
|
||
|
// ration and may not be copied or disclosed except in
|
||
|
// accordance with the terms of that agreement.
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
// 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)
|
||
|
|