The value of EBX must be preserved to follow IA32 cdecl calling convention in the assembly implementation of AsmFlushCacheLine(). The CPUID instruction modifies the EBX register. The EBX register value is saved onto the stack before CPUID and restored from the stack after CPUID. The update to the inline assembly implementation of AsmFlushCacheLine() changed the location of the LinearAddress parameter value on the stack. The hardcoded lookup using [esp + 4] is not correct. Use the parameter name LinearAddress instead of the hard coded [esp + 4] stack location to prevent this issue from occurring again if there are changes to the inline assembly in the future. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17279 6f19259b-4bc3-4df7-8a09-765794883524
56 lines
1.4 KiB
NASM
56 lines
1.4 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
|
|
; 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:
|
|
;
|
|
; FlushCacheLine.Asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; AsmFlushCacheLine function
|
|
;
|
|
; Notes:
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
.586P
|
|
.model flat,C
|
|
.xmm
|
|
.code
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID *
|
|
; EFIAPI
|
|
; AsmFlushCacheLine (
|
|
; IN VOID *LinearAddress
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
AsmFlushCacheLine PROC
|
|
;
|
|
; If the CPU does not support CLFLUSH instruction,
|
|
; then promote flush range to flush entire cache.
|
|
;
|
|
mov eax, 1
|
|
push ebx
|
|
cpuid
|
|
pop ebx
|
|
mov eax, [esp + 4]
|
|
test edx, BIT19
|
|
jz @F
|
|
clflush [eax]
|
|
ret
|
|
@@:
|
|
wbinvd
|
|
ret
|
|
AsmFlushCacheLine ENDP
|
|
|
|
END
|