diff options
Diffstat (limited to 'EDK/Foundation/Cpu/Pentium')
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib.cif | 15 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib.mak | 102 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib.sdl | 26 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/CpuIA32Lib.inf | 43 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/EfiCpuVersion.c | 73 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm | 234 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/IA32Type.inc | 34 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/x64/Cpu.asm | 215 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/Include/CpuIA32.h | 372 |
9 files changed, 1114 insertions, 0 deletions
diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.cif b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.cif new file mode 100644 index 0000000..dacee8d --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.cif @@ -0,0 +1,15 @@ +<component> + name = "CpuIA32Lib" + category = ModulePart + LocalRoot = "EDK\Foundation\Cpu\Pentium\" + RefName = "CpuIA32Lib" +[files] +"CpuIA32Lib.sdl" +"CpuIA32Lib.mak" +"Include\CpuIA32.h" +"CpuIA32Lib\EfiCpuVersion.c" +"CpuIA32Lib\x64\Cpu.asm" +"CpuIA32Lib\CpuIA32Lib.inf" +"CpuIA32Lib\IA32\CpuIA32.asm" +"CpuIA32Lib\IA32\IA32Type.inc" +<endComponent> diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.mak b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.mak new file mode 100644 index 0000000..e9e688d --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.mak @@ -0,0 +1,102 @@ +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#********************************************************************** + +#********************************************************************** +# $Header: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/CpuIA32Lib/CpuIA32Lib.mak 1 1/20/12 4:00a Jeffch $ +# +# $Revision: 1 $ +# +# $Date: 1/20/12 4:00a $ +#********************************************************************** +# Revision History +# ---------------- +# $Log: /Alaska/SOURCE/Modules/SharkBayRefCodes/IntelEDK/CpuIA32Lib/CpuIA32Lib.mak $ +# +# 1 1/20/12 4:00a Jeffch +# Create Intel EDK 1117 Patch 7. +# +# 1 9/27/11 6:22a Wesleychen +# Intel EDK initially releases. +# +# 3 4/29/11 2:30a Iminglin +# [TAG] EIP59360 +# [Category] Improvement +# [Description] EDK- link error:unresolved external EfiCpuVersion +# When a driver uses the function EfiCpuVersion, below link error will +# happen. +# +# error LNK2001: unresolved external symbol EfiCpuVersion +# +# [Files] CpuIA32Lib.mak +# +# 2 9/02/09 3:10a Iminglin +# EIP24919 +# +#********************************************************************** +#<AMI_FHDR_START> +# +# Name: CpuIA32Lib.mak +# +# Description: +# +#<AMI_FHDR_END> +#********************************************************************** + +$(CPUIA32LIB) : CpuIA32Lib + +!IF "$(PROCESSOR)"=="IA32" +CpuIA32Lib_OBJECTS=\ +$$(BUILD_DIR)\$(CpuIA32Lib_DIR)\CpuIA32Lib\IA32\CpuIA32.obj +!ELSEIF "$(PROCESSOR)"=="x64" +CpuIA32Lib_OBJECTS_DXE=\ +$$(BUILD_DIR)\$(CpuIA32Lib_DIR)\CpuIA32Lib\x64\Cpu.obj\ +$$(BUILD_DIR)\$(CpuIA32Lib_DIR)\CpuIA32Lib\EfiCpuVersion.obj +CpuIA32Lib_OBJECTS_PEI=\ +$$(BUILD_DIR)\$(CpuIA32Lib_DIR)\CpuIA32Lib\IA32\CpuIA32.obj +!ENDIF + +CpuIA32Lib : $(BUILD_DIR)\CpuIA32Lib.mak CpuIA32LibBin + +$(BUILD_DIR)\CpuIA32Lib.mak : $(CpuIA32Lib_DIR)\$(@B).cif $(CpuIA32Lib_DIR)\$(@B).mak $(BUILD_RULES) + $(CIF2MAK) $(CpuIA32Lib_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS) + +CpuIA32LibBin : +!IF "$(PROCESSOR)"=="x64" + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\CpuIA32Lib.mak all\ + TYPE=LIBRARY\ + "OBJECTS=$(CpuIA32Lib_OBJECTS_DXE)" + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS) BUILD_DIR=$(BUILD_DIR)\IA32\ + /f $(BUILD_DIR)\CpuIA32Lib.mak all\ + TYPE=PEI_LIBRARY\ + "OBJECTS=$(CpuIA32Lib_OBJECTS_PEI)" +!ELSE + $(MAKE) /$(MAKEFLAGS) $(EDK_DEFAULTS)\ + /f $(BUILD_DIR)\CpuIA32Lib.mak all\ + TYPE=LIBRARY\ + "OBJECTS=$(CpuIA32Lib_OBJECTS)" +!ENDIF +#********************************************************************** +#********************************************************************** +#** ** +#** (C)Copyright 1985-2009, American Megatrends, Inc. ** +#** ** +#** All Rights Reserved. ** +#** ** +#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +#** ** +#** Phone: (770)-246-8600 ** +#** ** +#********************************************************************** +#**********************************************************************
\ No newline at end of file diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.sdl b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.sdl new file mode 100644 index 0000000..fdab18f --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib.sdl @@ -0,0 +1,26 @@ +TOKEN + Name = "CpuIA32Lib_SUPPORT" + Value = "1" + Help = "Main switch to enable CpuIA32Lib support in Project" + TokenType = Boolean + TargetEQU = Yes + TargetMAK = Yes + Master = Yes +End + +TOKEN + Name = "CPUIA32LIB" + Value = "$$(LIB_BUILD_DIR)\CpuIA32Lib.lib" + TokenType = Expression + TargetMAK = Yes +End + +PATH + Name = "CpuIA32Lib_DIR" +End + +MODULE + Help = "Includes CpuIA32Lib.mak to Project" + File = "CpuIA32Lib.mak" +End + diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/CpuIA32Lib.inf b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/CpuIA32Lib.inf new file mode 100644 index 0000000..7362aab --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/CpuIA32Lib.inf @@ -0,0 +1,43 @@ +#/*++ +# +# Copyright (c) 2004 - 2005, 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. +# +# Module Name: +# +# CpuIA32Lib.inf +# +# Abstract: +# +# Component description file for the Cpu IA32 library. +# +#--*/ + +[defines] +BASE_NAME = CpuIA32Lib +COMPONENT_TYPE = LIBRARY + +[sources.common] + EfiCpuVersion.c + +[sources.ia32] + Ia32\CpuIA32.asm + +[sources.x64] + x64\Cpu.asm +[includes.common] + $(EDK_SOURCE)\Foundation\Efi + $(EDK_SOURCE)\Foundation\Efi\Include + $(EDK_SOURCE)\Foundation\Framework\Include + . + $(EDK_SOURCE)\Foundation\Cpu\Pentium\Include + $(EDK_SOURCE)\Foundation\Include + +[nmake.common] + C_STD_INCLUDE= diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/EfiCpuVersion.c b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/EfiCpuVersion.c new file mode 100644 index 0000000..eea033b --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/EfiCpuVersion.c @@ -0,0 +1,73 @@ +/*++ + +Copyright (c) 2004 - 2006, 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. + +Module Name: + + EfiCpuVersion.c + +Abstract: + + Provide cpu version extract considering extended family & model ID. +--*/ + +#include "CpuIA32.h" + +VOID +EfiCpuVersion ( + IN OUT UINT16 *FamilyId, OPTIONAL + IN OUT UINT8 *Model, OPTIONAL + IN OUT UINT8 *SteppingId, OPTIONAL + IN OUT UINT8 *Processor OPTIONAL + ) +/*++ + +Routine Description: + Extract CPU detail version infomation + +Arguments: + FamilyId - FamilyId, including ExtendedFamilyId + Model - Model, including ExtendedModel + SteppingId - SteppingId + Processor - Processor + +--*/ +{ + 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 |= (Register.RegEax >> 12) & 0xF0; + } + } + + if (FamilyId != NULL) { + *FamilyId = TempFamilyId; + if (TempFamilyId == 0xF) { + *FamilyId = *FamilyId + (UINT16) ((Register.RegEax >> 20) & 0xFF); + } + } + } +} diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm new file mode 100644 index 0000000..2a64c66 --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm @@ -0,0 +1,234 @@ +TITLE CpuIA32.asm: Assembly code for the IA-32 resources + +;***************************************************************************** +;* +;* Copyright (c) 2004 - 2006, 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. +;* +;* Module Name: +;* +;* CpuIA32.asm +;* +;* Abstract: +;* +;***************************************************************************** + + + .686P + .MODEL FLAT,C + .CODE + + INCLUDE IA32Type.inc + + + +;------------------------------------------------------------------------------ +; 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, +; OUT EFI_CPUID_REGISTER *Reg OPTIONAL +; ) +;------------------------------------------------------------------------------ +EfiCpuid PROC PUBLIC RegisterInEax:UINT32, Reg:PTR EFI_CPUID_REGISTER + pushad + + mov eax, RegisterInEax + cpuid + cmp Reg, 0 + je _Exit + mov edi, DWORD PTR Reg + ASSUME edi: PTR EFI_CPUID_REGISTER + 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 + ret +EfiCpuid ENDP + +;------------------------------------------------------------------------------ +; UINT64 +; EfiReadMsr ( +; IN UINT32 Index, +; ) +;------------------------------------------------------------------------------ +EfiReadMsr PROC PUBLIC Index:UINT32 + push ecx + mov ecx, Index + rdmsr + pop ecx + ret +EfiReadMsr ENDP + +;------------------------------------------------------------------------------ +; VOID +; EfiWriteMsr ( +; IN UINT32 Index, +; IN UINT64 Value +; ) +;------------------------------------------------------------------------------ +EfiWriteMsr PROC PUBLIC Index:UINT32, Value:UINT64 + pushad + mov ecx, Index + mov eax, DWORD PTR Value[0] + mov edx, DWORD PTR Value[4] + wrmsr + popad + ret +EfiWriteMsr ENDP + + +;------------------------------------------------------------------------------ +; UINT64 +; EfiReadTsc ( +; VOID +; ); +;------------------------------------------------------------------------------ +EfiReadTsc PROC PUBLIC + rdtsc + ret +EfiReadTsc ENDP + +;------------------------------------------------------------------------------ +; VOID +; EfiDisableCache ( +; VOID +; ); +;------------------------------------------------------------------------------ +EfiDisableCache PROC PUBLIC +; added a check to see if cache is already disabled. If it is, then skip. + push eax + mov eax, cr0 + bswap eax + and al, 60h + cmp al, 60h + je @f + wbinvd + mov eax, cr0 + or eax, 060000000h + mov cr0, eax +@@: + pop eax + ret +EfiDisableCache ENDP + +;------------------------------------------------------------------------------ +; VOID +; EfiEnableCache ( +; VOID +; ); +;------------------------------------------------------------------------------ +EfiEnableCache PROC PUBLIC + push eax + wbinvd + mov eax, cr0 + and eax, 09fffffffh + mov cr0, eax + pop eax + ret +EfiEnableCache ENDP + +;------------------------------------------------------------------------------ +; UINT32 +; EfiGetEflags ( +; VOID +; ); +;------------------------------------------------------------------------------ +EfiGetEflags PROC PUBLIC + pushfd + pop eax + 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 \ + RegisterInEax:UINT32, \ + CacheLevel:UINT32, \ + Regs:PTR EFI_CPUID_REGISTER + pushad + + mov eax, RegisterInEax + mov ecx, CacheLevel + cpuid + mov edi, DWORD PTR Regs + ASSUME edi: PTR EFI_CPUID_REGISTER + 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 + + popad + ret +EfiCpuidExt ENDP +END diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/IA32Type.inc b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/IA32Type.inc new file mode 100644 index 0000000..069656e --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/IA32Type.inc @@ -0,0 +1,34 @@ +; +; Copyright (c) 2004, 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. +; +; Module Name: +; +; IA32Type.inc +; + +UINT8 TYPEDEF BYTE +UINT16 TYPEDEF WORD +UINT32 TYPEDEF DWORD +UINT64 TYPEDEF QWORD +UINTN TYPEDEF UINT32 +BOOLEAN TYPEDEF UINT8 +EFI_STATUS TYPEDEF UINTN + +EFI_PHYSICAL_ADDRESS TYPEDEF UINT64 + + +@EFI_CPUID_REGISTER STRUCT 4t +RegEax DWORD ? +RegEbx DWORD ? +RegEcx DWORD ? +RegEdx DWORD ? +@EFI_CPUID_REGISTER ENDS + +EFI_CPUID_REGISTER TYPEDEF @EFI_CPUID_REGISTER diff --git a/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/x64/Cpu.asm b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/x64/Cpu.asm new file mode 100644 index 0000000..52cab40 --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/CpuIA32Lib/x64/Cpu.asm @@ -0,0 +1,215 @@ +TITLE Cpu.asm: Assembly code for the x64 resources + +;------------------------------------------------------------------------------ +;* +;* Copyright (c) 2005 - 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. +;* +;* 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 + mov [r8 + 0 ], eax ; Reg->RegEax + mov [r8 + 4 ], ebx ; Reg->RegEbx + mov [r8 + 8 ], ecx ; Reg->RegEcx + mov [r8 + 12], edx ; Reg->RegEdx + + pop rbx + ret +EfiCpuidExt ENDP +END diff --git a/EDK/Foundation/Cpu/Pentium/Include/CpuIA32.h b/EDK/Foundation/Cpu/Pentium/Include/CpuIA32.h new file mode 100644 index 0000000..a399954 --- /dev/null +++ b/EDK/Foundation/Cpu/Pentium/Include/CpuIA32.h @@ -0,0 +1,372 @@ +/*++ + +Copyright (c) 2004 - 2006, 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. + +Module Name: + + CpuIA32.h + +Abstract: + +--*/ + +#ifndef _CPU_IA32_H +#define _CPU_IA32_H + +#include "Tiano.h" + +#define IA32API __cdecl + +typedef struct { + UINT32 RegEax; + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; +} EFI_CPUID_REGISTER; + +typedef struct { + UINT32 HeaderVersion; + UINT32 UpdateRevision; + UINT32 Date; + UINT32 ProcessorId; + UINT32 Checksum; + UINT32 LoaderRevision; + UINT32 ProcessorFlags; + UINT32 DataSize; + UINT32 TotalSize; + UINT8 Reserved[12]; +} EFI_CPU_MICROCODE_HEADER; + +typedef struct { + UINT32 ExtendedSignatureCount; + UINT32 ExtendedTableChecksum; + UINT8 Reserved[12]; +} EFI_CPU_MICROCODE_EXTENDED_TABLE_HEADER; + +typedef struct { + UINT32 ProcessorSignature; + UINT32 ProcessorFlag; + UINT32 ProcessorChecksum; +} EFI_CPU_MICROCODE_EXTENDED_TABLE; + +typedef struct { + UINT32 Stepping : 4; + UINT32 Model : 4; + UINT32 Family : 4; + UINT32 Type : 2; + UINT32 Reserved1 : 2; + UINT32 ExtendedModel : 4; + UINT32 ExtendedFamily : 8; + UINT32 Reserved2 : 4; +} EFI_CPU_VERSION; + +#define EFI_CPUID_SIGNATURE 0x0 +#define EFI_CPUID_VERSION_INFO 0x1 +#define EFI_CPUID_CACHE_INFO 0x2 +#define EFI_CPUID_SERIAL_NUMBER 0x3 +#define EFI_CPUID_EXTENDED_FUNCTION 0x80000000 +#define EFI_CPUID_EXTENDED_CPU_SIG 0x80000001 +#define EFI_CPUID_BRAND_STRING1 0x80000002 +#define EFI_CPUID_BRAND_STRING2 0x80000003 +#define EFI_CPUID_BRAND_STRING3 0x80000004 + +#define EFI_MSR_IA32_PLATFORM_ID 0x17 +#define EFI_MSR_IA32_APIC_BASE 0x1B +#define EFI_MSR_EBC_HARD_POWERON 0x2A +#define EFI_MSR_EBC_SOFT_POWERON 0x2B +#define BINIT_DRIVER_DISABLE 0x40 +#define INTERNAL_MCERR_DISABLE 0x20 +#define INITIATOR_MCERR_DISABLE 0x10 +#define EFI_MSR_EBC_FREQUENCY_ID 0x2C +#define EFI_MSR_IA32_BIOS_UPDT_TRIG 0x79 +#define EFI_MSR_IA32_BIOS_SIGN_ID 0x8B +#define EFI_MSR_PSB_CLOCK_STATUS 0xCD +#define EFI_APIC_GLOBAL_ENABLE 0x800 +#define EFI_MSR_IA32_MISC_ENABLE 0x1A0 +#define LIMIT_CPUID_MAXVAL_ENABLE_BIT 0x00400000 +#define AUTOMATIC_THERMAL_CONTROL_ENABLE_BIT 0x00000008 +#define COMPATIBLE_FPU_OPCODE_ENABLE_BIT 0x00000004 +#define LOGICAL_PROCESSOR_PRIORITY_ENABLE_BIT 0x00000002 +#define FAST_STRING_ENABLE_BIT 0x00000001 + +#define EFI_CACHE_VARIABLE_MTRR_BASE 0x200 +#define EFI_CACHE_VARIABLE_MTRR_END 0x20F +#define EFI_CACHE_IA32_MTRR_DEF_TYPE 0x2FF +#define EFI_CACHE_MTRR_VALID 0x800 +#define EFI_CACHE_FIXED_MTRR_VALID 0x400 +#define EFI_CACHE_VALID_ADDRESS 0xFFFFFF000 +#define EFI_MSR_VALID_MASK 0xFFFFFFFFF +#define EFI_CACHE_VALID_EXTENDED_ADDRESS 0xFFFFFFFFFF000 +#define EFI_MSR_VALID_EXTENDED_MASK 0xFFFFFFFFFFFFF + +#define EFI_IA32_MTRR_FIX64K_00000 0x250 +#define EFI_IA32_MTRR_FIX16K_80000 0x258 +#define EFI_IA32_MTRR_FIX16K_A0000 0x259 +#define EFI_IA32_MTRR_FIX4K_C0000 0x268 +#define EFI_IA32_MTRR_FIX4K_C8000 0x269 +#define EFI_IA32_MTRR_FIX4K_D0000 0x26A +#define EFI_IA32_MTRR_FIX4K_D8000 0x26B +#define EFI_IA32_MTRR_FIX4K_E0000 0x26C +#define EFI_IA32_MTRR_FIX4K_E8000 0x26D +#define EFI_IA32_MTRR_FIX4K_F0000 0x26E +#define EFI_IA32_MTRR_FIX4K_F8000 0x26F + +#define EFI_IA32_MCG_CAP 0x179 +#define EFI_IA32_MCG_CTL 0x17B +#define EFI_IA32_MC0_CTL 0x400 +#define EFI_IA32_MC0_STATUS 0x401 + +#define EFI_IA32_PERF_STATUS 0x198 +#define EFI_IA32_PERF_CTL 0x199 + +#define EFI_CACHE_UNCACHEABLE 0 +#define EFI_CACHE_WRITECOMBINING 1 +#define EFI_CACHE_WRITETHROUGH 4 +#define EFI_CACHE_WRITEPROTECTED 5 +#define EFI_CACHE_WRITEBACK 6 + +// +// Combine f(FamilyId), m(Model), s(SteppingId) to a single 32 bit number +// +#define EfiMakeCpuVersion(f, m, s) \ + (((UINT32) (f) << 16) | ((UINT32) (m) << 8) | ((UINT32) (s))) + +VOID +IA32API +EfiHalt ( + VOID + ) +; + +/*++ +Routine Description: + Halt the Cpu +Arguments: + None +Returns: + None +--*/ +VOID +IA32API +EfiWbinvd ( + VOID + ) +; + +/*++ +Routine Description: + Write back and invalidate the Cpu cache +Arguments: + None +Returns: + None +--*/ +VOID +IA32API +EfiInvd ( + VOID + ) +; + +/*++ +Routine Description: + Invalidate the Cpu cache +Arguments: + None +Returns: + None +--*/ +VOID +IA32API +EfiCpuid ( + IN UINT32 RegisterInEax, + OUT EFI_CPUID_REGISTER *Regs + ) +; + +/*++ +Routine Description: + Get the Cpu info by excute the CPUID instruction +Arguments: + RegisterInEax: -The input value to put into register EAX + Regs: -The Output value +Returns: + None +--*/ + +VOID +IA32API +EfiCpuidExt ( + IN UINT32 RegisterInEax, + IN UINT32 CacheLevel, + OUT EFI_CPUID_REGISTER *Regs + ) +/*++ +Routine Description: + When RegisterInEax != 4, the functionality is the same as EfiCpuid. + When RegisterInEax == 4, the function return the deterministic cache + parameters by excuting the CPUID instruction +Arguments: + RegisterInEax: - The input value to put into register EAX + CacheLevel: - The deterministic cache level + Regs: - The Output value +Returns: + None +--*/ +; + +UINT64 +IA32API +EfiReadMsr ( + IN UINT32 Index + ) +; + +/*++ +Routine Description: + Read Cpu MSR +Arguments: + Index: -The index value to select the register + +Returns: + Return the read data +--*/ +VOID +IA32API +EfiWriteMsr ( + IN UINT32 Index, + IN UINT64 Value + ) +; + +/*++ +Routine Description: + Write Cpu MSR +Arguments: + Index: -The index value to select the register + Value: -The value to write to the selected register +Returns: + None +--*/ +UINT64 +IA32API +EfiReadTsc ( + VOID + ) +; + +/*++ +Routine Description: + Read Time stamp +Arguments: + None +Returns: + Return the read data +--*/ +VOID +IA32API +EfiDisableCache ( + VOID + ) +; + +/*++ +Routine Description: + Writing back and invalidate the cache,then diable it +Arguments: + None +Returns: + None +--*/ +VOID +IA32API +EfiEnableCache ( + VOID + ) +; + +/*++ +Routine Description: + Invalidate the cache,then Enable it +Arguments: + None +Returns: + None +--*/ +UINT32 +IA32API +EfiGetEflags ( + VOID + ) +; + +/*++ +Routine Description: + Get Eflags +Arguments: + None +Returns: + Return the Eflags value +--*/ +VOID +IA32API +EfiDisableInterrupts ( + VOID + ) +; + +/*++ +Routine Description: + Disable Interrupts +Arguments: + None +Returns: + None +--*/ +VOID +IA32API +EfiEnableInterrupts ( + VOID + ) +; + +/*++ +Routine Description: + Enable Interrupts +Arguments: + None +Returns: + None +--*/ + + +VOID +IA32API +EfiCpuVersion ( + IN UINT16 *FamilyId, OPTIONAL + IN UINT8 *Model, OPTIONAL + IN UINT8 *SteppingId, OPTIONAL + IN UINT8 *Processor OPTIONAL + ) +/*++ + +Routine Description: + Extract CPU detail version infomation + +Arguments: + FamilyId - FamilyId, including ExtendedFamilyId + Model - Model, including ExtendedModel + SteppingId - SteppingId + Processor - Processor + +--*/ +; + +#endif |