Reactos
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Header File for SMP support
5 * COPYRIGHT: Copyright 2021 Justin Miller <justinmiller100@gmail.com>
6 */
7
8#pragma once
9
10/* This table is filled for each physical processor on system */
11typedef struct _PROCESSOR_IDENTITY
12{
13 UCHAR ProcessorId;
14 UCHAR LapicId;
15 BOOLEAN ProcessorStarted;
16 BOOLEAN BSPCheck;
17 PKPRCB ProcessorPrcb;
18} PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
19
20/* This table is counter of the overall APIC constants acquired from madt */
21#define HALP_APIC_INFO_TABLE_IOAPIC_NUMBER 256 // ACPI_MADT_IO_APIC.Id is a UINT8.
22typedef struct _HALP_APIC_INFO_TABLE
23{
24 ULONG ApicMode;
25 ULONG ProcessorCount; /* Count of all physical cores, This includes BSP */
26 ULONG IOAPICCount;
27 ULONG LocalApicPA; // The 32-bit physical address at which each processor can access its local interrupt controller
28 ULONG IoApicVA[HALP_APIC_INFO_TABLE_IOAPIC_NUMBER];
29 ULONG IoApicPA[HALP_APIC_INFO_TABLE_IOAPIC_NUMBER];
30 ULONG IoApicIrqBase[HALP_APIC_INFO_TABLE_IOAPIC_NUMBER]; // Global system interrupt base
31} HALP_APIC_INFO_TABLE, *PHALP_APIC_INFO_TABLE;
32
33/* HALP_APIC_INFO_TABLE.ApicMode values */
34// TODO: What are the other modes/values?
35#define HALP_APIC_MODE_LEGACY 0x00000010
36
37VOID
38HalpParseApicTables(
39 _In_ PLOADER_PARAMETER_BLOCK LoaderBlock);
40
41VOID
42HalpSetupProcessorsTable(
43 _In_ UINT32 NTProcessorNumber);
44
45VOID
46HalpPrintApicTables(VOID);
47
48VOID
49FASTCALL
50HalpBroadcastClockIpi(
51 _In_ UCHAR Vector);
52
53/* APIC specific functions inside apic/apicsmp.c */
54
55VOID
56ApicStartApplicationProcessor(
57 _In_ ULONG NTProcessorNumber,
58 _In_ PHYSICAL_ADDRESS StartupLoc);
59
60VOID
61NTAPI
62HalpRequestIpi(
63 _In_ KAFFINITY TargetProcessors);
64
65VOID
66NTAPI
67HalpBroadcastIpiSpecifyVector(
68 _In_ UCHAR Vector,
69 _In_ BOOLEAN IncludeSelf);
70
71VOID
72NTAPI
73HalRequestIpiSpecifyVector(
74 _In_ KAFFINITY TargetSet,
75 _In_ UCHAR Vector);
76
77#ifdef _M_AMD64
78
79NTHALAPI
80VOID
81NTAPI
82HalpSendNMI(
83 _In_ KAFFINITY TargetSet);
84
85NTHALAPI
86VOID
87NTAPI
88HalpSendSoftwareInterrupt(
89 _In_ KAFFINITY TargetSet,
90 _In_ KIRQL Irql);
91
92#endif // _M_AMD64