From 1f8026db2fdd3fb54e5ed335789796c247bf1994 Mon Sep 17 00:00:00 2001 From: belliash Date: Fri, 17 Mar 2023 18:06:53 +0100 Subject: [PATCH] Implement RtlInterlockedCompareExchangePointer() and RtlInterlockedDecrementLongPtr() atomic routines --- sdk/xtdk/rtlfuncs.h | 10 ++++++++ xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/rtl/intrin.c | 52 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 xtoskrnl/rtl/intrin.c diff --git a/sdk/xtdk/rtlfuncs.h b/sdk/xtdk/rtlfuncs.h index cc476ac..7b957dd 100644 --- a/sdk/xtdk/rtlfuncs.h +++ b/sdk/xtdk/rtlfuncs.h @@ -230,6 +230,16 @@ VOID RtlInsertTailList(IN OUT PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry); +XTFASTCALL +PVOID +RtlInterlockedCompareExchangePointer(IN VOLATILE PVOID *Destination, + IN PVOID Comperand, + IN PVOID Exchange); + +XTFASTCALL +LONG_PTR +RtlInterlockedDecrementLongPtr(IN VOLATILE PLONG_PTR Addend); + XTCDECL BOOLEAN RtlListEmpty(PLIST_ENTRY ListHead); diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index fcde6c9..7e7bef9 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -34,6 +34,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/po/idle.c ${XTOSKRNL_SOURCE_DIR}/rtl/atomic.c ${XTOSKRNL_SOURCE_DIR}/rtl/byteswap.c + ${XTOSKRNL_SOURCE_DIR}/rtl/intrin.c ${XTOSKRNL_SOURCE_DIR}/rtl/memory.c ${XTOSKRNL_SOURCE_DIR}/rtl/plist.c ${XTOSKRNL_SOURCE_DIR}/rtl/string.c diff --git a/xtoskrnl/rtl/intrin.c b/xtoskrnl/rtl/intrin.c new file mode 100644 index 0000000..4b9df3c --- /dev/null +++ b/xtoskrnl/rtl/intrin.c @@ -0,0 +1,52 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/rtl/intrin.c + * DESCRIPTION: Interlocked operations support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Performs an atomic compare exchange operation on the pointer value. + * + * @param Destination + * Supplues a pointer to the variable for the compare exchange operation. + * + * @param Comperand + * Supplies a pointer value used in compare operation. + * + * @param Exchange + * Supplies a pointer value used in exchange operation. + * + * @return This routine returns the initial pointer value of the Destination parameter. + * + * @since XT 1.0 + */ +XTFASTCALL +PVOID +RtlInterlockedCompareExchangePointer(IN VOLATILE PVOID *Destination, + IN PVOID Comperand, + IN PVOID Exchange) +{ + return (PVOID)__sync_val_compare_and_swap(Destination, Comperand, Exchange); +} + +/** + * Performs an atomic decrement of the 32-bit or 64bit value, depending on architecture. + * + * @param Addend + * Specifies a pointer to the variable to be decremented. + * + * @return This routine returns the decremented value. + * + * @since XT 1.0 + */ +XTFASTCALL +LONG_PTR +RtlInterlockedDecrementLongPtr(IN VOLATILE PLONG_PTR Addend) +{ + return (LONG_PTR)__sync_sub_and_fetch(Addend, 1); +}