Home | History | Annotate | Line # | Download | only in ia64
      1  1.1  jakllsch /*	$NetBSD: palproc.S,v 1.1.1.1 2014/04/01 16:16:07 jakllsch Exp $	*/
      2  1.1  jakllsch 
      3  1.1  jakllsch //++
      4  1.1  jakllsch //      Copyright (c) 1996-99 Intel Corp.
      5  1.1  jakllsch //
      6  1.1  jakllsch //
      7  1.1  jakllsch // Module Name:
      8  1.1  jakllsch //
      9  1.1  jakllsch //  palproc.s
     10  1.1  jakllsch //
     11  1.1  jakllsch // Abstract:
     12  1.1  jakllsch //
     13  1.1  jakllsch //  Contains an implementation for making PAL PROC calls on
     14  1.1  jakllsch //  IA-64 architecture.
     15  1.1  jakllsch //
     16  1.1  jakllsch //
     17  1.1  jakllsch //
     18  1.1  jakllsch // Revision History:
     19  1.1  jakllsch //
     20  1.1  jakllsch //--
     21  1.1  jakllsch 
     22  1.1  jakllsch 	.file	"palproc.s"
     23  1.1  jakllsch 
     24  1.1  jakllsch #include "palproc.h"
     25  1.1  jakllsch 
     26  1.1  jakllsch 
     27  1.1  jakllsch //-----------------------------------------------------------------------------
     28  1.1  jakllsch //++
     29  1.1  jakllsch // MakeStaticPALCall
     30  1.1  jakllsch //
     31  1.1  jakllsch // This routine is called whenever an architected static calling convention
     32  1.1  jakllsch // based PAL call is to be made. This call does use RSE actually, but our policy
     33  1.1  jakllsch // in making static PAL calls before memory is available is to make sure that
     34  1.1  jakllsch // we do not nest too deep and allocate beyond 96 banked registers. In other
     35  1.1  jakllsch // words we carefully code calls and control flow before memory is available.
     36  1.1  jakllsch //
     37  1.1  jakllsch // Arguments : All parameters set up to do static PAL call.
     38  1.1  jakllsch //
     39  1.1  jakllsch // On Entry :
     40  1.1  jakllsch //
     41  1.1  jakllsch // Return Value:
     42  1.1  jakllsch //
     43  1.1  jakllsch // As per static calling conventions.
     44  1.1  jakllsch //
     45  1.1  jakllsch //--
     46  1.1  jakllsch //---------------------------------------------------------------------------
     47  1.1  jakllsch PROCEDURE_ENTRY(MakeStaticPALCall)
     48  1.1  jakllsch 
     49  1.1  jakllsch         NESTED_SETUP (5,8,0,0)
     50  1.1  jakllsch         mov         loc3 = b5
     51  1.1  jakllsch         mov         loc4 = r2
     52  1.1  jakllsch         mov         loc7 = r1;;
     53  1.1  jakllsch 
     54  1.1  jakllsch         movl        loc6 = PAL_MC_CLEAR_LOG
     55  1.1  jakllsch         mov         r2 = psr;;
     56  1.1  jakllsch         mov         loc5 = r2
     57  1.1  jakllsch 
     58  1.1  jakllsch         cmp.eq      p6,p7 = r28,loc6;;
     59  1.1  jakllsch     (p7)movl        loc6 = PAL_MC_DYNAMIC_STATE;;
     60  1.1  jakllsch     (p7)cmp.eq      p6,p7 = r28,loc6;;
     61  1.1  jakllsch 
     62  1.1  jakllsch     (p7)movl        loc6 = PAL_MC_ERROR_INFO;;
     63  1.1  jakllsch     (p7)cmp.eq      p6,p7 = r28,loc6;;
     64  1.1  jakllsch 
     65  1.1  jakllsch     (p7)movl        loc6 = PAL_MC_RESUME;;
     66  1.1  jakllsch     (p7)cmp.eq      p6,p7 = r28,loc6
     67  1.1  jakllsch 
     68  1.1  jakllsch         mov         loc6 = 0x1;;
     69  1.1  jakllsch     (p7)dep         r2 = loc6,r2,13,1;;         // psr.ic = 1
     70  1.1  jakllsch 
     71  1.1  jakllsch // p6 will be true, if it is one of the MCHK calls. There has been lots of debate
     72  1.1  jakllsch // on psr.ic for these values. For now, do not do any thing to psr.ic
     73  1.1  jakllsch 
     74  1.1  jakllsch //    (p6)dep         r2 = r0,r2,13,1;;         // psr.ic = 0
     75  1.1  jakllsch         dep         r2 = r0,r2,14,1;;           // psr.i = 0
     76  1.1  jakllsch 
     77  1.1  jakllsch         mov         psr.l = r2
     78  1.1  jakllsch         srlz.d;;                                // Needs data serailization.
     79  1.1  jakllsch         srlz.i;;                                // Needs instruction serailization.
     80  1.1  jakllsch 
     81  1.1  jakllsch StaticGetPALLocalIP:
     82  1.1  jakllsch         mov         loc2 = ip;;
     83  1.1  jakllsch         add         loc2 = StaticComeBackFromPALCall - StaticGetPALLocalIP,loc2;;
     84  1.1  jakllsch         mov         b0 = loc2                   // return address after Pal call
     85  1.1  jakllsch         mov         r28 = in1                   // get the input parameters to PAL call
     86  1.1  jakllsch         mov         r29 = in2
     87  1.1  jakllsch         mov         r30 = in3;;
     88  1.1  jakllsch         mov         r31 = in4
     89  1.1  jakllsch         mov         b5 =  in0;;                 // get the PalProcEntrypt from input
     90  1.1  jakllsch         br.sptk     b5                          // Take the plunge.
     91  1.1  jakllsch 
     92  1.1  jakllsch StaticComeBackFromPALCall:
     93  1.1  jakllsch 
     94  1.1  jakllsch         mov         psr.l = loc5;;
     95  1.1  jakllsch         srlz.d;;                                // Needs data serailization.
     96  1.1  jakllsch         srlz.i;;                                // Needs instruction serailization.
     97  1.1  jakllsch 
     98  1.1  jakllsch         mov         b5 = loc3
     99  1.1  jakllsch         mov         r2 = loc4
    100  1.1  jakllsch         mov         r1 = loc7
    101  1.1  jakllsch 
    102  1.1  jakllsch         NESTED_RETURN
    103  1.1  jakllsch 
    104  1.1  jakllsch PROCEDURE_EXIT(MakeStaticPALCall)
    105  1.1  jakllsch 
    106  1.1  jakllsch 
    107  1.1  jakllsch //-----------------------------------------------------------------------------
    108  1.1  jakllsch //++
    109  1.1  jakllsch // MakeStackedPALCall
    110  1.1  jakllsch //
    111  1.1  jakllsch // This routine is called whenever an architected stacked calling convention
    112  1.1  jakllsch // based PAL call is to be made. This call is made after memory is available.
    113  1.1  jakllsch // Although stacked calls could be made directly from 'C', there is a PAL
    114  1.1  jakllsch // requirement which forces the index to be in GR28 and hence this stub is
    115  1.1  jakllsch // needed
    116  1.1  jakllsch //
    117  1.1  jakllsch // Arguments : All parameters set up to do stacted PAL call.
    118  1.1  jakllsch //
    119  1.1  jakllsch // On Entry :
    120  1.1  jakllsch //          in0:  PAL_PROC entrypoint
    121  1.1  jakllsch //          in1-in4 : PAL_PROC arguments
    122  1.1  jakllsch //
    123  1.1  jakllsch // Return Value:
    124  1.1  jakllsch //
    125  1.1  jakllsch // As per stacked calling conventions.
    126  1.1  jakllsch //
    127  1.1  jakllsch //--
    128  1.1  jakllsch //---------------------------------------------------------------------------
    129  1.1  jakllsch PROCEDURE_ENTRY(MakeStackedPALCall)
    130  1.1  jakllsch 
    131  1.1  jakllsch         NESTED_SETUP (5,8,4,0)
    132  1.1  jakllsch         mov         loc3 = b5
    133  1.1  jakllsch         mov         loc4 = r2
    134  1.1  jakllsch         mov         loc7 = r1
    135  1.1  jakllsch         mov         r2 = psr;;
    136  1.1  jakllsch         mov         loc5 = r2;;
    137  1.1  jakllsch         dep         r2 = r0,r2,14,1;;           // psr.i = 0
    138  1.1  jakllsch         mov         psr.l = r2
    139  1.1  jakllsch         srlz.d;;                                // Needs data serailization.
    140  1.1  jakllsch         srlz.i;;                                // Needs instruction serailization.
    141  1.1  jakllsch 
    142  1.1  jakllsch StackedGetPALLocalIP:
    143  1.1  jakllsch         mov         r28 = in1                   // get the input parameters to PAL call
    144  1.1  jakllsch         mov         out0 = in1
    145  1.1  jakllsch         mov         out1 = in2;;
    146  1.1  jakllsch         mov         out2 = in3
    147  1.1  jakllsch         mov         out3 = in4
    148  1.1  jakllsch         mov         b5 =  in0;;                 // get the PalProcEntrypt from input
    149  1.1  jakllsch         br.call.dpnt b0=b5;;                    // Take the plunge.
    150  1.1  jakllsch 
    151  1.1  jakllsch StackedComeBackFromPALCall:
    152  1.1  jakllsch 
    153  1.1  jakllsch         mov         psr.l = loc5;;
    154  1.1  jakllsch         srlz.d;;                                // Needs data serailization.
    155  1.1  jakllsch         srlz.i;;                                // Needs instruction serailization.
    156  1.1  jakllsch         mov         b5 = loc3
    157  1.1  jakllsch         mov         r2 = loc4
    158  1.1  jakllsch         mov         r1 = loc7
    159  1.1  jakllsch 
    160  1.1  jakllsch         NESTED_RETURN
    161  1.1  jakllsch 
    162  1.1  jakllsch PROCEDURE_EXIT(MakeStackedPALCall)
    163  1.1  jakllsch 
    164