From 1831bc6add7219198e184568525f09d73553782e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 26 Nov 2023 12:23:55 +0200 Subject: [PATCH] [NTOS:KE/x64] Implement initial IPI code --- ntoskrnl/ke/amd64/ipi.c | 50 +++++++++++++++++++++++++++++++++++++++++ ntoskrnl/ke/ipi.c | 4 ++++ ntoskrnl/ntos.cmake | 1 + 3 files changed, 55 insertions(+) create mode 100644 ntoskrnl/ke/amd64/ipi.c diff --git a/ntoskrnl/ke/amd64/ipi.c b/ntoskrnl/ke/amd64/ipi.c new file mode 100644 index 00000000000..86c044c7d03 --- /dev/null +++ b/ntoskrnl/ke/amd64/ipi.c @@ -0,0 +1,50 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: IPI code for x64 + * COPYRIGHT: Copyright 2023 Timo Kreuzer + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +FASTCALL +KiIpiSend( + _In_ KAFFINITY TargetSet, + _In_ ULONG IpiRequest) +{ + /* Check if we can send the IPI directly */ + if (IpiRequest == IPI_APC) + { + HalSendSoftwareInterrupt(TargetSet, APC_LEVEL); + } + else if (IpiRequest == IPI_DPC) + { + HalSendSoftwareInterrupt(TargetSet, DISPATCH_LEVEL); + } + else if (IpiRequest == IPI_FREEZE) + { + /* On x64 the freeze IPI is an NMI */ + HalSendNMI(TargetSet); + } + else + { + ASSERT(FALSE); + } +} + +ULONG_PTR +NTAPI +KeIpiGenericCall( + _In_ PKIPI_BROADCAST_WORKER Function, + _In_ ULONG_PTR Argument) +{ + __debugbreak(); + return 0; +} diff --git a/ntoskrnl/ke/ipi.c b/ntoskrnl/ke/ipi.c index 841087d1daa..b81a22ac2c6 100644 --- a/ntoskrnl/ke/ipi.c +++ b/ntoskrnl/ke/ipi.c @@ -18,6 +18,8 @@ extern KSPIN_LOCK KiReverseStallIpiLock; /* PRIVATE FUNCTIONS *********************************************************/ +#ifndef _M_AMD64 + VOID NTAPI KiIpiGenericCallTarget(IN PKIPI_CONTEXT PacketContext, @@ -270,3 +272,5 @@ KeIpiGenericCall(IN PKIPI_BROADCAST_WORKER Function, KeLowerIrql(OldIrql); return Status; } + +#endif // !_M_AMD64 diff --git a/ntoskrnl/ntos.cmake b/ntoskrnl/ntos.cmake index 26a1e07b17e..473e0455966 100644 --- a/ntoskrnl/ntos.cmake +++ b/ntoskrnl/ntos.cmake @@ -351,6 +351,7 @@ elseif(ARCH STREQUAL "amd64") ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/cpu.c ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/except.c ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/interrupt.c + ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/ipi.c ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/irql.c ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/kiinit.c ${REACTOS_SOURCE_DIR}/ntoskrnl/ke/amd64/krnlinit.c