- Get MP hal and Generic HAL to build too.
[reactos.git] / reactos / hal / halx86 / mp / apic.c
index 1f80633..f90fc00 100644 (file)
@@ -55,7 +55,8 @@ ULONG lastregw[MAX_CPU];
 ULONG lastvalw[MAX_CPU];
 
 #ifdef CONFIG_SMP
-typedef struct __attribute__((packed)) _COMMON_AREA_INFO
+#include <pshpack1.h>
+typedef struct _COMMON_AREA_INFO
 {
    ULONG Stack;                    /* Location of AP stack */
    ULONG PageDirectory;            /* Page directory for an AP */
@@ -63,6 +64,7 @@ typedef struct __attribute__((packed)) _COMMON_AREA_INFO
    ULONG PaeModeEnabled;    /* PAE mode is enabled */
    ULONG Debug[16];        /* For debugging */
 } COMMON_AREA_INFO, *PCOMMON_AREA_INFO;
+#include <poppack.h>
 #endif
 
 CHAR *APstart, *APend;
@@ -73,15 +75,17 @@ CHAR *APstart, *APend;
 #define HZ             (100)
 #define APIC_DIVISOR   (16)
 
-#define CMOS_READ(address) ({ \
+#define CMOS_READ(address) { \
    WRITE_PORT_UCHAR((PUCHAR)0x70, address)); \
    READ_PORT_UCHAR((PUCHAR)0x71)); \
-})
+}
 
-#define CMOS_WRITE(address, value) ({ \
+#define CMOS_WRITE(address, value) { \
    WRITE_PORT_UCHAR((PUCHAR)0x70, address); \
    WRITE_PORT_UCHAR((PUCHAR)0x71, value); \
-})
+}
+
+extern ULONG_PTR KernelBase;
 
 /* FUNCTIONS *********************************************************************/
 
@@ -179,7 +183,7 @@ VOID EnableApicMode(VOID)
 }
 
 /* Disable symetric I/O mode ie. go to PIC mode */
-inline VOID DisableSMPMode(VOID)
+__inline VOID DisableSMPMode(VOID)
 {
    /*
     * Put the board back into PIC mode (has an effect
@@ -219,7 +223,7 @@ VOID APICDisable(VOID)
 }
 
 
-inline ULONG _APICRead(ULONG Offset)
+__inline ULONG _APICRead(ULONG Offset)
 {
    PULONG p;
 
@@ -228,7 +232,7 @@ inline ULONG _APICRead(ULONG Offset)
 }
 
 #if 0
-inline VOID APICWrite(ULONG Offset,
+__inline VOID APICWrite(ULONG Offset,
                      ULONG Value)
 {
    PULONG p;
@@ -238,7 +242,7 @@ inline VOID APICWrite(ULONG Offset,
    *p = Value;
 }
 #else
-inline VOID APICWrite(ULONG Offset,
+__inline VOID APICWrite(ULONG Offset,
                      ULONG Value)
 {
    PULONG p;
@@ -255,7 +259,7 @@ inline VOID APICWrite(ULONG Offset,
 
 
 #if 0
-inline ULONG APICRead(ULONG Offset)
+__inline ULONG APICRead(ULONG Offset)
 {
    PULONG p;
 
@@ -263,7 +267,7 @@ inline ULONG APICRead(ULONG Offset)
    return *p;
 }
 #else
-inline ULONG APICRead(ULONG Offset)
+__inline ULONG APICRead(ULONG Offset)
 {
    PULONG p;
    ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
@@ -278,7 +282,7 @@ inline ULONG APICRead(ULONG Offset)
 }
 #endif
 
-inline VOID APICSendEOI(VOID)
+__inline VOID APICSendEOI(VOID)
 {
   // Send the EOI
   APICWrite(APIC_EOI, 0);
@@ -412,7 +416,8 @@ VOID APICDump(VOID)
 
 BOOLEAN VerifyLocalAPIC(VOID)
 {
-   UINT reg0, reg1;
+   SIZE_T reg0, reg1;
+   ULONG l, h;
    /* The version register is read-only in a real APIC */
    reg0 = APICRead(APIC_VER);
    DPRINT1("Getting VERSION: %x\n", reg0);
@@ -459,7 +464,6 @@ BOOLEAN VerifyLocalAPIC(VOID)
       return FALSE;
    }
 
