123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- 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
- ;
- ; SPDX-License-Identifier: BSD-2-Clause-Patent
- ;
- ;
- ;
- ;
- ;
- ;* 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
|