123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- //++
- // 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)
- #if defined(__ELF__) && defined(__linux__)
- .section .note.GNU-stack,"",%progbits
- #endif
|