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:
qwang12 2008-08-27 13:49:54 +00:00
parent 070f0cf7f2
commit 9a1ed79890
2 changed files with 209 additions and 0 deletions

View File

@ -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

View File

@ -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