1# 2# 3# Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved 4# 5 6# This program and the accompanying materials are licensed and made available under 7 8# the terms and conditions of the BSD License that accompanies this distribution. 9 10# The full text of the license may be found at 11 12# http://opensource.org/licenses/bsd-license.php. 13 14# 15 16# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 17 18# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 19 20# 21 22# 23# 24#Module Name: 25# 26# CpuIA32.c 27# 28#Abstract: 29# 30#--*/ 31 32##include "CpuIA32.h" 33#include "EfiBind.h" 34 35#--------------------------------------------------------------------------- 36 .586p: 37 #.MODEL flat,C 38 .code: 39 40#--------------------------------------------------------------------------- 41 42.globl ASM_PFX(EfiHalt) 43.globl ASM_PFX(EfiWbinvd) 44.globl ASM_PFX(EfiInvd) 45.globl ASM_PFX(EfiCpuid) 46.globl ASM_PFX(EfiReadMsr) 47.globl ASM_PFX(EfiWriteMsr) 48.globl ASM_PFX(EfiReadTsc) 49.globl ASM_PFX(EfiDisableCache) 50.globl ASM_PFX(EfiEnableCache) 51.globl ASM_PFX(EfiGetEflags) 52.globl ASM_PFX(EfiDisableInterrupts) 53.globl ASM_PFX(EfiEnableInterrupts) 54.globl ASM_PFX(EfiCpuidExt) 55 56 57#VOID 58#EfiHalt ( 59# VOID 60#) 61ASM_PFX(EfiHalt): 62 hlt 63 ret 64#EfiHalt ENDP 65 66#VOID 67#EfiWbinvd ( 68# VOID 69#) 70ASM_PFX(EfiWbinvd): 71 wbinvd 72 ret 73#EfiWbinvd ENDP 74 75#VOID 76#EfiInvd ( 77# VOID 78#) 79ASM_PFX(EfiInvd): 80 invd 81 ret 82#EfiInvd ENDP 83 84#VOID 85#EfiCpuid (IN UINT32 RegisterInEax, 86# OUT EFI_CPUID_REGISTER *Reg OPTIONAL) 87ASM_PFX(EfiCpuid): 88 pushl %ebp 89 movl %esp, %ebp 90 pushl %ebx 91 pushl %esi 92 pushl %edi 93 pushal 94 95 movl 8(%ebp), %eax #RegisterInEax 96 cpuid 97 cmpl $0, 0xC(%ebp) # Reg 98 je L1 99 movl 0xC(%ebp), %edi # Reg 100 101 movl %eax, (%edi) # Reg->RegEax 102 movl %ebx, 4(%edi) # Reg->RegEbx 103 movl %ecx, 8(%edi) # Reg->RegEcx 104 movl %edx, 0xC(%edi) # Reg->RegEdx 105 106L1: 107 popal 108 popl %edi 109 popl %esi 110 popl %ebx 111 popl %ebp 112 113 ret 114#EfiCpuid ENDP 115 116 117#UINT64 118#EfiReadMsr ( 119# IN UINT32 Index 120# ); 121ASM_PFX(EfiReadMsr): 122 movl 4(%esp), %ecx # Index 123 rdmsr 124 ret 125#EfiReadMsr ENDP 126 127#VOID 128#EfiWriteMsr ( 129# IN UINT32 Index, 130# IN UINT64 Value 131# ); 132ASM_PFX(EfiWriteMsr): 133 movl 4(%esp), %ecx # Index 134 movl 8(%esp), %eax # DWORD PTR Value[0] 135 movl 0xC(%esp), %edx # DWORD PTR Value[4] 136 wrmsr 137 ret 138#EfiWriteMsr ENDP 139 140#UINT64 141#EfiReadTsc ( 142# VOID 143# ) 144ASM_PFX(EfiReadTsc): 145 rdtsc 146 ret 147#EfiReadTsc ENDP 148 149#VOID 150#EfiDisableCache ( 151# VOID 152#) 153ASM_PFX(EfiDisableCache): 154 movl %cr0, %eax 155 bswapl %eax 156 andb $0x60, %al 157 cmpb $0x60, %al 158 je L2 159 movl %cr0, %eax 160 orl $0x60000000, %eax 161 movl %eax, %cr0 162 wbinvd 163L2: 164 ret 165#EfiDisableCache ENDP 166 167#VOID 168#EfiEnableCache ( 169# VOID 170# ) 171ASM_PFX(EfiEnableCache): 172 wbinvd 173 movl %cr0, %eax 174 andl $0x9fffffff, %eax 175 movl %eax, %cr0 176 ret 177#EfiEnableCache ENDP 178 179#UINT32 180#EfiGetEflags ( 181# VOID 182# ) 183ASM_PFX(EfiGetEflags): 184 pushfl 185 popl %eax 186 ret 187#EfiGetEflags ENDP 188 189#VOID 190#EfiDisableInterrupts ( 191# VOID 192# ) 193ASM_PFX(EfiDisableInterrupts): 194 cli 195 ret 196#EfiDisableInterrupts ENDP 197 198#VOID 199#EfiEnableInterrupts ( 200# VOID 201# ) 202ASM_PFX(EfiEnableInterrupts): 203 sti 204 ret 205#EfiEnableInterrupts ENDP 206 207#VOID 208#EfiCpuidExt ( 209# IN UINT32 RegisterInEax, 210# IN UINT32 CacheLevel, 211# OUT EFI_CPUID_REGISTER *Regs 212# ) 213ASM_PFX(EfiCpuidExt): 214 push %ebx 215 push %edi 216 push %esi 217 pushal 218 219 movl 0x30(%esp), %eax # RegisterInEax 220 movl 0x34(%esp), %ecx # CacheLevel 221 cpuid 222 movl 0x38(%esp), %edi # DWORD PTR Regs 223 224 movl %eax, (%edi) # Reg->RegEax 225 movl %ebx, 4(%edi) # Reg->RegEbx 226 movl %ecx, 8(%edi) # Reg->RegEcx 227 movl %edx, 0xC(%edi) # Reg->RegEdx 228 229 popal 230 pop %esi 231 pop %edi 232 pop %ebx 233 ret 234#EfiCpuidExt ENDP 235 236 237 238