59 typedef struct _COMMON_AREA_INFO
66 } COMMON_AREA_INFO, *PCOMMON_AREA_INFO;
73 #define COMMON_AREA 0x2000 76 #define APIC_DIVISOR (16) 78 #define CMOS_READ(address) { \ 79 WRITE_PORT_UCHAR((PUCHAR)0x70, address)); \ 80 READ_PORT_UCHAR((PUCHAR)0x71)); \ 83 #define CMOS_WRITE(address, value) { \ 84 WRITE_PORT_UCHAR((PUCHAR)0x70, address); \ 85 WRITE_PORT_UCHAR((PUCHAR)0x71, value); \ 101 ULONG tmp, ver, maxlvt;
229 DbgPrint(
"0123456789abcdef0123456789abcdef\n");
230 for (
i = 0;
i < 8;
i++)
233 for (
j = 0;
j < 32;
j++)
275 DbgPrint(
"... APR : %08x (%02x)\n",
v,
v & ~0);
343 DbgPrint(
"Last register read (offset): 0x%08X\n",
r1);
344 DbgPrint(
"Last register read (value): 0x%08X\n",
r2);
345 DbgPrint(
"Last register written (offset): 0x%08X\n",
w1);
346 DbgPrint(
"Last register written (value): 0x%08X\n",
w2);
357 DPRINT1(
"Getting VERSION: %x\n", reg0);
360 DPRINT1(
"Getting VERSION: %x\n", reg1);
377 if (reg1 == 0x00 || reg1 == 0xff)
382 if (reg1 < 0x02 || reg1 == 0xff)
391 DPRINT1(
"Getting ID: %x\n", reg0);
394 DPRINT1(
"Getting ID: %x\n", reg1);
403 if (!(MsrValue.
LowPart & (1<<11)))
405 DPRINT1(
"Local APIC disabled by BIOS -- reenabling.\n");
407 MsrValue.
LowPart |= (1<<11)|0xfee00000;
426 for (
i = 0;
i < 10000;
i++)
437 DPRINT1(
"CPU(%d) Previous IPI was not delivered after 100ms.\n",
ThisCPU());
465 for (
i = 0;
i < 10000;
i++)
476 DPRINT1(
"CPU(%d) Current IPI was not delivered after 100ms.\n",
ThisCPU());
555 DPRINT1(
"enabled ExtINT on CPU#%d\n", CPU);
560 DPRINT1(
"masked ExtINT on CPU#%d\n", CPU);
592 DPRINT(
"ESR value before enabling vector: 0x%X\n", tmp);
606 DPRINT(
"ESR value after enabling vector: 0x%X\n", tmp);
615 for (
i = 0;
i < 10000;
i++)
629 DPRINT(
"Synchronizing Arb IDs.\n");
643 DPRINT1(
"APIC error on CPU(%d) ESR(%x)(%x)\n",
ThisCPU(), tmp1, tmp2);
660 DPRINT1(
"APIC error on CPU(%d) ESR(%x)(%x)\n",
ThisCPU(), tmp1, tmp2);
692 DbgPrint(
"(%s:%d) MpsIpiHandler on CPU%d, current irql is %d\n",
718 TrapFrame->
Eax = IrqTrapFrame->
Eax;
719 TrapFrame->
Ecx = IrqTrapFrame->
Ecx;
720 TrapFrame->
Edx = IrqTrapFrame->
Edx;
721 TrapFrame->
Ebx = IrqTrapFrame->
Ebx;
723 TrapFrame->
Ebp = IrqTrapFrame->
Ebp;
724 TrapFrame->
Esi = IrqTrapFrame->
Esi;
725 TrapFrame->
Edi = IrqTrapFrame->
Edi;
726 TrapFrame->
Eip = IrqTrapFrame->
Eip;
727 TrapFrame->
SegCs = IrqTrapFrame->
Cs;
748 if ((
Count[CPU] % 100) == 0)
750 DbgPrint(
"(%s:%d) MpsTimerHandler on CPU%d, irql = %d, epi = %x, KPCR = %x\n", __FILE__, __LINE__, CPU, oldIrql,Trapframe->
Eip,
KeGetPcr());
800 DPRINT(
"Calibrating APIC timer for CPU %d\n", CPU);
830 DPRINT(
"CPU clock speed is %ld.%04ld MHz.\n",
831 CPUMap[CPU].CoreSpeed/1000000,
832 CPUMap[CPU].CoreSpeed%1000000);
843 DPRINT(
"Host bus clock speed is %ld.%04ld MHz.\n",
844 CPUMap[CPU].BusSpeed/1000000,
845 CPUMap[CPU].BusSpeed%1000000);
901 BSPInitialized =
TRUE;
918 DPRINT(
"No APIC found\n");
961 PCOMMON_AREA_INFO Common;
964 ULONG DeliveryStatus = 0;
965 ULONG AcceptStatus = 0;
973 DPRINT1(
"Attempting to boot CPU %d\n", Cpu);
992 Common = (PCOMMON_AREA_INFO)CommonBase;
1003 DPRINT1(
"%x %x %x %x\n", Common->Stack, Common->PageDirectory, Common->NtProcessStartup, Common->PaeModeEnabled);
1005 DPRINT(
"Cpu %d got stack at 0x%X\n", Cpu, Common->Stack);
1007 for (
j = 0;
j < 16;
j++)
1009 Common->Debug[
j] = 0;
1018 for (
i = 1;
i <= StartupCount;
i++)
1021 DPRINT(
"Sending startup signal %d\n",
i);
1038 }
while ((DeliveryStatus) && (
j < 1000));
1053 if (DeliveryStatus || AcceptStatus)
1061 DPRINT(
"STARTUP IPI for CPU %d was never delivered.\n", Cpu);
1066 DPRINT(
"STARTUP IPI for CPU %d was never accepted.\n", Cpu);
1069 if (!(DeliveryStatus || AcceptStatus))
1073 DPRINT(
"Waiting for 5 seconds for CPU %d to boot\n", Cpu);
1076 for (
j = 0;
j < 50000;
j++)
1088 DbgPrint(
"CPU %d is now running\n", Cpu);
1092 DbgPrint(
"Initialization of CPU %d failed\n", Cpu);
1096 DPRINT(
"Debug bytes are:\n");
1098 for (
j = 0;
j < 4;
j++)
1100 DPRINT(
"0x%08X 0x%08X 0x%08X 0x%08X.\n",
1101 Common->Debug[
j*4+0],
1102 Common->Debug[
j*4+1],
1103 Common->Debug[
j*4+2],
1104 Common->Debug[
j*4+3]);
1120 TrapFrame->Eip = TrapFrame->Eax;
VOID MpsIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame, PKTRAP_FRAME TrapFrame)
#define APIC_DEFAULT_BASE
__inline VOID APICSendEOI(VOID)
#define APIC_ICR0_DESTS_SELF
#define GET_APIC_LOGICAL_ID(x)
ULONG Read8254Timer(VOID)
#define APIC_TARGET_ALL_BUT_SELF
VOID MpsSpuriousInterrupt(VOID)
void __cdecl _enable(void)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
PPC_QUAL unsigned long long __rdtsc(void)
__INTRIN_INLINE unsigned long __readcr3(void)
__inline VOID APICWrite(ULONG Offset, ULONG Value)
VOID MpsTimerInterrupt(VOID)
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
VOID APICSendIPI(ULONG Target, ULONG Mode)
VOID APICSyncArbIDs(VOID)
#define DECLSPEC_NORETURN
ULONG APICGetMaxLVT(VOID)
VOID EnableApicMode(VOID)
__inline VOID DisableSMPMode(VOID)
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
#define APIC_LVT_LEVEL_TRIGGER
VOID HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack)
__INTRIN_INLINE uintptr_t __readeflags(void)
#define APIC_TIMER_BASE_DIV
#define LOCAL_TIMER_VECTOR
#define APIC_LVT_PERIODIC
BOOLEAN VerifyLocalAPIC(VOID)
PPC_QUAL unsigned long long __readmsr()
#define CMOS_WRITE(address, value)
VOID APICSetupLVTT(ULONG ClockTicks)
VOID SetInterruptGate(ULONG index, ULONG_PTR address)
KIRQL NTAPI KeGetCurrentIrql(VOID)
#define GET_APIC_VERSION(x)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Must_inspect_result_ _In_ ULONG Flags
#define APIC_INTEGRATED(version)
static VOID APICDumpBit(ULONG base)
#define APIC_ICR0_DESTS_FIELD
#define SET_APIC_TIMER_BASE(x)
#define GET_APIC_MAXLVT(x)
VOID MpsTimerHandler(ULONG Vector, PKIRQ_TRAPFRAME Trapframe)
VOID NTAPI NtProcessStartup(PPEB Peb)
#define WRITE_PORT_UCHAR(p, d)
__INTRIN_INLINE void __writeeflags(uintptr_t Value)
VOID WaitFor8254Wraparound(VOID)
#define memcpy(s1, s2, n)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
VOID DECLSPEC_NORETURN FASTCALL HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame)
#define APIC_ICR0_LEVEL_ASSERT
__INTRIN_INLINE unsigned long __readcr4(void)
VOID APICCalibrateTimer(ULONG CPU)
__inline ULONG APICRead(ULONG Offset)
VOID MpsIpiInterrupt(VOID)
PPC_QUAL void __writemsr(const unsigned long Value)
BOOLEAN NTAPI KiIpiServiceRoutine(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
VOID MpsErrorHandler(VOID)
FORCEINLINE VOID KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define I386_INTERRUPT_GATE
VOID MpsSpuriousHandler(VOID)
static __inline ULONG ThisCPU(VOID)
#define SET_APIC_DEST_FIELD(x)
void __cdecl _disable(void)
#define APIC_ICR0_DESTS_ALL
#define APIC_ICR0_LEVEL_DEASSERT
#define APIC_ICR0_DESTS_ALL_BUT_SELF
VOID NTAPI KeStallExecutionProcessor(IN ULONG MicroSeconds)
VOID MpsErrorInterrupt(VOID)
BOOLEAN NTAPI HalBeginSystemInterrupt(IN KIRQL Irql, IN ULONG Vector, OUT PKIRQL OldIrql)
VOID NTAPI HalEndSystemInterrupt(IN KIRQL OldIrql, IN PKTRAP_FRAME TrapFrame)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble w1