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