diff options
Diffstat (limited to 'EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32')
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/CpuIA32.asm | 234 | ||||
-rw-r--r-- | EDK/Foundation/Cpu/Pentium/CpuIA32Lib/IA32/IA32Type.inc | 34 |
2 files changed, 268 insertions, 0 deletions
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 |