-   ULONG l, h;
    Ki386Rdmsr(0x1b /*MSR_IA32_APICBASE*/, l, h);
 
    if (!(l & /*MSR_IA32_APICBASE_ENABLE*/(1<<11))) 
@@ -770,21 +774,21 @@ VOID
 MpsIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame,
                           PKTRAP_FRAME TrapFrame)
 {
-   TrapFrame->Gs     = (USHORT)IrqTrapFrame->Gs;
-   TrapFrame->Fs     = (USHORT)IrqTrapFrame->Fs;
-   TrapFrame->Es     = (USHORT)IrqTrapFrame->Es;
-   TrapFrame->Ds     = (USHORT)IrqTrapFrame->Ds;
+   TrapFrame->SegGs     = (USHORT)IrqTrapFrame->Gs;
+   TrapFrame->SegFs     = (USHORT)IrqTrapFrame->Fs;
+   TrapFrame->SegEs     = (USHORT)IrqTrapFrame->Es;
+   TrapFrame->SegDs     = (USHORT)IrqTrapFrame->Ds;
    TrapFrame->Eax    = IrqTrapFrame->Eax;
    TrapFrame->Ecx    = IrqTrapFrame->Ecx;
    TrapFrame->Edx    = IrqTrapFrame->Edx;
    TrapFrame->Ebx    = IrqTrapFrame->Ebx;
-   TrapFrame->Esp    = IrqTrapFrame->Esp;
+   TrapFrame->HardwareEsp    = IrqTrapFrame->Esp;
    TrapFrame->Ebp    = IrqTrapFrame->Ebp;
    TrapFrame->Esi    = IrqTrapFrame->Esi;
    TrapFrame->Edi    = IrqTrapFrame->Edi;
    TrapFrame->Eip    = IrqTrapFrame->Eip;
-   TrapFrame->Cs     = IrqTrapFrame->Cs;
-   TrapFrame->Eflags = IrqTrapFrame->Eflags;
+   TrapFrame->SegCs     = IrqTrapFrame->Cs;
+   TrapFrame->EFlags = IrqTrapFrame->Eflags;
 }
 
 VOID
@@ -906,11 +910,19 @@ VOID
 SetInterruptGate(ULONG index, ULONG address)
 {
   KIDTENTRY *idt;
-
+  KIDT_ACCESS Access;
+
+  /* Set the IDT Access Bits */
+  Access.Reserved = 0;
+  Access.Present = 1;
+  Access.Dpl = 0; /* Kernel-Mode */
+  Access.SystemSegmentFlag = 0;
+  Access.SegmentType = I386_INTERRUPT_GATE;
+  
   idt = (KIDTENTRY*)((ULONG)KeGetCurrentKPCR()->IDT + index * sizeof(KIDTENTRY));
   idt->Offset = address & 0xffff;
-  idt->Selector = KERNEL_CS;
-  idt->Access = 0x8e00;
+  idt->Selector = KGDT_R0_CODE;
+  idt->Access = Access.Value;
   idt->ExtendedOffset = address >> 16;
 }
 
@@ -1027,7 +1039,7 @@ HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack)
    /* Write the page directory page */
    Ke386GetPageTableDirectory(Common->PageDirectory);
    /* Write the kernel entry point */
-   Common->NtProcessStartup = (ULONG_PTR)RtlImageNtHeader(MmSystemRangeStart)->OptionalHeader.AddressOfEntryPoint + (ULONG_PTR)MmSystemRangeStart;
+   Common->NtProcessStartup = (ULONG_PTR)RtlImageNtHeader((PVOID)KernelBase)->OptionalHeader.AddressOfEntryPoint + KernelBase;
    /* Write the state of the mae mode */
    Common->PaeModeEnabled = Ke386GetCr4() & X86_CR4_PAE ? 1 : 0;