| //++ |
| // 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) |
| |