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