Upload BSD-licensed Vlv2TbltDevicePkg and Vlv2DeviceRefCodePkg to

https://svn.code.sf.net/p/edk2/code/trunk/edk2/, 

which are for MinnowBoard MAX open source project.


Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: David Wei <david.wei@intel.com>
Reviewed-by: Mike Wu <mike.wu@intel.com>
Reviewed-by: Hot Tian <hot.tian@intel.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16599 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
David Wei
2015-01-12 09:37:20 +00:00
committed by zwei4
parent 6f785cfcc3
commit 3cbfba02fe
518 changed files with 118538 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
#
#
# Copyright (c) 1999 - 2014, 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 that 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.
#
#
#
# Module Name:
#
# CpuIA32Lib.inf
#
# Abstract:
#
# Component description file for the Cpu IA32 library.
#
#--*/
[defines]
INF_VERSION = 0x00010005
BASE_NAME = CpuIA32Lib
FILE_GUID = 98546178-64F1-4d2e-814F-6BF963DB7930
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = CpuIA32Lib
PI_SPECIFICATION_VERSION = 0x0001000A
[Sources]
EfiCpuVersion.c
[Sources.IA32]

View File

@@ -0,0 +1,75 @@
/** @file
Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.
Module Name:
EfiCpuVersion.c
Abstract:
Provide cpu version extract considering extended family & model ID.
--*/
#include <Library/CpuIA32.h>
/**
Extract CPU detail version infomation
@param FamilyId FamilyId, including ExtendedFamilyId
@param Model Model, including ExtendedModel
@param SteppingId SteppingId
@param Processor Processor
**/
VOID
EFIAPI
EfiCpuVersion (
IN OUT UINT16 *FamilyId, OPTIONAL
IN OUT UINT8 *Model, OPTIONAL
IN OUT UINT8 *SteppingId, OPTIONAL
IN OUT UINT8 *Processor OPTIONAL
)
{
EFI_CPUID_REGISTER Register;
UINT8 TempFamilyId;
EfiCpuid (EFI_CPUID_VERSION_INFO, &Register);
if (SteppingId != NULL) {
*SteppingId = (UINT8) (Register.RegEax & 0xF);
}
if (Processor != NULL) {
*Processor = (UINT8) ((Register.RegEax >> 12) & 0x3);
}
if (Model != NULL || FamilyId != NULL) {
TempFamilyId = (UINT8) ((Register.RegEax >> 8) & 0xF);
if (Model != NULL) {
*Model = (UINT8) ((Register.RegEax >> 4) & 0xF);
if (TempFamilyId == 0x6 || TempFamilyId == 0xF) {
*Model = (UINT8) (*Model | ((Register.RegEax >> 12) & 0xF0));
}
}

View File

@@ -0,0 +1,228 @@
#
#
# Copyright (c) 1999 - 2014, 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 that 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.
#
#
#
#Module Name:
#
# CpuIA32.c
#
#Abstract:
#
#--*/
##include "CpuIA32.h"
#include "EfiBind.h"
#---------------------------------------------------------------------------
.586p:
#.MODEL flat,C
.code:
#---------------------------------------------------------------------------
.globl ASM_PFX(EfiHalt)
.globl ASM_PFX(EfiWbinvd)
.globl ASM_PFX(EfiInvd)
.globl ASM_PFX(EfiCpuid)
.globl ASM_PFX(EfiReadMsr)
.globl ASM_PFX(EfiWriteMsr)
.globl ASM_PFX(EfiReadTsc)
.globl ASM_PFX(EfiDisableCache)
.globl ASM_PFX(EfiEnableCache)
.globl ASM_PFX(EfiGetEflags)
.globl ASM_PFX(EfiDisableInterrupts)
.globl ASM_PFX(EfiEnableInterrupts)
.globl ASM_PFX(EfiCpuidExt)
#VOID
#EfiHalt (
# VOID
#)
ASM_PFX(EfiHalt):
hlt
ret
#EfiHalt ENDP
#VOID
#EfiWbinvd (
# VOID
#)
ASM_PFX(EfiWbinvd):
wbinvd
ret
#EfiWbinvd ENDP
#VOID
#EfiInvd (
# VOID
#)
ASM_PFX(EfiInvd):
invd
ret
#EfiInvd ENDP
#VOID
#EfiCpuid (IN UINT32 RegisterInEax,
# OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
ASM_PFX(EfiCpuid):
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %esi
pushl %edi
pushal
movl 8(%ebp), %eax #RegisterInEax
cpuid
cmpl $0, 0xC(%ebp) # Reg
je L1
movl 0xC(%ebp), %edi # Reg
movl %eax, (%edi) # Reg->RegEax
movl %ebx, 4(%edi) # Reg->RegEbx
movl %ecx, 8(%edi) # Reg->RegEcx
movl %edx, 0xC(%edi) # Reg->RegEdx
L1:
popal
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
#EfiCpuid ENDP
#UINT64
#EfiReadMsr (
# IN UINT32 Index
# );
ASM_PFX(EfiReadMsr):
movl 4(%esp), %ecx # Index
rdmsr
ret
#EfiReadMsr ENDP
#VOID
#EfiWriteMsr (
# IN UINT32 Index,
# IN UINT64 Value
# );
ASM_PFX(EfiWriteMsr):
movl 4(%esp), %ecx # Index
movl 8(%esp), %eax # DWORD PTR Value[0]
movl 0xC(%esp), %edx # DWORD PTR Value[4]
wrmsr
ret
#EfiWriteMsr ENDP
#UINT64
#EfiReadTsc (
# VOID
# )
ASM_PFX(EfiReadTsc):
rdtsc
ret
#EfiReadTsc ENDP
#VOID
#EfiDisableCache (
# VOID
#)
ASM_PFX(EfiDisableCache):
movl %cr0, %eax
bswapl %eax
andb $0x60, %al
cmpb $0x60, %al
je L2
movl %cr0, %eax
orl $0x60000000, %eax
movl %eax, %cr0
wbinvd
L2:
ret
#EfiDisableCache ENDP
#VOID
#EfiEnableCache (
# VOID
# )
ASM_PFX(EfiEnableCache):
wbinvd
movl %cr0, %eax
andl $0x9fffffff, %eax
movl %eax, %cr0
ret
#EfiEnableCache ENDP
#UINT32
#EfiGetEflags (
# VOID
# )
ASM_PFX(EfiGetEflags):
pushfl
popl %eax
ret
#EfiGetEflags ENDP
#VOID
#EfiDisableInterrupts (
# VOID
# )
ASM_PFX(EfiDisableInterrupts):
cli
ret
#EfiDisableInterrupts ENDP
#VOID
#EfiEnableInterrupts (
# VOID
# )
ASM_PFX(EfiEnableInterrupts):
sti
ret
#EfiEnableInterrupts ENDP
#VOID
#EfiCpuidExt (
# IN UINT32 RegisterInEax,
# IN UINT32 CacheLevel,
# OUT EFI_CPUID_REGISTER *Regs
# )
ASM_PFX(EfiCpuidExt):
push %ebx
push %edi
push %esi
pushal
movl 0x30(%esp), %eax # RegisterInEax
movl 0x34(%esp), %ecx # CacheLevel
cpuid
movl 0x38(%esp), %edi # DWORD PTR Regs
movl %eax, (%edi) # Reg->RegEax
movl %ebx, 4(%edi) # Reg->RegEbx
movl %ecx, 8(%edi) # Reg->RegEcx
movl %edx, 0xC(%edi) # Reg->RegEdx

View File

@@ -0,0 +1,211 @@
;
; This file contains an 'Intel Sample Driver' and is
; licensed for Intel CPUs and chipsets under the terms of your
; license agreement with Intel or your vendor. This file may
; be modified by the user, subject to additional terms of the
; license agreement
;
;
; Copyright (c) 1999 - 2014, 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 that 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.
;
;
;Module Name:
;
; CpuIA32.c
;
;Abstract:
;
;--*/
;#include "CpuIA32.h"
;---------------------------------------------------------------------------
.586p
.model flat,C
.code
;---------------------------------------------------------------------------
;VOID
;EfiHalt (
; VOID
;)
EfiHalt PROC C PUBLIC
hlt
ret
EfiHalt ENDP
;VOID
;EfiWbinvd (
; VOID
;)
EfiWbinvd PROC C PUBLIC
wbinvd
ret
EfiWbinvd ENDP
;VOID
;EfiInvd (
; VOID
;)
EfiInvd PROC C PUBLIC
invd
ret
EfiInvd ENDP
;VOID
;EfiCpuid (IN UINT32 RegisterInEax,
; OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
EfiCpuid PROC C PUBLIC
push ebp
mov ebp, esp
push ebx
push esi
push edi
pushad
mov eax, dword ptr[ebp + 8] ;egisterInEax
cpuid
cmp dword ptr[ebp + 0Ch], 0 ; Reg
je @F
mov edi,dword ptr [ebp+0Ch] ; Reg
mov dword ptr [edi],eax ; Reg->RegEax
mov dword ptr [edi+4],ebx ; Reg->RegEbx
mov dword ptr [edi+8],ecx ; Reg->RegEcx
mov dword ptr [edi+0Ch],edx ; Reg->RegEdx
@@:
popad
pop edi
pop esi
pop ebx
pop ebp
ret
EfiCpuid ENDP
;UINT64
;EfiReadMsr (
; IN UINT32 Index
; );
EfiReadMsr PROC C PUBLIC
mov ecx, dword ptr [esp + 4]; Index
rdmsr
ret
EfiReadMsr ENDP
;VOID
;EfiWriteMsr (
; IN UINT32 Index,
; IN UINT64 Value
; );
EfiWriteMsr PROC C PUBLIC
mov ecx, dword ptr [esp+4]; Index
mov eax, dword ptr [esp+8]; DWORD PTR Value[0]
mov edx, dword ptr [esp+0Ch]; DWORD PTR Value[4]
wrmsr
ret
EfiWriteMsr ENDP
;UINT64
;EfiReadTsc (
; VOID
; )
EfiReadTsc PROC C PUBLIC
rdtsc
ret
EfiReadTsc ENDP
;VOID
;EfiDisableCache (
; VOID
;)
EfiDisableCache PROC C PUBLIC
mov eax, cr0
bswap eax
and al, 60h
cmp al, 60h
je @F
mov eax, cr0
or eax, 060000000h
mov cr0, eax
wbinvd
@@:
ret
EfiDisableCache ENDP
;VOID
;EfiEnableCache (
; VOID
; )
EfiEnableCache PROC C PUBLIC
wbinvd
mov eax, cr0
and eax, 09fffffffh
mov cr0, eax
ret
EfiEnableCache ENDP
;UINT32
;EfiGetEflags (
; VOID
; )
EfiGetEflags PROC C PUBLIC
pushfd
pop eax
ret
EfiGetEflags ENDP
;VOID
;EfiDisableInterrupts (
; VOID
; )
EfiDisableInterrupts PROC C PUBLIC
cli
ret
EfiDisableInterrupts ENDP
;VOID
;EfiEnableInterrupts (
; VOID
; )
EfiEnableInterrupts PROC C PUBLIC
sti
ret
EfiEnableInterrupts ENDP
;VOID
;EfiCpuidExt (
; IN UINT32 RegisterInEax,
; IN UINT32 CacheLevel,
; OUT EFI_CPUID_REGISTER *Regs
; )
EfiCpuidExt PROC C PUBLIC USES ebx edi esi
pushad
mov eax, dword ptr [esp + 30h] ; RegisterInEax
mov ecx, dword ptr [esp + 34h] ; CacheLevel
cpuid
mov edi, dword ptr [esp + 38h] ; DWORD PTR Regs
mov dword ptr [edi], eax ; Reg->RegEax
mov dword ptr [edi + 4], ebx ; Reg->RegEbx

View File

@@ -0,0 +1,182 @@
/** @file
Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.
Module Name:
CpuIA32.c
Abstract:
--*/
#include <Library/CpuIA32.h>
VOID
EfiHalt (VOID)
{
__asm {
hlt
}
}
VOID
EfiWbinvd (VOID)
{
__asm {
wbinvd
}
}
VOID
EfiInvd (VOID)
{
__asm {
invd
}
}
VOID
EfiCpuid (IN UINT32 RegisterInEax,
OUT EFI_CPUID_REGISTER *Reg OPTIONAL)
{
__asm {
pushad
mov eax, RegisterInEax
cpuid
cmp Reg, 0
je _Exit
mov edi, DWORD PTR Reg
mov DWORD PTR [edi].RegEax, eax ; Reg->RegEax
mov DWORD PTR [edi].RegEbx, ebx ; Reg->RegEbx
mov DWORD PTR [edi].RegEcx, ecx ; Reg->RegEcx
mov DWORD PTR [edi].RegEdx, edx ; Reg->RegEdx
_Exit:
popad
}
}
UINT64
EfiReadMsr (IN UINT32 Index)
{
__asm {
mov ecx, Index
rdmsr
}
}
VOID
EfiWriteMsr (
IN UINT32 Index,
IN UINT64 Value
)
{
__asm {
mov ecx, Index
mov eax, DWORD PTR Value[0]
mov edx, DWORD PTR Value[4]
wrmsr
}
}
UINT64
EfiReadTsc (VOID)
{
__asm {
rdtsc
}
}
VOID
EfiDisableCache (VOID)
{
__asm {
mov eax, cr0
bswap eax
and al, 60h
cmp al, 60h
je Exit
mov eax, cr0
or eax, 060000000h
mov cr0, eax
wbinvd
Exit:
}
}
VOID
EfiEnableCache (VOID)
{
__asm {
wbinvd
mov eax, cr0
and eax, 09fffffffh
mov cr0, eax
}
}
UINT32
EfiGetEflags (
VOID
)
{
__asm {
pushfd
pop eax
}
}
VOID
EfiDisableInterrupts (VOID)
{
__asm {
cli
}
}
VOID
EfiEnableInterrupts (
VOID
)
{
__asm {
sti
}
}
VOID
EfiCpuidExt (
IN UINT32 RegisterInEax,
IN UINT32 CacheLevel,
OUT EFI_CPUID_REGISTER *Regs
)
{
__asm {
pushad
mov eax, RegisterInEax
mov ecx, CacheLevel
cpuid
mov edi, DWORD PTR Regs

View File

@@ -0,0 +1,212 @@
#
#
# Copyright (c) 1999 - 2014, 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 that 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.
#
#
#
#* Module Name:
#*
#* Cpu.asm
#*
#* Abstract:
#*
#------------------------------------------------------------------------------
##include <EfiBind.h>
.globl ASM_PFX(EfiHalt)
.globl ASM_PFX(EfiWbinvd)
.globl ASM_PFX(EfiInvd)
.globl ASM_PFX(EfiCpuid)
.globl ASM_PFX(EfiReadTsc)
.globl ASM_PFX(EfiDisableCache)
.globl ASM_PFX(EfiEnableCache)
.globl ASM_PFX(EfiReadMsr)
.globl ASM_PFX(EfiWriteMsr)
.globl ASM_PFX(EfiGetEflags)
.globl ASM_PFX(EfiDisableInterrupts)
.globl ASM_PFX(EfiEnableInterrupts)
.globl ASM_PFX(EfiCpuidExt)
.text
#------------------------------------------------------------------------------
# VOID
# EfiHalt (
# VOID
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiHalt):
hlt
retq
#------------------------------------------------------------------------------
# VOID
# EfiWbinvd (
# VOID
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiWbinvd):
wbinvd
retq
#------------------------------------------------------------------------------
# VOID
# EfiInvd (
# VOID
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiInvd):
invd
retq
#------------------------------------------------------------------------------
# VOID
# EfiCpuid (
# IN UINT32 RegisterInEax, // rcx
# OUT EFI_CPUID_REGISTER *Reg OPTIONAL // rdx
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiCpuid):
push %rbx
mov %rdx,%r8
mov %rcx,%rax
cpuid
cmp $0x0,%r8
je _Exit
mov %eax,(%r8)
mov %ebx,0x4(%r8)
mov %ecx,0x8(%r8)
mov %edx,0xc(%r8)
_Exit:
pop %rbx
retq
#------------------------------------------------------------------------------
# UINT64
# EfiReadMsr (
# IN UINT32 Index, // rcx
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiReadMsr):
rdmsr
shl $0x20,%rdx
or %rdx,%rax
retq
#------------------------------------------------------------------------------
# VOID
# EfiWriteMsr (
# IN UINT32 Index, // rcx
# IN UINT64 Value // rdx
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiWriteMsr):
mov %rdx,%rax
sar $0x20,%rdx
wrmsr
retq
#------------------------------------------------------------------------------
# UINT64
# EfiReadTsc (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiReadTsc):
rdtsc
shl $0x20,%rax
shrd $0x20,%rdx,%rax
retq
#------------------------------------------------------------------------------
# VOID
# EfiDisableCache (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiDisableCache):
# added a check to see if cache is already disabled. If it is, then skip.
mov %cr0,%rax
and $0x60000000,%rax
cmp $0x0,%rax
jne 1f
mov %cr0,%rax
or $0x60000000,%rax
mov %rax,%cr0
wbinvd
1:
retq
#------------------------------------------------------------------------------
# VOID
# EfiEnableCache (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiEnableCache):
wbinvd
mov %cr0,%rax
and $0xffffffff9fffffff,%rax
mov %rax,%cr0
retq
#------------------------------------------------------------------------------
# UINTN
# EfiGetEflags (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiGetEflags):
pushfq
pop %rax
retq
#------------------------------------------------------------------------------
# VOID
# EfiDisableInterrupts (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiDisableInterrupts):
cli
ret
#------------------------------------------------------------------------------
# VOID
# EfiEnableInterrupts (
# VOID
# );
#------------------------------------------------------------------------------
ASM_PFX(EfiEnableInterrupts):
sti
ret
#------------------------------------------------------------------------------
# VOID
# EfiCpuidExt (
# IN UINT32 RegisterInEax,
# IN UINT32 CacheLevel,
# OUT EFI_CPUID_REGISTER *Regs
# )
#------------------------------------------------------------------------------
ASM_PFX(EfiCpuidExt):
push %rbx

