ReactOS 0.4.16-dev-1040-g85afe48
halinit.c File Reference
#include <hal.h>
#include "apicp.h"
#include <smp.h>
#include <debug.h>
Include dependency graph for halinit.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI ApicInitializeLocalApic (ULONG Cpu)
 
VOID NTAPI HalpInitProcessor (IN ULONG ProcessorNumber, IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
VOID HalpInitPhase0 (IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
VOID HalpInitPhase1 (VOID)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file halinit.c.

Function Documentation

◆ ApicInitializeLocalApic()

VOID NTAPI ApicInitializeLocalApic ( ULONG  Cpu)

Definition at line 292 of file apic.c.

293{
294 APIC_BASE_ADDRESS_REGISTER BaseRegister;
296 LVT_REGISTER LvtEntry;
297
298 /* Enable the APIC if it wasn't yet */
299 BaseRegister.LongLong = __readmsr(MSR_APIC_BASE);
300 BaseRegister.Enable = 1;
301 BaseRegister.BootStrapCPUCore = (Cpu == 0);
302 __writemsr(MSR_APIC_BASE, BaseRegister.LongLong);
303
304 /* Set spurious vector and SoftwareEnable to 1 */
305 SpIntRegister.Long = ApicRead(APIC_SIVR);
306 SpIntRegister.Vector = APIC_SPURIOUS_VECTOR;
307 SpIntRegister.SoftwareEnable = 1;
308 SpIntRegister.FocusCPUCoreChecking = 0;
309 ApicWrite(APIC_SIVR, SpIntRegister.Long);
310
311 /* Read the version and save it globally */
312 if (Cpu == 0) ApicVersion = ApicRead(APIC_VER);
313
314 /* Set the mode to flat (max 8 CPUs supported!) */
316
317 /* Set logical apic ID */
318 ApicWrite(APIC_LDR, ApicLogicalId(Cpu) << 24);
319
320 /* Set the spurious ISR */
322
323 /* Create a template LVT */
324 LvtEntry.Long = 0;
325 LvtEntry.Vector = APIC_FREE_VECTOR;
326 LvtEntry.MessageType = APIC_MT_Fixed;
327 LvtEntry.DeliveryStatus = 0;
328 LvtEntry.RemoteIRR = 0;
329 LvtEntry.TriggerMode = APIC_TGM_Edge;
330 LvtEntry.Mask = 1;
331 LvtEntry.TimerMode = 0;
332
333 /* Initialize and mask LVTs */
334 ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
335 ApicWrite(APIC_THRMLVTR, LvtEntry.Long);
336 ApicWrite(APIC_PCLVTR, LvtEntry.Long);
337 ApicWrite(APIC_EXT0LVTR, LvtEntry.Long);
338 ApicWrite(APIC_EXT1LVTR, LvtEntry.Long);
339 ApicWrite(APIC_EXT2LVTR, LvtEntry.Long);
340 ApicWrite(APIC_EXT3LVTR, LvtEntry.Long);
341
342 /* LINT0 */
343 LvtEntry.Vector = APIC_SPURIOUS_VECTOR;
344 LvtEntry.MessageType = APIC_MT_ExtInt;
345 ApicWrite(APIC_LINT0, LvtEntry.Long);
346
347 /* Enable LINT1 (NMI) */
348 LvtEntry.Mask = 0;
349 LvtEntry.Vector = APIC_NMI_VECTOR;
350 LvtEntry.MessageType = APIC_MT_NMI;
351 LvtEntry.TriggerMode = APIC_TGM_Level;
352 ApicWrite(APIC_LINT1, LvtEntry.Long);
353
354 /* Enable error LVTR */
355 LvtEntry.Vector = APIC_ERROR_VECTOR;
356 LvtEntry.MessageType = APIC_MT_Fixed;
357 ApicWrite(APIC_ERRLVTR, LvtEntry.Long);
358
359 /* Set the IRQL from the PCR */
361#ifdef APIC_LAZY_IRQL
362 /* Save the new hard IRQL in the IRR field */
363 KeGetPcr()->IRR = KeGetPcr()->Irql;
364#endif
365}
ULONG ApicVersion
Definition: apic.c:27
FORCEINLINE VOID ApicSetIrql(KIRQL Irql)
Definition: apic.c:222
#define MSR_APIC_BASE
Definition: apicp.h:116
@ APIC_DF_Flat
Definition: apicp.h:163
#define APIC_NMI_VECTOR
Definition: apicp.h:53
#define APIC_FREE_VECTOR
Definition: apicp.h:62
@ APIC_MT_Fixed
Definition: apicp.h:127
@ APIC_MT_NMI
Definition: apicp.h:131
@ APIC_MT_ExtInt
Definition: apicp.h:134
#define APIC_SPURIOUS_VECTOR
Definition: apicp.h:41
#define APIC_ERROR_VECTOR
Definition: apicp.h:49
#define ApicLogicalId(Cpu)
Definition: apicp.h:119
VOID __cdecl ApicSpuriousService(VOID)
FORCEINLINE ULONG ApicRead(APIC_REGISTER Register)
Definition: apicp.h:318
FORCEINLINE VOID ApicWrite(APIC_REGISTER Register, ULONG Value)
Definition: apicp.h:325
@ APIC_LINT1
Definition: apicp.h:102
@ APIC_EXT3LVTR
Definition: apicp.h:113
@ APIC_EXT1LVTR
Definition: apicp.h:111
@ APIC_VER
Definition: apicp.h:83
@ APIC_LDR
Definition: apicp.h:89
@ APIC_ERRLVTR
Definition: apicp.h:103
@ APIC_PCLVTR
Definition: apicp.h:100
@ APIC_EXT2LVTR
Definition: apicp.h:112
@ APIC_THRMLVTR
Definition: apicp.h:99
@ APIC_TMRLVTR
Definition: apicp.h:98
@ APIC_DFR
Definition: apicp.h:90
@ APIC_LINT0
Definition: apicp.h:101
@ APIC_SIVR
Definition: apicp.h:91
@ APIC_EXT0LVTR
Definition: apicp.h:110
@ APIC_TGM_Level
Definition: apicp.h:141
@ APIC_TGM_Edge
Definition: apicp.h:140
_Out_ PKIRQL Irql
Definition: csq.h:179
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
#define KeGetPcr()
Definition: ketypes.h:81
FORCEINLINE VOID KeRegisterInterruptHandler(IN ULONG Vector, IN PVOID Handler)
Definition: ke.h:301
UINT32 RemoteIRR
Definition: apicp.h:274
UINT32 MessageType
Definition: apicp.h:270
UINT32 TimerMode
Definition: apicp.h:277
UINT32 Long
Definition: apicp.h:266
UINT32 Vector
Definition: apicp.h:269
UINT32 Mask
Definition: apicp.h:276
UINT32 TriggerMode
Definition: apicp.h:275
UINT32 DeliveryStatus
Definition: apicp.h:272

Referenced by HalpInitProcessor().

◆ HalpInitPhase0()

VOID HalpInitPhase0 ( IN PLOADER_PARAMETER_BLOCK  LoaderBlock)

Definition at line 46 of file halinit.c.

47{
48 DPRINT1("Using HAL: APIC %s %s\n",
49 (HalpBuildType & PRCB_BUILD_UNIPROCESSOR) ? "UP" : "SMP",
50 (HalpBuildType & PRCB_BUILD_DEBUG) ? "DBG" : "REL");
51
53
54 /* Enable clock interrupt handler */
56 0,
60 Latched);
61
62 /* Enable profile interrupt handler */
64 0,
68 Latched);
69}
#define APIC_CLOCK_VECTOR
Definition: apicp.h:45
#define APIC_PROFILE_VECTOR
Definition: apicp.h:51
#define APIC_PROFILE_LEVEL
Definition: apicp.h:58
#define DPRINT1
Definition: precomp.h:8
const USHORT HalpBuildType
Definition: buildtype.c:14
#define CLOCK2_LEVEL
Definition: env_spec_w32.h:700
VOID HalpClockInterrupt(VOID)
Definition: timer.c:30
VOID NTAPI HalpEnableInterruptHandler(IN UCHAR Flags, IN ULONG BusVector, IN ULONG SystemVector, IN KIRQL Irql, IN PVOID Handler, IN KINTERRUPT_MODE Mode)
Definition: usage.c:49
VOID HalpProfileInterrupt(VOID)
#define IDT_INTERNAL
Definition: halp.h:21
#define IDT_DEVICE
Definition: halp.h:22
VOID HalpPrintApicTables(VOID)
Definition: madt.c:245
#define PRCB_BUILD_UNIPROCESSOR
Definition: ketypes.h:328
#define PRCB_BUILD_DEBUG
Definition: ketypes.h:327
@ Latched
Definition: miniport.h:81

