From: qhuang8 Date: Mon, 15 Dec 2008 15:51:43 +0000 (+0000) Subject: 1. Simplify the implementation of AsmReadApplicationRegister() & AsmReadControlRegist... X-Git-Tag: edk2-stable201903~19213 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=59e0bb0cbde3c2228ecf555071490399852c02c9 1. Simplify the implementation of AsmReadApplicationRegister() & AsmReadControlRegister() for IPF architecture. 2. Add AsmReadMsr() & AsmWriteMsr() for IPF architecture 3. update AsmCpuMisc.s to only support GCC tool chain to avoid symbol collision. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7034 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/Library/BaseLib.h index ca90c0323b..72ac6f47ed 100644 --- a/MdePkg/Include/Library/BaseLib.h +++ b/MdePkg/Include/Library/BaseLib.h @@ -4897,6 +4897,50 @@ AsmReadApplicationRegister ( ); +/** + Reads the current value of a Machine Specific Register (MSR). + + Reads and returns the current value of the Machine Specific Register specified by Index. No + parameter checking is performed on Index, and if the Index value is beyond the implemented MSR + register range, a Reserved Register/Field fault may occur. The caller must either guarantee that + Index is valid, or the caller must set up fault handlers to catch the faults. This function is + only available on IPF. + + @param Index The 8-bit Machine Specific Register index to read. + + @return The current value of the Machine Specific Register specified by Index. + +**/ +UINT64 +EFIAPI +AsmReadMsr ( + IN UINT8 Index + ); + + +/** + Writes the current value of a Machine Specific Register (MSR). + + Writes Value to the Machine Specific Register specified by Index. Value is returned. No + parameter checking is performed on Index, and if the Index value is beyond the implemented MSR + register range, a Reserved Register/Field fault may occur. The caller must either guarantee that + Index is valid, or the caller must set up fault handlers to catch the faults. This function is + only available on IPF. + + @param Index The 8-bit Machine Specific Register index to write. + @param Value The 64-bit value to write to the Machine Specific Register. + + @return The 64-bit value to write to the Machine Specific Register. + +**/ +UINT64 +EFIAPI +AsmWriteMsr ( + IN UINT8 Index, + IN UINT64 Value + ); + + /** Determines if the CPU is currently executing in virtual, physical, or mixed mode. diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index 3a38f2ba1c..519dea10e3 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -575,7 +575,6 @@ ChkStkGcc.c | GCC [Sources.IPF] - Ipf/AsmCpuMisc.s Ipf/AccessGp.s Ipf/ReadCpuid.s Ipf/ExecFc.s @@ -586,6 +585,7 @@ Ipf/AccessGcr.s Ipf/AccessEicr.s Ipf/AccessDbr.s + Ipf/AccessMsr.s | INTEL Ipf/FlushCacheRange.s Ipf/InternalSwitchStack.c Ipf/GetInterruptState.s @@ -595,14 +595,13 @@ Ipf/InterlockedCompareExchange32.s Ipf/CpuBreakpoint.c | INTEL Ipf/CpuBreakpointMsc.c | MSFT + Ipf/AsmCpuMisc.s | GCC Ipf/Unaligned.c Ipf/SwitchStack.s Ipf/LongJmp.s Ipf/SetJmp.s Ipf/ReadCr.s - Ipf/ReadControlRegister.c Ipf/ReadAr.s - Ipf/ReadApplicationRegister.c Ipf/Ia64gen.h Ipf/Asm.h Math64.c diff --git a/MdePkg/Library/BaseLib/Ipf/AccessMsr.s b/MdePkg/Library/BaseLib/Ipf/AccessMsr.s new file mode 100644 index 0000000000..bb8ae34988 --- /dev/null +++ b/MdePkg/Library/BaseLib/Ipf/AccessMsr.s @@ -0,0 +1,79 @@ +/// @file +/// IPF specific Machine Specific Registers accessing functions. +/// +/// Copyright (c) 2008, Intel Corporation +/// All rights reserved. This program and the accompanying materials +/// are licensed and made available under the terms and conditions of the BSD License +/// which accompanies this distribution. The full text of the license may be found at +/// http://opensource.org/licenses/bsd-license.php +/// +/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +/// +/// +/// + + +//--------------------------------------------------------------------------------- +//++ +// AsmReadMsr +// +// Reads the current value of a Machine Specific Register (MSR). +// +// Reads and returns the current value of the Machine Specific Register specified by Index. No +// parameter checking is performed on Index, and if the Index value is beyond the implemented MSR +// register range, a Reserved Register/Field fault may occur. The caller must either guarantee that +// Index is valid, or the caller must set up fault handlers to catch the faults. This function is +// only available on IPF. +// +// Arguments : +// +// On Entry : The 8-bit Machine Specific Register index to read. +// +// Return Value: The current value of the Machine Specific Register specified by Index. +// +//-- +//---------------------------------------------------------------------------------- +.text +.type AsmReadMsr, @function +.proc AsmReadMsr +.regstk 1, 0, 0, 0 + +AsmReadMsr:: + mov r8=msr[in0];; + br.ret.sptk b0;; +.endp AsmReadMsr + +//--------------------------------------------------------------------------------- +//++ +// AsmWriteMsr +// +// Writes the current value of a Machine Specific Register (MSR). +// +// Writes Value to the Machine Specific Register specified by Index. Value is returned. No +// parameter checking is performed on Index, and if the Index value is beyond the implemented MSR +// register range, a Reserved Register/Field fault may occur. The caller must either guarantee that +// Index is valid, or the caller must set up fault handlers to catch the faults. This function is +// only available on IPF. +// +// Arguments : +// +// On Entry : The 8-bit Machine Specific Register index to write. +// The 64-bit value to write to the Machine Specific Register. +// +// Return Value: The 64-bit value to write to the Machine Specific Register. +// +//-- +//---------------------------------------------------------------------------------- +.text +.type AsmWriteMsr, @function +.proc AsmWriteMsr +.regstk 2, 0, 0, 0 + +AsmWriteMsr:: + mov msr[in0] = in1 + mov r8 = in1;; + srlz.d;; + br.ret.sptk b0;; +.endp AsmWriteMsr + diff --git a/MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c b/MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c deleted file mode 100644 index 818e6ac404..0000000000 --- a/MdePkg/Library/BaseLib/Ipf/ReadApplicationRegister.c +++ /dev/null @@ -1,79 +0,0 @@ -/** @file - Implementation of Application Register reading functions on Itanium platform. - - Copyright (c) 2008, Intel Corporation
- All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "BaseLibInternals.h" - - -// -// Loop up table for Index and corresponding application register access routines. -// -GLOBAL_REMOVE_IF_UNREFERENCED REGISTER_ENTRY mApplicationRegisterAccessEntries[] = { - {IPF_APPLICATION_REGISTER_K0, AsmReadApplicationRegisterK0}, - {IPF_APPLICATION_REGISTER_K1, AsmReadApplicationRegisterK1}, - {IPF_APPLICATION_REGISTER_K2, AsmReadApplicationRegisterK2}, - {IPF_APPLICATION_REGISTER_K3, AsmReadApplicationRegisterK3}, - {IPF_APPLICATION_REGISTER_K4, AsmReadApplicationRegisterK4}, - {IPF_APPLICATION_REGISTER_K5, AsmReadApplicationRegisterK5}, - {IPF_APPLICATION_REGISTER_K6, AsmReadApplicationRegisterK6}, - {IPF_APPLICATION_REGISTER_K7, AsmReadApplicationRegisterK7}, - {IPF_APPLICATION_REGISTER_RSC, AsmReadApplicationRegisterRsc}, - {IPF_APPLICATION_REGISTER_BSP, AsmReadApplicationRegisterBsp}, - {IPF_APPLICATION_REGISTER_BSPSTORE, AsmReadApplicationRegisterBspstore}, - {IPF_APPLICATION_REGISTER_RNAT, AsmReadApplicationRegisterRnat}, - {IPF_APPLICATION_REGISTER_FCR, AsmReadApplicationRegisterFcr}, - {IPF_APPLICATION_REGISTER_EFLAG, AsmReadApplicationRegisterEflag}, - {IPF_APPLICATION_REGISTER_CSD, AsmReadApplicationRegisterCsd}, - {IPF_APPLICATION_REGISTER_SSD, AsmReadApplicationRegisterSsd}, - {IPF_APPLICATION_REGISTER_CFLG, AsmReadApplicationRegisterCflg}, - {IPF_APPLICATION_REGISTER_FSR, AsmReadApplicationRegisterFsr}, - {IPF_APPLICATION_REGISTER_FIR, AsmReadApplicationRegisterFir}, - {IPF_APPLICATION_REGISTER_FDR, AsmReadApplicationRegisterFdr}, - {IPF_APPLICATION_REGISTER_CCV, AsmReadApplicationRegisterCcv}, - {IPF_APPLICATION_REGISTER_UNAT, AsmReadApplicationRegisterUnat}, - {IPF_APPLICATION_REGISTER_FPSR, AsmReadApplicationRegisterFpsr}, - {IPF_APPLICATION_REGISTER_ITC, AsmReadApplicationRegisterItc}, - {IPF_APPLICATION_REGISTER_PFS, AsmReadApplicationRegisterPfs}, - {IPF_APPLICATION_REGISTER_LC, AsmReadApplicationRegisterLc}, - {IPF_APPLICATION_REGISTER_EC, AsmReadApplicationRegisterEc} -}; - - -/** - Reads a 64-bit application register. - - Reads and returns the application register specified by Index. The valid Index valued are defined - above in "Related Definitions". - If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF. - - @param Index The index of the application register to read. - - @return The application register specified by Index. - -**/ -UINT64 -EFIAPI -AsmReadApplicationRegister ( - IN UINT64 Index - ) -{ - UINTN Item; - - for (Item = 0; Item < sizeof (mApplicationRegisterAccessEntries) / sizeof (mApplicationRegisterAccessEntries[0]); Item++) { - if (mApplicationRegisterAccessEntries[Item].Index == Index) { - return mApplicationRegisterAccessEntries[Item].Function (); - } - } - - return 0xFFFFFFFFFFFFFFFF; -} diff --git a/MdePkg/Library/BaseLib/Ipf/ReadAr.s b/MdePkg/Library/BaseLib/Ipf/ReadAr.s index 56225269ad..9f3176bce3 100644 --- a/MdePkg/Library/BaseLib/Ipf/ReadAr.s +++ b/MdePkg/Library/BaseLib/Ipf/ReadAr.s @@ -15,487 +15,95 @@ -.text -.type AsmReadApplicationRegisterK0, @function -.proc AsmReadApplicationRegisterK0 -// -// Reads appplication register K0. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K0 -// -// @return The 64-bit application register K0. -// -AsmReadApplicationRegisterK0:: - mov r8 = ar.k0;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK0 - - - -.text -.type AsmReadApplicationRegisterK1, @function -.proc AsmReadApplicationRegisterK1 -// -// Reads appplication register K1. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K1 -// -// @return The 64-bit application register K1. -// -AsmReadApplicationRegisterK1:: - mov r8 = ar.k1;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK1 - - - -.text -.type AsmReadApplicationRegisterK2, @function -.proc AsmReadApplicationRegisterK2 -// -// Reads appplication register K2. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K2 -// -// @return The 64-bit application register K2. -// -AsmReadApplicationRegisterK2:: - mov r8 = ar.k2;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK2 - - - -.text -.type AsmReadApplicationRegisterK3, @function -.proc AsmReadApplicationRegisterK3 -// -// Reads appplication register K3. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K3 -// -// @return The 64-bit application register K3. -// -AsmReadApplicationRegisterK3:: - mov r8 = ar.k3;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK3 - - - -.text -.type AsmReadApplicationRegisterK4, @function -.proc AsmReadApplicationRegisterK4 -// -// Reads appplication register K4. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K4 -// -// @return The 64-bit application register K4. -// -AsmReadApplicationRegisterK4:: - mov r8 = ar.k4;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK4 - - - -.text -.type AsmReadApplicationRegisterK5, @function -.proc AsmReadApplicationRegisterK5 -// -// Reads appplication register K5. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K5 -// -// @return The 64-bit application register K5. -// -AsmReadApplicationRegisterK5:: - mov r8 = ar.k5;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK5 - - - -.text -.type AsmReadApplicationRegisterK6, @function -.proc AsmReadApplicationRegisterK6 -// -// Reads appplication register K6. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K6 -// -// @return The 64-bit application register K6. -// -AsmReadApplicationRegisterK6:: - mov r8 = ar.k6;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK6 - - - -.text -.type AsmReadApplicationRegisterK7, @function -.proc AsmReadApplicationRegisterK7 -// -// Reads appplication register K7. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_K7 -// -// @return The 64-bit application register K7. -// -AsmReadApplicationRegisterK7:: - mov r8 = ar.k7;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterK7 - - - -.text -.type AsmReadApplicationRegisterRsc, @function -.proc AsmReadApplicationRegisterRsc -// -// Reads appplication register RSC. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_RSC -// -// @return The 64-bit application register RSC. -// -AsmReadApplicationRegisterRsc:: - mov r8 = ar.rsc;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterRsc - - - -.text -.type AsmReadApplicationRegisterBsp, @function -.proc AsmReadApplicationRegisterBsp -// -// Reads appplication register BSP. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_BSP -// -// @return The 64-bit application register BSP. -// -AsmReadApplicationRegisterBsp:: - mov r8 = ar.bsp;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterBsp - - - -.text -.type AsmReadApplicationRegisterBspstore, @function -.proc AsmReadApplicationRegisterBspstore -// -// Reads appplication register BSPSTORE. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_BSPSTORE -// -// @return The 64-bit application register BSPSTORE. -// -AsmReadApplicationRegisterBspstore:: - mov r8 = ar.bspstore;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterBspstore - - - -.text -.type AsmReadApplicationRegisterRnat, @function -.proc AsmReadApplicationRegisterRnat -// -// Reads appplication register RNAT. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_RNAT -// -// @return The 64-bit application register RNAT. -// -AsmReadApplicationRegisterRnat:: - mov r8 = ar.rnat;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterRnat - - - -.text -.type AsmReadApplicationRegisterFcr, @function -.proc AsmReadApplicationRegisterFcr -// -// Reads appplication register FCR. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_FCR -// -// @return The 64-bit application register FCR. -// -AsmReadApplicationRegisterFcr:: - mov r8 = ar.fcr;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterFcr - - - -.text -.type AsmReadApplicationRegisterEflag, @function -.proc AsmReadApplicationRegisterEflag -// -// Reads appplication register EFLAG. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_EFLAG -// -// @return The 64-bit application register EFLAG. -// -AsmReadApplicationRegisterEflag:: - mov r8 = ar.eflag;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterEflag - - - -.text -.type AsmReadApplicationRegisterCsd, @function -.proc AsmReadApplicationRegisterCsd -// -// Reads appplication register CSD. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_CSD -// -// @return The 64-bit application register CSD. -// -AsmReadApplicationRegisterCsd:: - mov r8 = ar.csd;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterCsd - - - -.text -.type AsmReadApplicationRegisterSsd, @function -.proc AsmReadApplicationRegisterSsd -// -// Reads appplication register SSD. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_SSD -// -// @return The 64-bit application register SSD. -// -AsmReadApplicationRegisterSsd:: - mov r8 = ar.ssd;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterSsd - - - -.text -.type AsmReadApplicationRegisterCflg, @function -.proc AsmReadApplicationRegisterCflg -// -// Reads appplication register CFLG. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_CFLG -// -// @return The 64-bit application register CFLG. -// -AsmReadApplicationRegisterCflg:: - mov r8 = ar.cflg;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterCflg - - - -.text -.type AsmReadApplicationRegisterFsr, @function -.proc AsmReadApplicationRegisterFsr -// -// Reads appplication register FSR. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_FSR -// -// @return The 64-bit application register FSR. -// -AsmReadApplicationRegisterFsr:: - mov r8 = ar.fsr;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterFsr - - - -.text -.type AsmReadApplicationRegisterFir, @function -.proc AsmReadApplicationRegisterFir -// -// Reads appplication register FIR. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_FIR -// -// @return The 64-bit application register FIR. -// -AsmReadApplicationRegisterFir:: - mov r8 = ar.fir;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterFir - - - -.text -.type AsmReadApplicationRegisterFdr, @function -.proc AsmReadApplicationRegisterFdr -// -// Reads appplication register FDR. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_FDR -// -// @return The 64-bit application register FDR. -// -AsmReadApplicationRegisterFdr:: - mov r8 = ar.fdr;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterFdr - - - -.text -.type AsmReadApplicationRegisterCcv, @function -.proc AsmReadApplicationRegisterCcv -// -// Reads appplication register CCV. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_CCV -// -// @return The 64-bit application register CCV. -// -AsmReadApplicationRegisterCcv:: - mov r8 = ar.ccv;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterCcv - - - -.text -.type AsmReadApplicationRegisterUnat, @function -.proc AsmReadApplicationRegisterUnat -// -// Reads appplication register UNAT. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_UNAT -// -// @return The 64-bit application register UNAT. -// -AsmReadApplicationRegisterUnat:: - mov r8 = ar.unat;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterUnat - - - -.text -.type AsmReadApplicationRegisterFpsr, @function -.proc AsmReadApplicationRegisterFpsr -// -// Reads appplication register FPSR. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_FPSR -// -// @return The 64-bit application register FPSR. -// -AsmReadApplicationRegisterFpsr:: - mov r8 = ar.fpsr;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterFpsr - - - -.text -.type AsmReadApplicationRegisterItc, @function -.proc AsmReadApplicationRegisterItc -// -// Reads appplication register ITC. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_ITC -// -// @return The 64-bit application register ITC. -// -AsmReadApplicationRegisterItc:: - mov r8 = ar.itc;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterItc - - - -.text -.type AsmReadApplicationRegisterPfs, @function -.proc AsmReadApplicationRegisterPfs -// -// Reads appplication register PFS. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_PFS -// -// @return The 64-bit application register PFS. -// -AsmReadApplicationRegisterPfs:: - mov r8 = ar.pfs;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterPfs - - - -.text -.type AsmReadApplicationRegisterLc, @function -.proc AsmReadApplicationRegisterLc -// -// Reads appplication register LC. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_LC -// -// @return The 64-bit application register LC. -// -AsmReadApplicationRegisterLc:: - mov r8 = ar.lc;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterLc - - - -.text -.type AsmReadApplicationRegisterEc, @function -.proc AsmReadApplicationRegisterEc -// -// Reads appplication register EC. -// -// This is a worker function for AsmReadApplicationRegister() -// when its parameter Index is IPF_APPLICATION_REGISTER_EC -// -// @return The 64-bit application register EC. -// -AsmReadApplicationRegisterEc:: - mov r8 = ar.ec;; - br.ret.dpnt b0;; -.endp AsmReadApplicationRegisterEc - +//--------------------------------------------------------------------------------- +//++ +// AsmReadApplicationRegister +// +// Reads a 64-bit application register. +// +// Reads and returns the application register specified by Index. +// If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF. +// +// Arguments : +// +// On Entry : The index of the application register to read. +// +// Return Value: The application register specified by Index. +// +//-- +//---------------------------------------------------------------------------------- +.text +.type AsmReadApplicationRegister, @function +.proc AsmReadApplicationRegister +.regstk 1, 0, 0, 0 + +AsmReadApplicationRegister:: + // + // ARs are defined in the ranges 0-44 and 64-66 (with some holes). + // Compact this list by subtracting 16 from the top range. + // 0-44, 64-66 -> 0-44, 48-50 + // + mov r15=2 + mov r14=pr // save predicates + cmp.leu p6,p7=64,in0 // p6 = AR# >= 64 + ;; + (p7) cmp.leu p7,p0=48,in0 // p7 = 32 <= AR# < 64 + (p6) add in0=-16,in0 // if (AR >= 64) AR# -= 16 + ;; + (p7) mov r15=0 // if bad range (48-63) + ;; + mov ret0=-1 // in case of illegal AR # + shl r15=r15,in0 // r15 = 0x2 << AR# + ;; + mov pr=r15,-1 + ;; + // + // At this point the predicates contain a bit field of the + // AR desired. (The bit is the AR+1, since pr0 is always 1.) + // + .pred.rel "mutex",p1,p2,p3,p4,p5,p6,p7,p8,p17,p18,p19,p20,p22,p25,\ + p26,p27,p28,p29,p30,p31,p33,p37,p41,p45,p49,p50,p51 + (p1) mov ret0=ar.k0 // ar0 + (p2) mov ret0=ar.k1 // ar1 + (p3) mov ret0=ar.k2 // ar2 + (p4) mov ret0=ar.k3 // ar3 + (p5) mov ret0=ar.k4 // ar4 + (p6) mov ret0=ar.k5 // ar5 + (p7) mov ret0=ar.k6 // ar6 + (p8) mov ret0=ar.k7 // ar7 + + (p17) mov ret0=ar.rsc // ar16 + (p18) mov ret0=ar.bsp // ar17 + (p19) mov ret0=ar.bspstore // ar18 + (p20) mov ret0=ar.rnat // ar19 + + (p22) mov ret0=ar.fcr // ar21 [iA32] + + (p25) mov ret0=ar.eflag // ar24 [iA32] + (p26) mov ret0=ar.csd // ar25 [iA32] + (p27) mov ret0=ar.ssd // ar26 [iA32] + (p28) mov ret0=ar.cflg // ar27 [iA32] + (p29) mov ret0=ar.fsr // ar28 [iA32] + (p30) mov ret0=ar.fir // ar29 [iA32] + (p31) mov ret0=ar.fdr // ar30 [iA32] + + (p33) mov ret0=ar.ccv // ar32 + + (p37) mov ret0=ar.unat // ar36 + + (p41) mov ret0=ar.fpsr // ar40 + + (p45) mov ret0=ar.itc // ar44 + + // + // This is the translated (-16) range. + // + (p49) mov ret0=ar.pfs // ar64 + (p50) mov ret0=ar.lc // ar65 + (p51) mov ret0=ar.ec // ar66 + + // Restore predicates and return. + + mov pr=r14,-1 + br.ret.sptk b0 + .endp diff --git a/MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c b/MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c deleted file mode 100644 index a3a8e11157..0000000000 --- a/MdePkg/Library/BaseLib/Ipf/ReadControlRegister.c +++ /dev/null @@ -1,78 +0,0 @@ -/** @file - Implementation of Control Register reading functions on Itanium platform. - - Copyright (c) 2008, Intel Corporation
- All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "BaseLibInternals.h" - - -// -// Loop up table for Index and corresponding control register access routines. -// -GLOBAL_REMOVE_IF_UNREFERENCED REGISTER_ENTRY mControlRegisterAccessEntries[] = { - {IPF_CONTROL_REGISTER_DCR, AsmReadControlRegisterDcr}, - {IPF_CONTROL_REGISTER_ITM, AsmReadControlRegisterItm}, - {IPF_CONTROL_REGISTER_IVA, AsmReadControlRegisterIva}, - {IPF_CONTROL_REGISTER_PTA, AsmReadControlRegisterPta}, - {IPF_CONTROL_REGISTER_IPSR, AsmReadControlRegisterIpsr}, - {IPF_CONTROL_REGISTER_ISR, AsmReadControlRegisterIsr}, - {IPF_CONTROL_REGISTER_IIP, AsmReadControlRegisterIip}, - {IPF_CONTROL_REGISTER_IFA, AsmReadControlRegisterIfa}, - {IPF_CONTROL_REGISTER_ITIR, AsmReadControlRegisterItir}, - {IPF_CONTROL_REGISTER_IIPA, AsmReadControlRegisterIipa}, - {IPF_CONTROL_REGISTER_IFS, AsmReadControlRegisterIfs}, - {IPF_CONTROL_REGISTER_IIM, AsmReadControlRegisterIim}, - {IPF_CONTROL_REGISTER_IHA, AsmReadControlRegisterIha}, - {IPF_CONTROL_REGISTER_LID, AsmReadControlRegisterLid}, - {IPF_CONTROL_REGISTER_IVR, AsmReadControlRegisterIvr}, - {IPF_CONTROL_REGISTER_TPR, AsmReadControlRegisterTpr}, - {IPF_CONTROL_REGISTER_EOI, AsmReadControlRegisterEoi}, - {IPF_CONTROL_REGISTER_IRR0, AsmReadControlRegisterIrr0}, - {IPF_CONTROL_REGISTER_IRR1, AsmReadControlRegisterIrr1}, - {IPF_CONTROL_REGISTER_IRR2, AsmReadControlRegisterIrr2}, - {IPF_CONTROL_REGISTER_IRR3, AsmReadControlRegisterIrr3}, - {IPF_CONTROL_REGISTER_ITV, AsmReadControlRegisterItv}, - {IPF_CONTROL_REGISTER_PMV, AsmReadControlRegisterPmv}, - {IPF_CONTROL_REGISTER_CMCV, AsmReadControlRegisterCmcv}, - {IPF_CONTROL_REGISTER_LRR0, AsmReadControlRegisterLrr0}, - {IPF_CONTROL_REGISTER_LRR1, AsmReadControlRegisterLrr1} -}; - - -/** - Reads a 64-bit control register. - - Reads and returns the control register specified by Index. The valid Index valued are defined - above in "Related Definitions". - If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF. - - @param Index The index of the control register to read. - - @return The control register specified by Index. - -**/ -UINT64 -EFIAPI -AsmReadControlRegister ( - IN UINT64 Index - ) -{ - UINTN Item; - - for (Item = 0; Item < sizeof (mControlRegisterAccessEntries) / sizeof (mControlRegisterAccessEntries[0]); Item++) { - if (mControlRegisterAccessEntries[Item].Index == Index) { - return mControlRegisterAccessEntries[Item].Function (); - } - } - - return 0xFFFFFFFFFFFFFFFF; -} diff --git a/MdePkg/Library/BaseLib/Ipf/ReadCr.s b/MdePkg/Library/BaseLib/Ipf/ReadCr.s index 839ea6fb34..fe5d80dcbd 100644 --- a/MdePkg/Library/BaseLib/Ipf/ReadCr.s +++ b/MdePkg/Library/BaseLib/Ipf/ReadCr.s @@ -14,469 +14,89 @@ /// -.text -.type AsmReadControlRegisterDcr, @function -.proc AsmReadControlRegisterDcr -// -// Reads control register DCR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_DCR -// -// @return The 64-bit control register DCR. -// -AsmReadControlRegisterDcr:: - mov r8 = cr.dcr;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterDcr - - - -.text -.type AsmReadControlRegisterItm, @function -.proc AsmReadControlRegisterItm -// -// Reads control register ITM. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_ITM -// -// @return The 64-bit control register ITM. -// -AsmReadControlRegisterItm:: - mov r8 = cr.itm;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterItm - - - -.text -.type AsmReadControlRegisterIva, @function -.proc AsmReadControlRegisterIva -// -// Reads control register IVA. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IVA -// -// @return The 64-bit control register IVA. -// -AsmReadControlRegisterIva:: - mov r8 = cr.iva;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIva - - - -.text -.type AsmReadControlRegisterPta, @function -.proc AsmReadControlRegisterPta -// -// Reads control register PTA. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_PTA -// -// @return The 64-bit control register PTA. -// -AsmReadControlRegisterPta:: - mov r8 = cr.pta;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterPta - - - -.text -.type AsmReadControlRegisterIpsr, @function -.proc AsmReadControlRegisterIpsr -// -// Reads control register IPSR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IPSR -// -// @return The 64-bit control register IPSR. -// -AsmReadControlRegisterIpsr:: - mov r8 = cr.ipsr;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIpsr - - - -.text -.type AsmReadControlRegisterIsr, @function -.proc AsmReadControlRegisterIsr -// -// Reads control register ISR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_ISR -// -// @return The 64-bit control register ISR. -// -AsmReadControlRegisterIsr:: - mov r8 = cr.isr;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIsr - - - -.text -.type AsmReadControlRegisterIip, @function -.proc AsmReadControlRegisterIip -// -// Reads control register IIP. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IIP -// -// @return The 64-bit control register IIP. -// -AsmReadControlRegisterIip:: - mov r8 = cr.iip;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIip - - - -.text -.type AsmReadControlRegisterIfa, @function -.proc AsmReadControlRegisterIfa -// -// Reads control register IFA. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IFA -// -// @return The 64-bit control register IFA. -// -AsmReadControlRegisterIfa:: - mov r8 = cr.ifa;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIfa - - - -.text -.type AsmReadControlRegisterItir, @function -.proc AsmReadControlRegisterItir -// -// Reads control register ITIR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_ITIR -// -// @return The 64-bit control register ITIR. -// -AsmReadControlRegisterItir:: - mov r8 = cr.itir;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterItir - - - -.text -.type AsmReadControlRegisterIipa, @function -.proc AsmReadControlRegisterIipa -// -// Reads control register IIPA. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IIPA -// -// @return The 64-bit control register IIPA. -// -AsmReadControlRegisterIipa:: - mov r8 = cr.iipa;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIipa - - - -.text -.type AsmReadControlRegisterIfs, @function -.proc AsmReadControlRegisterIfs -// -// Reads control register IFS. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IFS -// -// @return The 64-bit control register IFS. -// -AsmReadControlRegisterIfs:: - mov r8 = cr.ifs;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIfs - - - -.text -.type AsmReadControlRegisterIim, @function -.proc AsmReadControlRegisterIim -// -// Reads control register IIM. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IIM -// -// @return The 64-bit control register IIM. -// -AsmReadControlRegisterIim:: - mov r8 = cr.iim;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIim - - - -.text -.type AsmReadControlRegisterIha, @function -.proc AsmReadControlRegisterIha -// -// Reads control register IHA. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IHA -// -// @return The 64-bit control register IHA. -// -AsmReadControlRegisterIha:: - mov r8 = cr.iha;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIha - - - -.text -.type AsmReadControlRegisterLid, @function -.proc AsmReadControlRegisterLid -// -// Reads control register LID. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_LID -// -// @return The 64-bit control register LID. -// -AsmReadControlRegisterLid:: - mov r8 = cr.lid;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterLid - - - -.text -.type AsmReadControlRegisterIvr, @function -.proc AsmReadControlRegisterIvr -// -// Reads control register IVR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IVR -// -// @return The 64-bit control register IVR. -// -AsmReadControlRegisterIvr:: - mov r8 = cr.ivr;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIvr - - - -.text -.type AsmReadControlRegisterTpr, @function -.proc AsmReadControlRegisterTpr -// -// Reads control register TPR. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_TPR -// -// @return The 64-bit control register TPR. -// -AsmReadControlRegisterTpr:: - mov r8 = cr.tpr;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterTpr - - - -.text -.type AsmReadControlRegisterEoi, @function -.proc AsmReadControlRegisterEoi -// -// Reads control register EOI. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_EOI -// -// @return The 64-bit control register EOI. -// -AsmReadControlRegisterEoi:: - mov r8 = cr.eoi;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterEoi - - - -.text -.type AsmReadControlRegisterIrr0, @function -.proc AsmReadControlRegisterIrr0 -// -// Reads control register IRR0. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IRR0 -// -// @return The 64-bit control register IRR0. -// -AsmReadControlRegisterIrr0:: - mov r8 = cr.irr0;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIrr0 - - - -.text -.type AsmReadControlRegisterIrr1, @function -.proc AsmReadControlRegisterIrr1 -// -// Reads control register IRR1. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IRR1 -// -// @return The 64-bit control register IRR1. -// -AsmReadControlRegisterIrr1:: - mov r8 = cr.irr1;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIrr1 - - - -.text -.type AsmReadControlRegisterIrr2, @function -.proc AsmReadControlRegisterIrr2 -// -// Reads control register IRR2. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IRR2 -// -// @return The 64-bit control register IRR2. -// -AsmReadControlRegisterIrr2:: - mov r8 = cr.irr2;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIrr2 - - - -.text -.type AsmReadControlRegisterIrr3, @function -.proc AsmReadControlRegisterIrr3 -// -// Reads control register IRR3. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_IRR3 -// -// @return The 64-bit control register IRR3. -// -AsmReadControlRegisterIrr3:: - mov r8 = cr.irr3;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterIrr3 - - - -.text -.type AsmReadControlRegisterItv, @function -.proc AsmReadControlRegisterItv -// -// Reads control register ITV. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_ITV -// -// @return The 64-bit control register ITV. -// -AsmReadControlRegisterItv:: - mov r8 = cr.itv;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterItv - - - -.text -.type AsmReadControlRegisterPmv, @function -.proc AsmReadControlRegisterPmv -// -// Reads control register PMV. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_PMV -// -// @return The 64-bit control register PMV. -// -AsmReadControlRegisterPmv:: - mov r8 = cr.pmv;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterPmv - - - -.text -.type AsmReadControlRegisterCmcv, @function -.proc AsmReadControlRegisterCmcv -// -// Reads control register CMCV. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_CMCV -// -// @return The 64-bit control register CMCV. -// -AsmReadControlRegisterCmcv:: - mov r8 = cr.cmcv;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterCmcv - - - -.text -.type AsmReadControlRegisterLrr0, @function -.proc AsmReadControlRegisterLrr0 -// -// Reads control register LRR0. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_LRR0 -// -// @return The 64-bit control register LRR0. -// -AsmReadControlRegisterLrr0:: - mov r8 = cr.lrr0;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterLrr0 - - - -.text -.type AsmReadControlRegisterLrr1, @function -.proc AsmReadControlRegisterLrr1 -// -// Reads control register LRR1. -// -// This is a worker function for AsmReadControlRegister() -// when its parameter Index is IPF_CONTROL_REGISTER_LRR1 -// -// @return The 64-bit control register LRR1. -// -AsmReadControlRegisterLrr1:: - mov r8 = cr.lrr1;; - br.ret.dpnt b0;; -.endp AsmReadControlRegisterLrr1 +//--------------------------------------------------------------------------------- +//++ +// AsmReadControlRegister +// +// Reads a 64-bit control register. +// +// Reads and returns the control register specified by Index. +// If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF. +// +// Arguments : +// +// On Entry : The index of the control register to read. +// +// Return Value: The control register specified by Index. +// +//-- +//---------------------------------------------------------------------------------- +.text +.type AsmReadControlRegister, @function +.proc AsmReadControlRegister +.regstk 1, 0, 0, 0 + +AsmReadControlRegister:: + // + // CRs are defined in the ranges 0-25 and 64-81 (with some holes). + // Compact this list by subtracting 32 from the top range. + // 0-25, 64-81 -> 0-25, 32-49 + // + mov r15=2 + mov r14=pr // save predicates + cmp.leu p6,p7=64,in0 // p6 = CR# >= 64 + ;; + (p7) cmp.leu p7,p0=32,in0 // p7 = 32 <= CR# < 64 + (p6) add in0=-32,in0 // if (CR >= 64) CR# -= 32 + ;; + (p7) mov r15=0 // if bad range (32-63) + ;; + mov ret0=-1 // in case of illegal CR # + shl r15=r15,in0 // r15 = 0x2 << CR# + ;; + mov pr=r15,-1 + ;; + + // + // At this point the predicates contain a bit field of the + // CR desired. (The bit is the CR+1, since pr0 is always 1.) + // + .pred.rel "mutex",p1,p2,p3,p9,p17,p18,p20,p21,p22,p23,p24,p25,p26,\ + p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p49,p50 + (p1) mov ret0=cr.dcr // cr0 + (p2) mov ret0=cr.itm // cr1 + (p3) mov ret0=cr.iva // cr2 + (p9) mov ret0=cr.pta // cr8 + (p17) mov ret0=cr.ipsr // cr16 + (p18) mov ret0=cr.isr // cr17 + (p20) mov ret0=cr.iip // cr19 + (p21) mov ret0=cr.ifa // cr20 + (p22) mov ret0=cr.itir // cr21 + (p23) mov ret0=cr.iipa // cr22 + (p24) mov ret0=cr.ifs // cr23 + (p25) mov ret0=cr.iim // cr24 + (p26) mov ret0=cr.iha // cr25 + + // This is the translated (-32) range. + + (p33) mov ret0=cr.lid // cr64 + (p34) mov ret0=cr.ivr // cr65 + (p35) mov ret0=cr.tpr // cr66 + (p36) mov ret0=cr.eoi // cr67 + (p37) mov ret0=cr.irr0 // cr68 + (p38) mov ret0=cr.irr1 // cr69 + (p39) mov ret0=cr.irr2 // cr70 + (p40) mov ret0=cr.irr3 // cr71 + (p41) mov ret0=cr.itv // cr72 + (p42) mov ret0=cr.pmv // cr73 + (p43) mov ret0=cr.cmcv // cr74 + (p49) mov ret0=cr.lrr0 // cr80 + (p50) mov ret0=cr.lrr1 // cr81 + + // + // Restore predicates and return. + // + mov pr=r14,-1 + br.ret.sptk b0 + .endp