mirror of https://github.com/acidanthera/audk.git
Add Cpu.S for X64 GCC tool-chain.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5739 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
070f0cf7f2
commit
9a1ed79890
|
@ -34,6 +34,7 @@ COMPONENT_TYPE = LIBRARY
|
|||
[sources.x64]
|
||||
x64/Cpu.asm | MSFT
|
||||
x64/Cpu.asm | INTEL
|
||||
x64/Cpu.S | GCC
|
||||
|
||||
[includes.common]
|
||||
$(EDK_SOURCE)/Foundation/Efi
|
||||
|
|
|
@ -0,0 +1,208 @@
|
|||
#------------------------------------------------------------------------------
|
||||
#*
|
||||
#* Copyright (c) 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:
|
||||
#*
|
||||
#------------------------------------------------------------------------------
|
||||
#include <EfiBind.h>
|
||||
|
||||
.globl ASM_PFX(EfiHalt)
|
||||
.globl ASM_PFX(EfiWbinvd)
|
||||
.globl ASM_PFX(EfiInvd)
|
||||
.globl ASM_PFX(EfiCpuid)
|
||||
.globl ASM_PFX(EfiReadTsc)
|
||||
.globl ASM_PFX(EfiDisableCache)
|
||||
.globl ASM_PFX(EfiEnableCache)
|
||||
.globl ASM_PFX(EfiReadMsr)
|
||||
.globl ASM_PFX(EfiGetEflags)
|
||||
.globl ASM_PFX(EfiDisableInterrupts)
|
||||
.globl ASM_PFX(EfiEnableInterrupts)
|
||||
.globl ASM_PFX(EfiCpuidExt)
|
||||
|
||||
.text
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiHalt (
|
||||
# VOID
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiHalt):
|
||||
hlt
|
||||
retq
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiWbinvd (
|
||||
# VOID
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiWbinvd):
|
||||
wbinvd
|
||||
retq
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiInvd (
|
||||
# VOID
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiInvd):
|
||||
invd
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiCpuid (
|
||||
# IN UINT32 RegisterInEax, // rcx
|
||||
# OUT EFI_CPUID_REGISTER *Reg OPTIONAL // rdx
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiCpuid):
|
||||
push %rbx
|
||||
mov %rdx,%r8
|
||||
mov %rcx,%rax
|
||||
cpuid
|
||||
cmp $0x0,%r8
|
||||
je _Exit
|
||||
mov %eax,(%r8)
|
||||
mov %ebx,0x4(%r8)
|
||||
mov %ecx,0x8(%r8)
|
||||
mov %edx,0xc(%r8)
|
||||
_Exit:
|
||||
pop %rbx
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINT64
|
||||
# EfiReadMsr (
|
||||
# IN UINT32 Index, // rcx
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiReadMsr):
|
||||
rdmsr
|
||||
shl $0x20,%rdx
|
||||
or %rdx,%rax
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiWriteMsr (
|
||||
# IN UINT32 Index, // rcx
|
||||
# IN UINT64 Value // rdx
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiWriteMsr):
|
||||
mov %rdx,%rax
|
||||
sar $0x20,%rdx
|
||||
wrmsr
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINT64
|
||||
# EfiReadTsc (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiReadTsc):
|
||||
rdtsc
|
||||
shl $0x20,%rax
|
||||
shrd $0x20,%rdx,%rax
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiDisableCache (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiDisableCache):
|
||||
# added a check to see if cache is already disabled. If it is, then skip.
|
||||
mov %cr0,%rax
|
||||
and $0x60000000,%rax
|
||||
cmp $0x0,%rax
|
||||
jne 1f
|
||||
mov %cr0,%rax
|
||||
or $0x60000000,%rax
|
||||
mov %rax,%cr0
|
||||
wbinvd
|
||||
1:
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiEnableCache (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiEnableCache):
|
||||
invd
|
||||
mov %cr0,%rax
|
||||
and $0xffffffff9fffffff,%rax
|
||||
mov %rax,%cr0
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# UINTN
|
||||
# EfiGetEflags (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiGetEflags):
|
||||
pushfq
|
||||
pop %rax
|
||||
retq
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiDisableInterrupts (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiDisableInterrupts):
|
||||
cli
|
||||
ret
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiEnableInterrupts (
|
||||
# VOID
|
||||
# );
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiEnableInterrupts):
|
||||
sti
|
||||
ret
|
||||
#------------------------------------------------------------------------------
|
||||
# VOID
|
||||
# EfiCpuidExt (
|
||||
# IN UINT32 RegisterInEax,
|
||||
# IN UINT32 CacheLevel,
|
||||
# OUT EFI_CPUID_REGISTER *Regs
|
||||
# )
|
||||
#------------------------------------------------------------------------------
|
||||
ASM_PFX(EfiCpuidExt):
|
||||
push %rbx
|
||||
mov %rcx,%rax
|
||||
mov %rdx,%rcx
|
||||
cpuid
|
||||
mov %eax,(%r8)
|
||||
mov %ebx,0x4(%r8)
|
||||
mov %ecx,0x8(%r8)
|
||||
mov %edx,0xc(%r8)
|
||||
pop %rbx
|
||||
retq
|
Loading…
Reference in New Issue