From 31129295c3d03908a105c8eb062d83502434bfb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20H=C3=A4user?= <8659494+mhaeuser@users.noreply.github.com> Date: Fri, 19 Mar 2021 16:35:31 +0100 Subject: [PATCH] OcCpuLib: Initial import of OcAtomicPreIncUint8 --- Include/Acidanthera/Library/OcCpuLib.h | 13 +++++++++++++ Library/OcCpuLib/Ia32/Atomic.nasm | 14 ++++++++++++++ Library/OcCpuLib/X64/Atomic.nasm | 13 +++++++++++++ User/Library/UserMisc.c | 11 +++++++++++ 4 files changed, 51 insertions(+) diff --git a/Include/Acidanthera/Library/OcCpuLib.h b/Include/Acidanthera/Library/OcCpuLib.h index fcea2990..6d097e60 100755 --- a/Include/Acidanthera/Library/OcCpuLib.h +++ b/Include/Acidanthera/Library/OcCpuLib.h @@ -234,4 +234,17 @@ OcGetTSCFrequency ( VOID ); +/** + Atomically pre-increment 8-bit integer. + + @param[in] Value Pointer to 8-bit integer to increment. + + @retval value before incrementing. +**/ +UINT8 +EFIAPI +OcAtomicPreIncUint8 ( + IN OUT volatile UINT8 *Value + ); + #endif // OC_CPU_LIB_H_ diff --git a/Library/OcCpuLib/Ia32/Atomic.nasm b/Library/OcCpuLib/Ia32/Atomic.nasm index 711a6371..4d278707 100644 --- a/Library/OcCpuLib/Ia32/Atomic.nasm +++ b/Library/OcCpuLib/Ia32/Atomic.nasm @@ -18,6 +18,20 @@ DEFAULT REL SECTION .text +;------------------------------------------------------------------------------ +; UINT8 +; EFIAPI +; OcAtomicPreIncUint8 ( +; IN OUT volatile UINT8 *Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(OcAtomicPreIncUint8) +ASM_PFX(OcAtomicPreIncUint8): + mov ecx, [esp + 4] + mov eax, 1 + lock xadd byte [ecx], al + ret + ;------------------------------------------------------------------------------ ; UINT32 ; EFIAPI diff --git a/Library/OcCpuLib/X64/Atomic.nasm b/Library/OcCpuLib/X64/Atomic.nasm index 47c76ae8..07b00caa 100644 --- a/Library/OcCpuLib/X64/Atomic.nasm +++ b/Library/OcCpuLib/X64/Atomic.nasm @@ -18,6 +18,19 @@ DEFAULT REL SECTION .text +;------------------------------------------------------------------------------ +; UINT8 +; EFIAPI +; OcAtomicPreIncUint8 ( +; IN OUT volatile UINT8 *Value +; ); +;------------------------------------------------------------------------------ +global ASM_PFX(OcAtomicPreIncUint8) +ASM_PFX(OcAtomicPreIncUint8): + mov eax, 1 + lock xadd byte [rcx], al + ret + ;------------------------------------------------------------------------------ ; UINT32 ; EFIAPI diff --git a/User/Library/UserMisc.c b/User/Library/UserMisc.c index 48ae6aed..9678df85 100644 --- a/User/Library/UserMisc.c +++ b/User/Library/UserMisc.c @@ -161,6 +161,17 @@ AsmCpuidEx ( #endif } +UINT8 +EFIAPI +OcAtomicPreIncUint8 ( + IN OUT volatile UINT8 *Value + ) +{ + ASSERT (FALSE); + + return 0; +} + UINT32 EFIAPI AsmIncrementUint32 (