View File

@@ -0,0 +1,227 @@
TITLE Cpu.asm: Assembly code for the x64 resources
;
; This file contains an 'Intel Sample Driver' and is
; licensed for Intel CPUs and chipsets under the terms of your
; license agreement with Intel or your vendor. This file may
; be modified by the user, subject to additional terms of the
; license agreement
;
;
; Copyright (c) 1999 - 2014, 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 that 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.
;
;
;
;
;
;* Module Name:
;*
;* Cpu.asm
;*
;* Abstract:
;*
;------------------------------------------------------------------------------
text SEGMENT
;------------------------------------------------------------------------------
; VOID
; EfiHalt (
; VOID
; )
;------------------------------------------------------------------------------
EfiHalt PROC PUBLIC
hlt
ret
EfiHalt ENDP
;------------------------------------------------------------------------------
; VOID
; EfiWbinvd (
; VOID
; )
;------------------------------------------------------------------------------
EfiWbinvd PROC PUBLIC
wbinvd
ret
EfiWbinvd ENDP
;------------------------------------------------------------------------------
; VOID
; EfiInvd (
; VOID
; )
;------------------------------------------------------------------------------
EfiInvd PROC PUBLIC
invd
ret
EfiInvd ENDP
;------------------------------------------------------------------------------
; VOID
; EfiCpuid (
; IN UINT32 RegisterInEax, // rcx
; OUT EFI_CPUID_REGISTER *Reg OPTIONAL // rdx
; )
;------------------------------------------------------------------------------
EfiCpuid PROC PUBLIC
push rbx
mov r8, rdx ; r8 = *Reg
mov rax, rcx ; RegisterInEax
cpuid
cmp r8, 0
je _Exit
mov [r8 + 0], eax ; Reg->RegEax
mov [r8 + 4], ebx ; Reg->RegEbx
mov [r8 + 8], ecx ; Reg->RegEcx
mov [r8 + 12], edx ; Reg->RegEdx
_Exit:
pop rbx
ret
EfiCpuid ENDP
;------------------------------------------------------------------------------
; UINT64
; EfiReadMsr (
; IN UINT32 Index, // rcx
; )
;------------------------------------------------------------------------------
EfiReadMsr PROC PUBLIC
rdmsr
sal rdx, 32 ; edx:eax -> rax
or rax, rdx ; rax = edx:eax
ret
EfiReadMsr ENDP
;------------------------------------------------------------------------------
; VOID
; EfiWriteMsr (
; IN UINT32 Index, // rcx
; IN UINT64 Value // rdx
; )
;------------------------------------------------------------------------------
EfiWriteMsr PROC PUBLIC
mov rax, rdx ; rdx = Value
sar rdx, 32 ; convert rdx to edx upper 32-bits
wrmsr ; wrmsr[ecx] result = edx:eax
ret
EfiWriteMsr ENDP
;------------------------------------------------------------------------------
; UINT64
; EfiReadTsc (
; VOID
; );
;------------------------------------------------------------------------------
EfiReadTsc PROC PUBLIC
rdtsc
shl rax, 32
shrd rax, rdx, 32
ret
EfiReadTsc ENDP
;------------------------------------------------------------------------------
; VOID
; EfiDisableCache (
; VOID
; );
;------------------------------------------------------------------------------
EfiDisableCache PROC PUBLIC
; added a check to see if cache is already disabled. If it is, then skip.
mov rax, cr0
and rax, 060000000h
cmp rax, 0
jne @f
mov rax, cr0
or rax, 060000000h
mov cr0, rax
wbinvd
@@:
ret
EfiDisableCache ENDP
;------------------------------------------------------------------------------
; VOID
; EfiEnableCache (
; VOID
; );
;------------------------------------------------------------------------------
EfiEnableCache PROC PUBLIC
wbinvd
mov rax, cr0
and rax, 09fffffffh
mov cr0, rax
ret
EfiEnableCache ENDP
;------------------------------------------------------------------------------
; UINTN
; EfiGetEflags (
; VOID
; );
;------------------------------------------------------------------------------
EfiGetEflags PROC PUBLIC
pushfq
pop rax
ret
EfiGetEflags ENDP
;------------------------------------------------------------------------------
; VOID
; EfiDisableInterrupts (
; VOID
; );
;------------------------------------------------------------------------------
EfiDisableInterrupts PROC PUBLIC
cli
ret
EfiDisableInterrupts ENDP
;------------------------------------------------------------------------------
; VOID
; EfiEnableInterrupts (
; VOID
; );
;------------------------------------------------------------------------------
EfiEnableInterrupts PROC PUBLIC
sti
ret
EfiEnableInterrupts ENDP
;------------------------------------------------------------------------------
; VOID
; EfiCpuidExt (
; IN UINT32 RegisterInEax,
; IN UINT32 CacheLevel,
; OUT EFI_CPUID_REGISTER *Regs
; )
;------------------------------------------------------------------------------
EfiCpuidExt PROC PUBLIC
push rbx
mov rax, rcx ; rax = RegisterInEax
mov rcx, rdx ; rcx = CacheLevel
cpuid