123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /** @file
- Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
-
- SPDX-License-Identifier: BSD-2-Clause-Patent
-
- 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
- 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
- }
- }
|