#pragma once
+#define PLACE_IN_SECTION(s) __attribute__((section (s)))
+#ifdef __GNUC__
+#define INIT_FUNCTION
+#define PAGE_LOCKED_FUNCTION PLACE_IN_SECTION("pagelk")
+#define PAGE_UNLOCKED_FUNCTION PLACE_IN_SECTION("pagepo")
+#else
+#define INIT_FUNCTION
+#define PAGE_LOCKED_FUNCTION
+#define PAGE_UNLOCKED_FUNCTION
+#endif
+
+#ifdef _MSC_VER
+#define REGISTERCALL FASTCALL
+#else
+#define REGISTERCALL __attribute__((regparm(3)))
+#endif
+
typedef struct _HAL_BIOS_FRAME
{
ULONG SegSs;
);
typedef
-FASTCALL
VOID
-DECLSPEC_NORETURN
-(*PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)(
+ATTRIB_NORETURN
+(FASTCALL *PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)(
IN PKTRAP_FRAME TrapFrame
);
#define CMOS_CONTROL_PORT (PUCHAR)0x70
#define CMOS_DATA_PORT (PUCHAR)0x71
#define RTC_REGISTER_A 0x0A
+#define RTC_REG_A_UIP 0x80
#define RTC_REGISTER_B 0x0B
-#define RTC_REG_A_UIP 0x80
+#define RTC_REG_B_PI 0x40
+#define RTC_REGISTER_C 0x0C
+#define RTC_REGISTER_D 0x0D
#define RTC_REGISTER_CENTURY 0x32
/* Usage flags */
typedef
BOOLEAN
-__attribute__((regparm(3)))
-(*PHAL_DISMISS_INTERRUPT)(
+( REGISTERCALL *PHAL_DISMISS_INTERRUPT)(
IN KIRQL Irql,
IN ULONG Irq,
OUT PKIRQL OldIrql
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrqGeneric(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq15(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq13(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq07(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrqLevel(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq15Level(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq13Level(
IN KIRQL Irql,
IN ULONG Irq,
);
BOOLEAN
-__attribute__((regparm(3)))
+REGISTERCALL
HalpDismissIrq07Level(
IN KIRQL Irql,
IN ULONG Irq,
VOID
);
+//
+// Hack Flags
+//
+#define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
+#define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
+#define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
+
+//
+// Feature flags
+//
+#define HALP_CARD_FEATURE_FULL_DECODE 0x0001
+
+//
+// Match Flags
+//
+#define HALP_CHECK_CARD_REVISION_ID 0x10000
+#define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
+#define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
+
//
// Mm PTE/PDE to Hal PTE/PDE
//
VOID HalpApcInterrupt(VOID);
VOID HalpDispatchInterrupt(VOID);
VOID HalpDispatchInterrupt2(VOID);
-VOID FASTCALL DECLSPEC_NORETURN HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
-VOID FASTCALL DECLSPEC_NORETURN HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
+DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
/* timer.c */
VOID NTAPI HalpInitializeClock(VOID);
);
//
-// CMOS initialization
+// CMOS Routines
//
VOID
NTAPI
VOID
);
+UCHAR
+NTAPI
+HalpReadCmos(
+ IN UCHAR Reg
+);
+
+VOID
+NTAPI
+HalpWriteCmos(
+ IN UCHAR Reg,
+ IN UCHAR Value
+);
+
//
// Spinlock for protecting CMOS access
//
IN KIRQL OldIrql
);
+VOID
+NTAPI
+HalpInitBusHandlers(
+ VOID
+);
+
+NTSTATUS
+NTAPI
+HaliInitPnpDriver(
+ VOID
+);
+
+VOID
+NTAPI
+HalpDebugPciDumpBus(
+ IN ULONG i,
+ IN ULONG j,
+ IN ULONG k,
+ IN PPCI_COMMON_CONFIG PciData
+);
+
#ifdef _M_AMD64
#define KfLowerIrql KeLowerIrql
#ifndef CONFIG_SMP
extern BOOLEAN HalDisableFirmwareMapper;
extern PWCHAR HalHardwareIdString;
extern PWCHAR HalName;
+
+extern KAFFINITY HalpDefaultInterruptAffinity;
+
+extern IDTUsageFlags HalpIDTUsageFlags[MAXIMUM_IDTVECTOR];
+