◆ HalpInitPhase1()

VOID HalpInitPhase1 ( VOID  )

Definition at line 72 of file halinit.c.

73{
74 /* Initialize DMA. NT does this in Phase 0 */
76}
VOID HalpInitDma(VOID)
Definition: dma.c:185

◆ HalpInitProcessor()

VOID NTAPI HalpInitProcessor ( IN ULONG  ProcessorNumber,
IN PLOADER_PARAMETER_BLOCK  LoaderBlock 
)

Definition at line 24 of file halinit.c.

27{
28 if (ProcessorNumber == 0)
29 {
30 HalpParseApicTables(LoaderBlock);
31 }
32
33 HalpSetupProcessorsTable(ProcessorNumber);
34
35 /* Initialize the local APIC for this cpu */
36 ApicInitializeLocalApic(ProcessorNumber);
37
38 /* Initialize profiling data (but don't start it) */
40
41 /* Initialize the timer */
42 //ApicInitializeTimer(ProcessorNumber);
43}
VOID NTAPI HalInitializeProfiling(VOID)
Definition: apictimer.c:76
VOID NTAPI ApicInitializeLocalApic(ULONG Cpu)
Definition: apic.c:292
VOID HalpParseApicTables(_In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: madt.c:55
VOID HalpSetupProcessorsTable(_In_ UINT32 NTProcessorNumber)
Definition: up.c:37

Referenced by HalInitializeProcessor().