Fixed Ki386WriteFsByte.
[reactos.git] / reactos / hal / halx86 / include / halp.h
1 /*
2 *
3 */
4
5 #ifndef __INTERNAL_HAL_HAL_H
6 #define __INTERNAL_HAL_HAL_H
7
8 #define HAL_APC_REQUEST 0
9 #define HAL_DPC_REQUEST 1
10
11 /* display.c */
12 struct _LOADER_PARAMETER_BLOCK;
13 VOID FASTCALL HalInitializeDisplay (struct _LOADER_PARAMETER_BLOCK *LoaderBlock);
14 VOID FASTCALL HalClearDisplay (UCHAR CharAttribute);
15
16 /* adapter.c */
17 PADAPTER_OBJECT STDCALL HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
18
19 /* bus.c */
20 VOID HalpInitBusHandlers (VOID);
21
22 /* irql.c */
23 VOID HalpInitPICs(VOID);
24
25 /* udelay.c */
26 VOID HalpCalibrateStallExecution(VOID);
27
28 /* pci.c */
29 VOID HalpInitPciBus (VOID);
30
31 /* enum.c */
32 VOID HalpStartEnumerator (VOID);
33
34 /* dma.c */
35 VOID HalpInitDma (VOID);
36
37 /* mem.c */
38 PVOID HalpMapPhysMemory(ULONG PhysAddr, ULONG Size);
39
40 /* Non-generic initialization */
41 VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
42
43 /* sysinfo.c */
44 NTSTATUS STDCALL
45 HalpQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
46 IN ULONG BufferSize,
47 IN OUT PVOID Buffer,
48 OUT PULONG ReturnedLength);
49
50 /* Non-standard functions */
51 VOID STDCALL
52 HalReleaseDisplayOwnership();
53
54 BOOLEAN STDCALL
55 HalQueryDisplayOwnership();
56
57 #if defined(__GNUC__)
58 #define Ki386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
59 #define Ki386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
60 #define Ki386DisableInterrupts() __asm__ __volatile__("cli\n\t")
61 #define Ki386EnableInterrupts() __asm__ __volatile__("sti\n\t")
62 #define Ki386HaltProcessor() __asm__ __volatile__("hlt\n\t")
63 #define Ki386RdTSC(x) __asm__ __volatile__("rdtsc\n\t" : "=A" (x.u.LowPart), "=d" (x.u.HighPart));
64 #define Ki386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
65 #define Ki386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
66
67 static inline BYTE Ki386ReadFsByte(ULONG offset)
68 {
69 BYTE b;
70 __asm__ __volatile__("movb %%fs:(%1),%0":"=q" (b):"r" (offset));
71 return b;
72 }
73
74 static inline VOID Ki386WriteFsByte(ULONG offset, BYTE value)
75 {
76 __asm__ __volatile__("movb %0,%%fs:(%1)"::"q" (value), "r" (offset));
77 }
78
79 #elif defined(_MSC_VER)
80 #define Ki386SaveFlags(x) __asm pushfd __asm pop x;
81 #define Ki386RestoreFlags(x) __asm push x __asm popfd;
82 #define Ki386DisableInterrupts() __asm cli
83 #define Ki386EnableInterrupts() __asm sti
84 #define Ki386HaltProcessor() __asm hlt
85 #else
86 #error Unknown compiler for inline assembler
87 #endif
88
89 typedef struct tagHALP_HOOKS
90 {
91 void (*InitPciBus)(ULONG BusNumber, PBUS_HANDLER BusHandler);
92 } HALP_HOOKS, *PHALP_HOOKS;
93
94 extern HALP_HOOKS HalpHooks;
95
96 #endif /* __INTERNAL_HAL_HAL_H */