35905, 35906, 35942, 35947, 35948, 35949, 35953, 36013, 36388, 36389, 36570, 37873, 37991, 39151 from amd64 branch
svn path=/trunk/; revision=43173
<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>
NTAPI
HalSetProfileInterval(IN ULONG_PTR Interval)
{
---- KEBUGCHECK(0);
++++ ASSERT(FALSE);
return Interval;
}
- #if 0
+
+++ #ifndef _M_AMD64
VOID
FASTCALL
ExAcquireFastMutex(
return 0;
}
-----
+++++#ifndef _M_AMD64
VOID
FASTCALL
KeAcquireInStackQueuedSpinLock(
{
UNIMPLEMENTED;
}
+++++#endif
VOID
NTAPI
return Value;
}
--#if 0
+++++#ifndef _M_AMD64
#undef KeRaiseIrql
VOID
NTAPI
return (KIRQL)0;
}
+++ #endif
+++++#ifndef _M_AMD64
#undef KeReleaseSpinLock
VOID
NTAPI
{
UNIMPLEMENTED;
}
-----
+++++#endif
VOID
NTAPI
{
UNIMPLEMENTED;
}
+++ #endif
-
+ #if !defined(_M_AMD64)
VOID
NTAPI
READ_PORT_BUFFER_UCHAR(
<?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>
--- /dev/null
--- /dev/null
--- /dev/null
-- .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
+++
--- /dev/null
--- /dev/null
--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 */
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)
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 */
#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) */
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 */
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;
}
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)
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