Merge HAL changes 34743, 34812, 34839, 34917, 35515, 35771, 35902, 35904,
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 26 Sep 2009 21:32:53 +0000 (21:32 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 26 Sep 2009 21:32:53 +0000 (21:32 +0000)
35905, 35906, 35942, 35947, 35948, 35949, 35953, 36013, 36388, 36389, 36570, 37873, 37991, 39151 from amd64 branch

svn path=/trunk/; revision=43173

1  2  3  4  5 
reactos/hal/hal.rbuild
reactos/hal/hal/hal.c
reactos/hal/hal/hal.rbuild
reactos/hal/halamd64/generic/irq.S
reactos/hal/halamd64/include/halp.h
reactos/hal/halx86/generic/timer.c
reactos/hal/halx86/include/apic.h
reactos/hal/halx86/include/hal.h
reactos/hal/halx86/include/halp.h
reactos/hal/halx86/mp/apic.c

diff --combined reactos/hal/hal.rbuild
                        <xi:include href="halx86/hal_generic_up.rbuild" />
                        <xi:include href="halx86/hal_generic_pc.rbuild" />
                        <xi:include href="halx86/halup.rbuild" />
 ----                   <xi:include href="halx86/halmp.rbuild" />
 ++++                   <if property="BUILD_MP" value="1">
 ++++                           <xi:include href="halx86/halmp.rbuild" />
 ++++                   </if>
                        <xi:include href="halx86/halxbox.rbuild" />
                </directory>
        </if>
                        <xi:include href="halarm/directory.rbuild" />
                </directory>
        </if>
   -                    <xi:include href="halx86/hal_generic_pc.rbuild" />
+       <if property="ARCH" value="amd64">
+++             <directory name="halx86">
+++                     <xi:include href="halx86/hal_generic_amd64.rbuild" />
 -                      <xi:include href="halamd64/hal_generic.rbuild" />
+++             </directory>
+               <directory name="halamd64">
++                      <xi:include href="halamd64/directory.rbuild" />
+               </directory>
+       </if>
     </group>
diff --combined reactos/hal/hal/hal.c
     
     /* DATA **********************************************************************/
     
 ----ULONG _KdComPortInUse = 0;
 ++++PUCHAR KdComPortInUse;
     
     /* FUNCTIONS *****************************************************************/
     
@@@@@@ -49,7 -49,7 -49,7 -49,7 -49,7 +49,7 @@@@@@ VOI
     NTAPI
     HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
     {
 ----    KEBUGCHECK(0);
 ++++    ASSERT(FALSE);
         return;
     }
     
@@@@@@ -60,7 -60,7 -60,7 -60,7 -60,7 +60,7 @@@@@@ VOI
     NTAPI
     HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
     {
 ----    KEBUGCHECK(0);
 ++++    ASSERT(FALSE);
         return;
     }
     
@@@@@@ -71,10 -71,10 -71,10 -71,11 -71,11 +71,11 @@@@@@ ULONG_PT
     NTAPI
     HalSetProfileInterval(IN ULONG_PTR Interval)
     {
 ----    KEBUGCHECK(0);
 ++++    ASSERT(FALSE);
         return Interval;
     }
  -  #if 0
  +  
+++  #ifndef _M_AMD64
     VOID
     FASTCALL
     ExAcquireFastMutex(
@@@@@@ -101,7 -101,7 -101,7 -102,7 -102,7 +102,7 @@@@@@ ExTryToAcquireFastMutex
     
       return TRUE;
     }
--   
++   #endif
     
     VOID
     NTAPI
@@@@@@ -466,7 -466,7 -466,7 -467,7 -467,7 +467,7 @@@@@@ HalReportResourceUsage(VOID
     VOID
     NTAPI
     HalRequestIpi(
-      ULONG Unknown)
+        KAFFINITY TargetSet)
     {
       UNIMPLEMENTED;
     }
@@@@@@ -610,7 -610,7 -610,7 -611,7 -611,7 +611,7 @@@@@@ HalTranslateBusAddress
       return TRUE;
     }
     
 ----
 ++++#ifndef _M_ARM
     VOID
     NTAPI
     HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
@@@@@@ -668,7 -668,7 -668,7 -669,7 -669,7 +669,7 @@@@@@ HalpSetPartitionInformation(IN PDEVICE_
                                          PartitionNumber,
                                          PartitionType);
     }
 ----
 ++++#endif
     
     BOOLEAN
     NTAPI
@@@@@@ -747,7 -747,7 -747,7 -748,7 -748,7 +748,7 @@@@@@ KeAcquireSpinLockRaiseToSynch
       return 0;
     }
     
-----
+++++#ifndef _M_AMD64
     VOID
     FASTCALL
     KeAcquireInStackQueuedSpinLock(
@@@@@@ -776,6 -776,6 -776,6 -777,6 -777,6 +777,7 @@@@@@ KeReleaseInStackQueuedSpinLock
     {
       UNIMPLEMENTED;
     }
+++++#endif
     
     VOID
     NTAPI
@@@@@@ -784,6 -784,6 -784,6 -785,7 -785,7 +786,7 @@@@@@ KeFlushWriteBuffer(VOID
       UNIMPLEMENTED;
     }
     
+++  #ifndef _M_AMD64
     #undef KeGetCurrentIrql
     KIRQL
     NTAPI
@@@@@@ -802,6 -802,6 -802,6 -804,7 -804,7 +805,7 @@@@@@ KeLowerIrql
     {
       UNIMPLEMENTED;
     }
+++  #endif
     
     
     LARGE_INTEGER
@@@@@@ -818,6 -818,6 -818,6 -821,7 -821,7 +822,7 @@@@@@ KeQueryPerformanceCounter
       return Value;
     }
     
   --#if 0
+++++#ifndef _M_AMD64
     #undef KeRaiseIrql
     VOID
     NTAPI
