Renamed remotely
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6018 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
208
EdkCompatibilityPkg/Foundation/Cpu/Pentium/CpuIA32Lib/X64/Cpu.S
Normal file
208
EdkCompatibilityPkg/Foundation/Cpu/Pentium/CpuIA32Lib/X64/Cpu.S
Normal 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
|
@@ -0,0 +1,215 @@
|
||||
TITLE Cpu.asm: Assembly code for the x64 resources
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;*
|
||||
;* Copyright (c) 2005 - 2007, 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:
|
||||
;*
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
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
|
||||
invd
|
||||
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
|
Reference in New Issue
Block a user