@@@@@@ -847,7 -847,7 -847,7 -851,8 -851,8 +852,9 @@@@@@ KeRaiseIrqlToSynchLevel(VOID
     
       return (KIRQL)0;
     }
+++  #endif
     
+++++#ifndef _M_AMD64
     #undef KeReleaseSpinLock
     VOID
     NTAPI
@@@@@@ -857,7 -857,7 -857,7 -862,7 -862,7 +864,7 @@@@@@ KeReleaseSpinLock
     {
       UNIMPLEMENTED;
     }
-----
+++++#endif
     
     VOID
     NTAPI
@@@@@@ -891,7 -891,7 -891,7 -896,7 -896,7 +898,7 @@@@@@ KeTryToAcquireQueuedSpinLockRaiseToSync
       return FALSE;
     }
     
---  
+++  #if !defined(_M_AMD64)
     KIRQL
     FASTCALL
     KfAcquireSpinLock(
@@@@@@ -931,8 -931,8 -931,8 -936,9 -936,9 +938,9 @@@@@@ KfReleaseSpinLock
     {
       UNIMPLEMENTED;
     }
+++  #endif
     
-    
+    #if !defined(_M_AMD64)
     VOID
     NTAPI
     READ_PORT_BUFFER_UCHAR(
@@@@@@ -1058,6 -1058,7 -1058,7 -1064,7 -1064,7 +1066,7 @@@@@@ WRITE_PORT_USHORT
     {
       UNIMPLEMENTED;
     }
+    #endif
     
     KIRQL
     FASTCALL
@@@@@@ -1083,23 -1084,4 -1084,4 -1090,23 -1090,23 +1092,23 @@@@@@ KeReleaseQueuedSpinLock(IN PKLOCK_QUEUE
       UNIMPLEMENTED;
     }
     
 ++  VOID
 ++  HalSweepDcache(VOID)
 ++  {
 ++    UNIMPLEMENTED;
 ++  }
 ++  
 ++  VOID
 ++  HalSweepIcache(VOID)
 ++  {
 ++      UNIMPLEMENTED;
 ++  }
 ++  
 ++  ULONG
 ++  HalGetInterruptSource(VOID)
 ++  {
 ++      UNIMPLEMENTED;
 ++      return 0;
 ++  }
 ++  
     /* EOF */
     <?xml version="1.0"?>
     <!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
     <group>
 ++     <if property="ARCH" value="arm">
        <module name="hal" type="kernelmodedll">
 --             <importlibrary definition="hal_$(ARCH).def" />
   --           <importlibrary definition="hal_arm.def" />
 ++++           <importlibrary definition="hal.pspec" />
                <include base="ntoskrnl">include</include>
                <library>ntoskrnl</library>
                <define name="_NTHAL_" />
 --             <linkerflag>-enable-stdcall-fixup</linkerflag>
                <file>hal.c</file>
                <file>hal.rc</file>
   --           <file>hal.spec</file>
        </module>
-        </if>
-        <if property="ARCH" value="i386">
+++     </if>
+++     <if property="ARCH" value="i386">
 ++     <module name="hal" type="kernelmodedll">
   --           <importlibrary definition="hal.spec.def" />
 ++++           <importlibrary definition="hal.pspec" />
 ++             <include base="ntoskrnl">include</include>
 ++             <library>ntoskrnl</library>
 ++             <define name="_NTHAL_" />
 ++             <file>hal.c</file>
 ++             <file>hal.rc</file>
   --           <file>hal.spec</file>
 ++     </module>
-        </if>
+++     </if>
        <if property="ARCH" value="i386">
                <module ifnot="false" name="halupalias" type="alias" installbase="system32" installname="hal.dll" aliasof="halup">
                </module>
        <if property="ARCH" value="powerpc">
                <module name="halupalias" type="alias" installbase="system32" installname="hal.dll" aliasof="halppc_up"/>
        </if>
+++     <if property="ARCH" value="amd64">
+++     <module name="hal" type="kernelmodedll">
+++             <importlibrary definition="hal_amd64.def" />
+++             <include base="ntoskrnl">include</include>
+++             <library>ntoskrnl</library>
+++             <define name="_NTHAL_" />
+++             <file>hal.c</file>
+++             <file>hal.rc</file>
+++     </module>
+++     </if>
     </group>
index 0000000,0000000,0000000,dc1f6d4,060b5b6..1d5bb59
mode 000000,000000,000000,100644,100644..100644
--- /dev/null
--- /dev/null
--- /dev/null
@@@@@@ -1,0 -1,0 -1,0 -1,93 -1,91 +1,91 @@@@@@
   --    .ascii "Sory, asm function "
+++  /*
+++   * FILE:            hal/halx86/generic/irq.S
+++   * COPYRIGHT:       See COPYING in the top level directory
+++   * PURPOSE:         Software, System and Hardware IRQ Management
+++   * PROGRAMMER:      Alex Ionescu (alex@relsoft.net)
+++   */
+++  
+++  /* INCLUDES ******************************************************************/
+++  
+++  #include <asm.h>
+++  #include <internal/i386/asmmacro.S>
+++  .intel_syntax noprefix
+++  
+++  .macro UNIMPLEMENTED func
+++      jmp 2f
+++  1:
   - UNIMPLEMENTED "HalpInitPICs"
+++++    .ascii "Sorry, asm function "
+++      .ascii func
+++      .ascii " is unimplemented!\n\0"
+++  2:
+++      movabs rcx, offset 1b
+++      call _DbgPrint
+++      ret
+++  .endm
+++  
+++  
+++  
+++  /* GLOBALS *******************************************************************/
+++  
+++  
+++  
+++  /* FUNCTIONS *****************************************************************/
+++  
+++  .globl _HalpInitPICs
+++  .func _HalpInitPICs
+++  _HalpInitPICs:
   - .globl _HalRequestSoftwareInterrupt
   - .func _HalRequestSoftwareInterrupt
   - _HalRequestSoftwareInterrupt:
   - UNIMPLEMENTED "HalRequestSoftwareInterrupt"
   - .endfunc
   - 
++++     UNIMPLEMENTED "HalpInitPICs"
++++ .endfunc
++++ 
++++ .global _HalEnableInterrupt
++++ .func _HalEnableInterrupt
++++ _HalEnableInterrupt:
++++     UNIMPLEMENTED "HalEnableInterrupt"
++++ .endfunc
+++  
++++ .global _HalDisableInterrupt
++++ .func _HalDisableInterrupt
++++ _HalDisableInterrupt:
++++     UNIMPLEMENTED "HalDisableInterrupt"
++++ .endfunc
++++ 
++++ .global _HalRequestSoftwareInterrupt
++++ .func _HalRequestSoftwareInterrupt
++++ _HalRequestSoftwareInterrupt:
++++     UNIMPLEMENTED "HalRequestSoftwareInterrupt"
+++  .endfunc
+++  
++++ .global _HalSendSoftwareInterrupt
++++ .func _HalSendSoftwareInterrupt
++++ _HalSendSoftwareInterrupt:
++++     UNIMPLEMENTED "HalSendSoftwareInterrupt"
++++ .endfunc
++++ 
++++ .global _HalEndSystemInterrupt
++++ .func _HalEndSystemInterrupt
++++ _HalEndSystemInterrupt:
++++     UNIMPLEMENTED "HalEndSystemInterrupt"
++++ .endfunc
++++ 
++++ 
+++  .globl _HalClearSoftwareInterrupt
+++  .func _HalClearSoftwareInterrupt
+++  _HalClearSoftwareInterrupt:
++++     UNIMPLEMENTED "HalClearSoftwareInterrupt"
+++  
+++      /* Get IRR mask */
+++      mov eax, 1
+++      shl eax, cl
+++      not eax
+++  
+++      /* Set IRR */
+++  //    and gs:[KPCR_IRR], eax
+++      ret
+++  .endfunc
+++  
   - UNIMPLEMENTED "HalBeginSystemInterrupt"
   - .endfunc
   - 
   - .globl _HalpApcInterrupt
   - .func _HalpApcInterrupt
   - //TRAP_FIXUPS hapc_a, hapc_t, DoFixupV86, DoFixupAbios
   - _HalpApcInterrupt:
   - UNIMPLEMENTED "HalpApcInterrupt"
   - .endfunc
   - 
   - .globl _HalpApcInterrupt2ndEntry
   - .func _HalpApcInterrupt2ndEntry
   - _HalpApcInterrupt2ndEntry:
   - UNIMPLEMENTED "HalpApcInterrupt2ndEntry"
   - .endfunc
   - 
   - .globl _HalpDispatchInterrupt
   - .func _HalpDispatchInterrupt
   - //TRAP_FIXUPS hdpc_a, hdpc_t, DoFixupV86, DoFixupAbios
   - _HalpDispatchInterrupt:
   - UNIMPLEMENTED "HalpDispatchInterrupt"
   - .endfunc
   - 
   - 
   - .globl _HalpDispatchInterrupt2ndEntry
   - .func _HalpDispatchInterrupt2ndEntry
   - _HalpDispatchInterrupt2ndEntry:
   - UNIMPLEMENTED "HalpDispatchInterrupt2ndEntry"
+++  .globl _HalBeginSystemInterrupt
+++  .func _HalBeginSystemInterrupt
+++  _HalBeginSystemInterrupt:
++++     UNIMPLEMENTED "HalBeginSystemInterrupt"
+++  .endfunc
+++  
index 0000000,0000000,2351b9e,e1b9127,e1b9127..bac9ef1
mode 000000,000000,100644,100644,100644..100644
--- /dev/null
--- /dev/null
@@@@@@ -1,0 -1,0 -1,22 -1,162 -1,162 +1,172 @@@@@@
   --PADAPTER_OBJECT STDCALL HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
+++  /*
+++   *
+++   */
+++  
++   #ifndef __INTERNAL_HAL_HAL_H
++   #define __INTERNAL_HAL_HAL_H
++   
+++  #define HAL_APC_REQUEST         0
+++  #define HAL_DPC_REQUEST         1
+++  
+++  /* CMOS Registers and Ports */
+++  #define CMOS_CONTROL_PORT       (PUCHAR)0x70
+++  #define CMOS_DATA_PORT          (PUCHAR)0x71
+++  #define RTC_REGISTER_A          0x0A
+++  #define RTC_REGISTER_B          0x0B
+++  #define RTC_REG_A_UIP           0x80
+++  #define RTC_REGISTER_CENTURY    0x32
+++  
+++  /* Timer Registers and Ports */
+++  #define TIMER_CONTROL_PORT      0x43
+++  #define TIMER_DATA_PORT0        0x40
+++  #define TIMER_SC0               0
+++  #define TIMER_BOTH              0x30
+++  #define TIMER_MD2               0x4
+++  
+++  /* Conversion functions */
+++  #define BCD_INT(bcd)            \
+++      (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
+++  #define INT_BCD(int)            \
+++      (UCHAR)(((int / 10) << 4) + (int % 10))
+++  
+++  /* adapter.c */
  -  // ARM Headers
+++++PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
+++  
+++  /* bus.c */
+++  VOID NTAPI HalpInitNonBusHandler (VOID);
+++  
+++  /* irql.c */
+++  VOID NTAPI HalpInitPICs(VOID);
+++  
+++  /* udelay.c */
+++  VOID NTAPI HalpInitializeClock(VOID);
+++  
+++  /* pci.c */
+++  VOID HalpInitPciBus (VOID);
+++  
+++  /* dma.c */
+++  VOID HalpInitDma (VOID);
+++  
+++  /* Non-generic initialization */
+++  VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
+++  VOID HalpInitPhase1(VOID);
+++  VOID NTAPI HalpClockInterrupt(VOID);
+++  
++   //
  -  #include <internal/arm/ke.h>
  -  #include <internal/arm/intrin_i.h>
+++  // KD Support
++   //
  -  // Versatile Peripherals
+++  VOID
+++  NTAPI
+++  HalpCheckPowerButton(
+++      VOID
+++  );
+++  
+++  VOID
+++  NTAPI
+++  HalpRegisterKdSupportFunctions(
+++      VOID
+++  );
+++  
+++  NTSTATUS
+++  NTAPI
+++  HalpSetupPciDeviceForDebugging(
+++      IN PVOID LoaderBlock,
+++      IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
+++  );
+++  
+++  NTSTATUS
+++  NTAPI
+++  HalpReleasePciDeviceForDebugging(
+++      IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
+++  );
++   
++   //
  -  #include <peripherals/pl011.h>
  -  #include <peripherals/pl190.h>
  -  #include <peripherals/sp804.h>
+++  // Memory routines
++   //
  -  // WDK Hack
+++  PVOID
+++  NTAPI
+++  HalpMapPhysicalMemory64(
+++      IN PHYSICAL_ADDRESS PhysicalAddress,
+++      IN ULONG NumberPage
+++  );
+++  
+++  VOID
+++  NTAPI
+++  HalpUnmapVirtualAddress(
+++      IN PVOID VirtualAddress,
+++      IN ULONG NumberPages
+++  );
+++  
+++  /* sysinfo.c */
+++  NTSTATUS
+++  NTAPI
+++  HaliQuerySystemInformation(
+++      IN HAL_QUERY_INFORMATION_CLASS InformationClass,
+++      IN ULONG BufferSize,
+++      IN OUT PVOID Buffer,
+++      OUT PULONG ReturnedLength
+++  );
+++  
+++  NTSTATUS
+++  NTAPI
+++  HaliSetSystemInformation(
+++      IN HAL_SET_INFORMATION_CLASS InformationClass,
+++      IN ULONG BufferSize,
+++      IN OUT PVOID Buffer
+++  );
++   
++   //
  -  #define KdComPortInUse          _KdComPortInUse
+++  // BIOS Routines
++   //
+++  BOOLEAN
+++  NTAPI
+++  HalpBiosDisplayReset(
+++      VOID
+++  );
+++  
+++  ULONG
+++  NTAPI
+++  HalpBorrowTss(
+++      VOID
+++  );
+++  
+++  ULONG
+++  NTAPI
+++  HalpReturnTss(
+++      ULONG SavedTss
+++  );
+++  
+++  VOID
+++  NTAPI
+++  HalpBiosCall(
+++      VOID
+++  );
+++  
+++  VOID
+++  NTAPI
+++  HalpTrap0D(
+++      VOID
+++  );
+++  
+++  VOID
+++  NTAPI
+++  HalpTrap06(
+++      VOID
+++  );
+++  
+++++PDMA_ADAPTER
+++++NTAPI
+++++HalpGetDmaAdapter(
+++++   IN PVOID Context,
+++++   IN PDEVICE_DESCRIPTION DeviceDescription,
+++++   OUT PULONG NumberOfMapRegisters);
+++++
+++++VOID HaliInitBSP(VOID);
+++++VOID HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack);
+++++
+++  extern PVOID HalpRealModeStart;
+++  extern PVOID HalpRealModeEnd;
+++  
+++  extern KSPIN_LOCK HalpSystemHardwareLock;
++   
++   #endif /* __INTERNAL_HAL_HAL_H */
@@@@@@ -48,7 -48,7 -48,7 -48,7 -48,7 +48,7 @@@@@@ HalpInitializeClock(VOID
         PKPRCB Prcb = KeGetCurrentPrcb();
         ULONG Increment;
         USHORT RollOver;
-        ULONG Flags;
 --      ULONG Flags = 0;
   --    ULONG_PTR Flags = 0;
+++++    ULONG_PTR Flags;
     
         /* Check the CPU Type */
         if (Prcb->CpuType <= 4)
         KeSetTimeIncrement(Increment, HalpRolloverTable[0].HighPart);
     
         /* Disable interrupts */
 ----    Ke386SaveFlags(Flags);
 ++++    Flags = __readeflags();
         _disable();
     
         /* Set the rollover */
         __outbyte(TIMER_DATA_PORT0, RollOver >> 8);
     
         /* Restore interrupts if they were previously enabled */
 ----    Ke386RestoreFlags(Flags);
 ++++    __writeeflags(Flags);
     
         /* Save rollover and return */
         HalpCurrentRollOver = RollOver;
@@@@@@ -92,10 -92,10 -92,10 -92,10 -92,10 +92,10 @@@@@@ NTAP
     HalCalibratePerformanceCounter(IN volatile PLONG Count,
                                    IN ULONGLONG NewCount)
     {
-        ULONG Flags;
 --      ULONG Flags = 0;
   --    ULONG_PTR Flags = 0;
+++++    ULONG_PTR Flags;
     
         /* Disable interrupts */
 ----    Ke386SaveFlags(Flags);
 ++++    Flags = __readeflags();
         _disable();
     
         /* Do a decrement for this CPU */
         while (*Count);
     
         /* Restore interrupts if they were previously enabled */
 ----    Ke386RestoreFlags(Flags);
 ++++    __writeeflags(Flags);
     }
     
     /*
@@@@@@ -5,7 -5,7 -5,7 -5,7 -5,7 +5,11 @@@@@@
     #ifndef __INTERNAL_HAL_APIC_H
     #define __INTERNAL_HAL_APIC_H
     
+++++#ifdef _M_AMD64
+++++#define APIC_DEFAULT_BASE     0xfffffffffee00000ULL;
+++++#else
     #define APIC_DEFAULT_BASE     0xFEE00000    /* Default Local APIC Base Register Address */
+++++#endif
     
     /* APIC Register Address Map */
     #define APIC_ID      0x0020 /* Local APIC ID Register (R/W) */
     
     #define APIC_LVT_VECTOR              (0xFF << 0)   /* Vector */
     #define APIC_LVT_DS                  (0x1 << 12)   /* Delivery Status */
 ----#define APIC_LVT_REMOTE_IRR                  (0x1 << 14)           /* Remote IRR */
 ----#define APIC_LVT_LEVEL_TRIGGER     (0x1 << 15)             /* Lvel Triggered */
 ----#define APIC_LVT_MASKED        (0x1 << 16)   /* Mask */
 ----#define APIC_LVT_PERIODIC          (0x1 << 17)   /* Timer Mode */
 ----
 ----#define APIC_LVT3_DM        (0x7 << 8)
 ----#define APIC_LVT3_IIPP      (0x1 << 13)
 ----#define APIC_LVT3_TM        (0x1 << 15)
 ----#define APIC_LVT3_MASKED    (0x1 << 16)
 ----#define APIC_LVT3_OS        (0x1 << 17)
 ----
 ----#define APIC_TDCR_TMBASE   (0x1 << 2)
 ----#define APIC_TDCR_MASK     0x0F
 ----#define APIC_TDCR_2        0x00
 ----#define APIC_TDCR_4        0x01
 ----#define APIC_TDCR_8        0x02
 ----#define APIC_TDCR_16       0x03
 ----#define APIC_TDCR_32       0x08
 ----#define APIC_TDCR_64       0x09
 ----#define APIC_TDCR_128      0x0A
 ----#define APIC_TDCR_1        0x0B
 ----
 ----#define APIC_LVT_VECTOR              (0xFF << 0)   /* Vector */
 ----#define APIC_LVT_DS                  (0x1 << 12)   /* Delivery Status */
 ----#define APIC_LVT_REMOTE_IRR                  (0x1 << 14)           /* Remote IRR */
 ----#define APIC_LVT_LEVEL_TRIGGER     (0x1 << 15)             /* Lvel Triggered */
 ----#define APIC_LVT_MASKED        (0x1 << 16)   /* Mask */
 ----#define APIC_LVT_PERIODIC          (0x1 << 17)   /* Timer Mode */
 ++++#define APIC_LVT_REMOTE_IRR                  (0x1 << 14)   /* Remote IRR */
 ++++#define APIC_LVT_LEVEL_TRIGGER               (0x1 << 15)   /* Lvel Triggered */
 ++++#define APIC_LVT_MASKED                      (0x1 << 16)   /* Mask */
 ++++#define APIC_LVT_PERIODIC            (0x1 << 17)   /* Timer Mode */
     
     #define APIC_LVT3_DM        (0x7 << 8)
     #define APIC_LVT3_IIPP      (0x1 << 13)
     #define APIC_TDCR_128      0x0A
     #define APIC_TDCR_1        0x0B
     
-    #define APIC_LVT_VECTOR              (0xFF << 0)   /* Vector */
-    #define APIC_LVT_DS                  (0x1 << 12)   /* Delivery Status */
-    #define APIC_LVT_REMOTE_IRR                  (0x1 << 14)   /* Remote IRR */
-    #define APIC_LVT_LEVEL_TRIGGER               (0x1 << 15)   /* Lvel Triggered */
-    #define APIC_LVT_MASKED                      (0x1 << 16)   /* Mask */
-    #define APIC_LVT_PERIODIC            (0x1 << 17)   /* Timer Mode */
-    
-    #define APIC_LVT3_DM        (0x7 << 8)
-    #define APIC_LVT3_IIPP      (0x1 << 13)
-    #define APIC_LVT3_TM        (0x1 << 15)
-    #define APIC_LVT3_MASKED    (0x1 << 16)
-    #define APIC_LVT3_OS        (0x1 << 17)
-    
-    #define APIC_TDCR_TMBASE   (0x1 << 2)
-    #define APIC_TDCR_MASK     0x0F
-    #define APIC_TDCR_2        0x00
-    #define APIC_TDCR_4        0x01
-    #define APIC_TDCR_8        0x02
-    #define APIC_TDCR_16       0x03
-    #define APIC_TDCR_32       0x08
-    #define APIC_TDCR_64       0x09
-    #define APIC_TDCR_128      0x0A
-    #define APIC_TDCR_1        0x0B
-    
     #define APIC_TARGET_SELF         0x100
     #define APIC_TARGET_ALL          0x200
     #define APIC_TARGET_ALL_BUT_SELF 0x300
@@@@@@ -185,92 -185,30 -185,30 -185,30 -185,30 +165,92 @@@@@@ typedef struct _CPU_INF
     } CPU_INFO, *PCPU_INFO;
     
     extern ULONG CPUCount;                     /* Total number of CPUs */
 ----extern ULONG BootCPU;                                      /* Bootstrap processor */
 ++++extern ULONG BootCPU;                      /* Bootstrap processor */
     extern ULONG OnlineCPUs;           /* Bitmask of online CPUs */
     extern CPU_INFO CPUMap[MAX_CPU];   /* Map of all CPUs in the system */
 ++++extern PULONG APICBase;                    /* Virtual address of local APIC */
 ++++extern ULONG lastregr[MAX_CPU];            /* For debugging */
 ++++extern ULONG lastvalr[MAX_CPU];
 ++++extern ULONG lastregw[MAX_CPU];
 ++++extern ULONG lastvalw[MAX_CPU];
     
     /* Prototypes */
 ----
 ----__inline VOID APICWrite(ULONG Offset, ULONG Value);
 ----__inline ULONG APICRead(ULONG Offset);
     VOID APICSendIPI(ULONG Target, ULONG Mode);
     VOID APICSetup(VOID);
     VOID HaliInitBSP(VOID);
     VOID APICSyncArbIDs(VOID);
 ----__inline VOID APICSendEOI(VOID);
     VOID APICCalibrateTimer(ULONG CPU);
     VOID HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack);
     
 ----static __inline ULONG ThisCPU(VOID)
 ++++static __inline ULONG _APICRead(ULONG Offset)
     {
 ----    return (APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ++++    PULONG p;
 ++++
-        p = (PULONG)((ULONG)APICBase + Offset);
+++++    p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ++++    return *p;
     }
     
-        p = (PULONG)((ULONG)APICBase + Offset);
 ++++#if 0
 ++++static __inline VOID APICWrite(ULONG Offset,
 ++++                               ULONG Value)
 ++++{
 ++++    PULONG p;
 ++++
+++++    p = (PULONG)((ULONG_PTR)APICBase + Offset);
     
-        p = (PULONG)((ULONG)APICBase + Offset);
 ++++    *p = Value;
 ++++}
 ++++#else
 ++++static __inline VOID APICWrite(ULONG Offset,
 ++++                               ULONG Value)
 ++++{
 ++++    PULONG p;
 ++++    ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ++++
 ++++    lastregw[CPU] = Offset;
 ++++    lastvalw[CPU] = Value;
 ++++
+++++    p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ++++
 ++++    *p = Value;
 ++++}
     #endif
     
 ++++#if 0 
 ++++static __inline ULONG APICRead(ULONG Offset)
 ++++{
 ++++    PULONG p;
     
-        p = (PULONG)((ULONG)APICBase + Offset);
 ----/* EOF */
+++++    p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ++++    return *p;
 ++++}
 ++++#else
 ++++static __inline ULONG APICRead(ULONG Offset)
 ++++{
 ++++    PULONG p;
 ++++    ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ++++
 ++++    lastregr[CPU] = Offset;
 ++++    lastvalr[CPU] = 0;
 ++++
-        p = (PULONG)((ULONG)APICBase + Offset);
+++++    p = (PULONG)((ULONG_PTR)APICBase + Offset);
     
 ++++    lastvalr[CPU] = *p;
 ++++    return lastvalr[CPU];
 ++++}
 ++++#endif
 ++++
 ++++static __inline ULONG ThisCPU(VOID)
 ++++{
 ++++    return (APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ++++}
 ++++
 ++++static __inline VOID APICSendEOI(VOID)
 ++++{
 ++++    // Send the EOI
 ++++    APICWrite(APIC_EOI, 0);
 ++++}
 ++++
 ++++#endif /* __INTERNAL_HAL_APIC_H */
 ++++
 ++++/* EOF */
     #include <stdio.h>
     
     /* WDK HAL Compilation hack */
 ----#ifdef _MSC_VER
     #include <excpt.h>
     #include <ntdef.h>
     #undef _NTHAL_
     #undef DECLSPEC_IMPORT
     #define DECLSPEC_IMPORT
 ----#define __declspec(dllimport)
 ----#endif
 ++++#undef NTSYSAPI
 ++++#define NTSYSAPI __declspec(dllimport)
     
     /* IFS/DDK/NDK Headers */
     #include <ntifs.h>
     
     /* Internal kernel headers */
     #include "internal/pci.h"
+++  #ifdef _M_AMD64
+++  #include "internal/amd64/intrin_i.h"
+++  #else
     #include "internal/i386/intrin_i.h"
+++  #endif
     
     /* Internal HAL Headers */
     #include "apic.h"
     #include "mps.h"
     #include "ioapic.h"
     
 ----/* Helper Header */
 ----#include <reactos/helper.h>
 ----
     /* EOF */
         (UCHAR)(((int / 10) << 4) + (int % 10))
     
     /* adapter.c */
 ----PADAPTER_OBJECT STDCALL HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
 ++++PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
     
     /* bus.c */
     VOID NTAPI HalpInitNonBusHandler (VOID);
@@@@@@ -154,6 -154,6 -154,6 -154,17 -154,17 +154,17 @@@@@@ HalpTrap06
         VOID
     );
     
+++  #ifdef _M_AMD64
+++  #define KfLowerIrql KeLowerIrql
+++  #ifndef CONFIG_SMP
+++  /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
+++  #define KiAcquireSpinLock(SpinLock)
+++  #define KiReleaseSpinLock(SpinLock)
+++  #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
+++  #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
+++  #endif // !CONFIG_SMP
+++  #endif // _M_AMD64
+++  
     extern PVOID HalpRealModeStart;
     extern PVOID HalpRealModeEnd;
     
@@@@@@ -223,6 -223,72 -223,72 -223,72 -223,72 +223,6 @@@@@@ VOID APICDisable(VOID
       APICWrite(APIC_SIVR, tmp);
     }
     
 ----
 ----__inline ULONG _APICRead(ULONG Offset)
 ----{
 ----   PULONG p;
 ----
 ---    p = (PULONG)((ULONG)APICBase + Offset);
    -   p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ----   return *p;
 ----}
 ----
 ----#if 0
 ----__inline VOID APICWrite(ULONG Offset,
 ----                 ULONG Value)
 ----{
 ----   PULONG p;
 ----
 ---    p = (PULONG)((ULONG)APICBase + Offset);
    -   p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ----
 ----   *p = Value;
 ----}
 ----#else
 ----__inline VOID APICWrite(ULONG Offset,
 ----                 ULONG Value)
 ----{
 ----   PULONG p;
 ----   ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ----
 ----   lastregw[CPU] = Offset;
 ----   lastvalw[CPU] = Value;
 ----
 ---    p = (PULONG)((ULONG)APICBase + Offset);
    -   p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ----
 ----   *p = Value;
 ----}
 ----#endif
 ----
 ----
 ----#if 0
 ----__inline ULONG APICRead(ULONG Offset)
 ----{
 ----   PULONG p;
 ----
 ---    p = (PULONG)((ULONG)APICBase + Offset);
    -   p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ----   return *p;
 ----}
 ----#else
 ----__inline ULONG APICRead(ULONG Offset)
 ----{
 ----   PULONG p;
 ----   ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
 ----
 ----   lastregr[CPU] = Offset;
 ----   lastvalr[CPU] = 0;
 ----
 ---    p = (PULONG)((ULONG)APICBase + Offset);
    -   p = (PULONG)((ULONG_PTR)APICBase + Offset);
 ----
 ----   lastvalr[CPU] = *p;
 ----   return lastvalr[CPU];
 ----}
 ----#endif
 ----
 ----__inline VOID APICSendEOI(VOID)
 ----{
 ----  // Send the EOI
 ----  APICWrite(APIC_EOI, 0);
 ----}
 ----
     static VOID APICDumpBit(ULONG base)
     {
        ULONG v, i, j;
@@@@@@ -250,7 -316,8 -316,8 -316,8 -316,8 +250,7 @@@@@@ VOID APICDump(VOID
     {
       ULONG v, ver, maxlvt;
       ULONG r1, r2, w1, w2;
 ----  ULONG CPU = ThisCPU();;
 ----
 ++++  ULONG CPU = ThisCPU();
     
     
       r1 = lastregr[CPU];
     BOOLEAN VerifyLocalAPIC(VOID)
     {
        SIZE_T reg0, reg1;
 ----   ULONG l, h;
 ++++   LARGE_INTEGER MsrValue;
 ++++
        /* The version register is read-only in a real APIC */
        reg0 = APICRead(APIC_VER);
        DPRINT1("Getting VERSION: %x\n", reg0);
           return FALSE;
        }
     
 ----   Ke386Rdmsr(0x1b /*MSR_IA32_APICBASE*/, l, h);
 ++++   MsrValue.QuadPart = __readmsr(0x1B /*MSR_IA32_APICBASE*/);
     
 ----   if (!(l & /*MSR_IA32_APICBASE_ENABLE*/(1<<11))) 
 ++++   if (!(MsrValue.LowPart & /*MSR_IA32_APICBASE_ENABLE*/(1<<11))) 
        {
           DPRINT1("Local APIC disabled by BIOS -- reenabling.\n");
 ----      l &= ~/*MSR_IA32_APICBASE_BASE*/(1<<11);
 ----      l |= /*MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE*/(1<<11)|0xfee00000;
 ----      Ke386Wrmsr(0x1b/*MSR_IA32_APICBASE*/, l, h);
 ++++      MsrValue.LowPart &= ~/*MSR_IA32_APICBASE_BASE*/(1<<11);
 ++++      MsrValue.LowPart |= /*MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE*/(1<<11)|0xfee00000;
 ++++      __writemsr(0x1B /*MSR_IA32_APICBASE*/, MsrValue.HighPart);
        }
     
         
@@@@@@ -420,7 -486,7 -486,7 -486,7 -486,7 +420,7 @@@@@@ VOID APICSendIPI(ULONG Target, ULONG Mo
        ULONG tmp, i, flags;
     
        /* save flags and disable interrupts */
 ----   Ke386SaveFlags(flags);
 ++++   flags = __readeflags();
        _disable();
     
        /* Wait up to 100ms for the APIC to become ready */
        {
           DPRINT1("CPU(%d) Current IPI was not delivered after 100ms.\n", ThisCPU());
        }
 ----   Ke386RestoreFlags(flags);
 ++++   __writeeflags(flags);
     }
     #endif
     
@@@@@@ -709,6 -775,6 -775,6 -775,6 -775,9 +709,9 @@@@@@ VOI
     MpsIRQTrapFrameToTrapFrame(PKIRQ_TRAPFRAME IrqTrapFrame,
                           PKTRAP_FRAME TrapFrame)
     {
++++ #ifdef _M_AMD64
++++     UNIMPLEMENTED;
++++ #else
        TrapFrame->SegGs     = (USHORT)IrqTrapFrame->Gs;
        TrapFrame->SegFs     = (USHORT)IrqTrapFrame->Fs;
        TrapFrame->SegEs     = (USHORT)IrqTrapFrame->Es;
        TrapFrame->Eip    = IrqTrapFrame->Eip;
        TrapFrame->SegCs     = IrqTrapFrame->Cs;
        TrapFrame->EFlags = IrqTrapFrame->Eflags;
++++ #endif
     }
     
     VOID
@@@@@@ -771,12 -837,12 -837,12 -837,12 -841,12 +775,12 @@@@@@ VOID APICSetupLVTT(ULONG ClockTicks
        tmp = GET_APIC_VERSION(APICRead(APIC_VER));
        if (!APIC_INTEGRATED(tmp))
        {
 ----      tmp = SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV) | APIC_LVT_PERIODIC | LOCAL_TIMER_VECTOR;;
 ++++      tmp = SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV) | APIC_LVT_PERIODIC | LOCAL_TIMER_VECTOR;
        }
        else
        {
           /* Periodic timer */
 ----      tmp = APIC_LVT_PERIODIC | LOCAL_TIMER_VECTOR;;
 ++++      tmp = APIC_LVT_PERIODIC | LOCAL_TIMER_VECTOR;
        }
        APICWrite(APIC_LVTT, tmp);
     
@@@@@@ -798,7 -864,7 -864,7 -864,7 -868,7 +802,7 @@@@@@ APICCalibrateTimer(ULONG CPU
     
        APICSetupLVTT(1000000000);
     
----    TSCPresent = ((PKIPCR)KeGetPcr())->PrcbData.FeatureBits & KF_RDTSC ? TRUE : FALSE;
++++    TSCPresent = KeGetCurrentPrcb()->FeatureBits & KF_RDTSC ? TRUE : FALSE;
     
        /*
         * The timer chip counts down to zero. Let's wait
        if (TSCPresent)
        {
           t2.QuadPart = (LONGLONG)__rdtsc();
 ----      CPUMap[CPU].CoreSpeed = (HZ * (t2.QuadPart - t1.QuadPart));
 ++++      CPUMap[CPU].CoreSpeed = (HZ * (ULONG)(t2.QuadPart - t1.QuadPart));
           DPRINT("CPU clock speed is %ld.%04ld MHz.\n",
             CPUMap[CPU].CoreSpeed/1000000,
             CPUMap[CPU].CoreSpeed%1000000);
----       ((PKIPCR)KeGetPcr())->PrcbData.MHz = CPUMap[CPU].CoreSpeed/1000000;
++++       KeGetCurrentPrcb()->MHz = CPUMap[CPU].CoreSpeed/1000000;
        }
     
        CPUMap[CPU].BusSpeed = (HZ * (long)(tt1 - tt2) * APIC_DIVISOR);
     }
     
     VOID 
---- SetInterruptGate(ULONG index, ULONG address)
++++ SetInterruptGate(ULONG index, ULONG_PTR address)
     {
    -UNIMPLEMENTED;
++++ #ifdef _M_AMD64
+++++  KIDTENTRY64 *idt;
+++++
+++++  idt = &KeGetPcr()->IdtBase[index];
+++++
+++++  idt->OffsetLow = address & 0xffff;
+++++  idt->Selector = KGDT_64_R0_CODE;
+++++  idt->IstIndex = 0;
+++++  idt->Reserved0 = 0;
+++++  idt->Type = 0x0e;
+++++  idt->Dpl = 0;
+++++  idt->Present = 1;
+++++  idt->OffsetMiddle = (address >> 16) & 0xffff;
+++++  idt->OffsetHigh = address >> 32;
+++++  idt->Reserved1 = 0;
+++++  idt->Alignment = 0;
++++ #else
       KIDTENTRY *idt;
       KIDT_ACCESS Access;
     
       Access.SegmentType = I386_INTERRUPT_GATE;
       
       idt = (KIDTENTRY*)((ULONG)KeGetPcr()->IDT + index * sizeof(KIDTENTRY));
 ----  idt->Offset = address & 0xffff;
 ++++  idt->Offset = (USHORT)(address & 0xffff);
       idt->Selector = KGDT_R0_CODE;
       idt->Access = Access.Value;
 ----  idt->ExtendedOffset = address >> 16;
 ++++  idt->ExtendedOffset = (USHORT)(address >> 16);
++++ #endif
     }
     
     VOID HaliInitBSP(VOID)
        /* Only initialize the BSP once */
        if (BSPInitialized)
        {
 ----      KEBUGCHECK(0);
 ++++      ASSERT(FALSE);
           return;
        }
     
        BSPInitialized = TRUE;
     
        /* Setup interrupt handlers */
----    SetInterruptGate(LOCAL_TIMER_VECTOR, (ULONG)MpsTimerInterrupt);
----    SetInterruptGate(ERROR_VECTOR, (ULONG)MpsErrorInterrupt);
----    SetInterruptGate(SPURIOUS_VECTOR, (ULONG)MpsSpuriousInterrupt);
++++    SetInterruptGate(LOCAL_TIMER_VECTOR, (ULONG_PTR)MpsTimerInterrupt);
++++    SetInterruptGate(ERROR_VECTOR, (ULONG_PTR)MpsErrorInterrupt);
++++    SetInterruptGate(SPURIOUS_VECTOR, (ULONG_PTR)MpsSpuriousInterrupt);
     #ifdef CONFIG_SMP
----    SetInterruptGate(IPI_VECTOR, (ULONG)MpsIpiInterrupt);
++++    SetInterruptGate(IPI_VECTOR, (ULONG_PTR)MpsIpiInterrupt);
     #endif
        DPRINT("APIC is mapped at 0x%X\n", APICBase);
     
        else 
        {
           DPRINT("No APIC found\n");
 ----      KEBUGCHECK(0);
 ++++      ASSERT(FALSE);
        }
     
        if (APICMode == amPIC) 
        CommonBase = (PULONG)COMMON_AREA;
      
        /* Copy bootstrap code to common area */
-----   memcpy((PVOID)((ULONG)CommonBase + PAGE_SIZE),
+++++   memcpy((PVOID)((ULONG_PTR)CommonBase + PAGE_SIZE),
          &APstart,
-----     (ULONG)&APend - (ULONG)&APstart + 1);
+++++     (ULONG_PTR)&APend - (ULONG_PTR)&APstart + 1);
     
        /* Set shutdown code */
        CMOS_WRITE(0xF, 0xA);
     
        /* Set warm reset vector */
-----   ps = (PUSHORT)((ULONG)BIOSBase + 0x467);
+++++   ps = (PUSHORT)((ULONG_PTR)BIOSBase + 0x467);
        *ps = (COMMON_AREA + PAGE_SIZE) & 0xF;
      
-----   ps = (PUSHORT)((ULONG)BIOSBase + 0x469);
+++++   ps = (PUSHORT)((ULONG_PTR)BIOSBase + 0x469);
        *ps = (COMMON_AREA + PAGE_SIZE) >> 4;
     #endif
     
@@@@@@ -947,7 -1013,7 -1013,7 -1013,7 -1021,7 +969,7 @@@@@@ HaliStartApplicationProcessor(ULONG Cpu
            Cpu >= CPUCount ||
            OnlineCPUs & (1 << Cpu))
        {
 ----     KEBUGCHECK(0);
 ++++     ASSERT(FALSE);
        }
        DPRINT1("Attempting to boot CPU %d\n", Cpu);