5 #ifndef __INTERNAL_HAL_HAL_H
6 #define __INTERNAL_HAL_HAL_H
8 #define HAL_APC_REQUEST 0
9 #define HAL_DPC_REQUEST 1
12 struct _LOADER_PARAMETER_BLOCK
;
13 VOID FASTCALL
HalInitializeDisplay (struct _LOADER_PARAMETER_BLOCK
*LoaderBlock
);
14 VOID FASTCALL
HalClearDisplay (UCHAR CharAttribute
);
17 PADAPTER_OBJECT STDCALL
HalpAllocateAdapterEx(ULONG NumberOfMapRegisters
,BOOLEAN IsMaster
, BOOLEAN Dma32BitAddresses
);
20 VOID
HalpInitBusHandlers (VOID
);
23 VOID
HalpInitPICs(VOID
);
26 VOID
HalpCalibrateStallExecution(VOID
);
29 VOID
HalpInitPciBus (VOID
);
32 VOID
HalpStartEnumerator (VOID
);
35 VOID
HalpInitDma (VOID
);
38 PVOID
HalpMapPhysMemory(ULONG PhysAddr
, ULONG Size
);
40 /* Non-generic initialization */
41 VOID
HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock
);
43 /* DMA Page Register Structure
45 081 DMA Page Register (channel 2)
46 082 DMA Page Register (channel 3)
47 083 DMA Page Register (channel 1)
51 087 DMA Page Register (channel 0)
53 089 PS/2-DMA Page Register (channel 6)
54 08A PS/2-DMA Page Register (channel 7)
55 08B PS/2-DMA Page Register (channel 5)
59 08F PS/2-DMA Page Register (channel 4)
61 typedef struct _DMA_PAGE
{
74 } DMA_PAGE
, *PDMA_PAGE
;
76 /* DMA Channel Mask Register Structure
80 ------------------- - -----
81 | | | 00 - Select channel 0 mask bit
82 | | \---- 01 - Select channel 1 mask bit
83 | | 10 - Select channel 2 mask bit
84 | | 11 - Select channel 3 mask bit
86 | \---------- 0 - Clear mask bit
89 \----------------------- xx - Reserved
91 typedef struct _DMA_CHANNEL_MASK
{
95 } DMA_CHANNEL_MASK
, *PDMA_CHANNEL_MASK
;
97 /* DMA Mask Register Structure
101 \---/ - - ----- -----
102 | | | | | 00 - Channel 0 select
103 | | | | \---- 01 - Channel 1 select
104 | | | | 10 - Channel 2 select
105 | | | | 11 - Channel 3 select
107 | | | | 00 - Verify transfer
108 | | | \------------ 01 - Write transfer
109 | | | 10 - Read transfer
111 | | \-------------------- 0 - Autoinitialized
112 | | 1 - Non-autoinitialized
114 | \------------------------ 0 - Address increment select
117 \------------------------------ 01 - Single mode
121 typedef struct _DMA_MODE
{
123 UCHAR TransferType
: 2;
124 UCHAR AutoInitialize
: 1;
125 UCHAR AddressDecrement
: 1;
126 UCHAR RequestMode
: 2;
127 } DMA_MODE
, *PDMA_MODE
;
130 /* DMA Extended Mode Register Structure
134 - - ----- ----- -----
135 | | | | | 00 - Channel 0 select
136 | | | | \---- 01 - Channel 1 select
137 | | | | 10 - Channel 2 select
138 | | | | 11 - Channel 3 select
140 | | | | 00 - 8-bit I/O, by bytes
141 | | | \------------ 01 - 16-bit I/O, by words, address shifted
142 | | | 10 - 32-bit I/O, by bytes
143 | | | 11 - 16-bit I/O, by bytes
145 | | \---------------------- 00 - Compatible
150 | \---------------------------- 0 - Terminal Count is Output
152 \---------------------------------0 - Disable Stop Register
153 1 - Enable Stop Register
155 typedef struct _DMA_EXTENDED_MODE
{
156 UCHAR ChannelNumber
: 2;
157 UCHAR TransferSize
: 2;
158 UCHAR TimingMode
: 2;
159 UCHAR TerminalCountIsOutput
: 1;
160 UCHAR EnableStopRegister
: 1;
161 }DMA_EXTENDED_MODE
, *PDMA_EXTENDED_MODE
;
163 /* DMA Extended Mode Register Transfer Sizes */
169 /* DMA Extended Mode Register Timing */
170 #define COMPATIBLE_TIMING 0
171 #define TYPE_A_TIMING 1
172 #define TYPE_B_TIMING 2
173 #define BURST_TIMING 3
175 /* Channel Stop Registers for each Channel */
176 typedef struct _DMA_CHANNEL_STOP
{
181 } DMA_CHANNEL_STOP
, *PDMA_CHANNEL_STOP
;
184 #define VERIFY_TRANSFER 0x00
185 #define READ_TRANSFER 0x01
186 #define WRITE_TRANSFER 0x02
189 #define DEMAND_REQUEST_MODE 0x00
190 #define SINGLE_REQUEST_MODE 0x01
191 #define BLOCK_REQUEST_MODE 0x02
192 #define CASCADE_REQUEST_MODE 0x03
194 #define DMA_SETMASK 4
195 #define DMA_CLEARMASK 0
198 #define DMA_SINGLE_TRANSFER 0x40
199 #define DMA_AUTO_INIT 0x10
201 typedef struct _DMA1_ADDRESS_COUNT
{
202 UCHAR DmaBaseAddress
;
204 } DMA1_ADDRESS_COUNT
, *PDMA1_ADDRESS_COUNT
;
206 typedef struct _DMA2_ADDRESS_COUNT
{
207 UCHAR DmaBaseAddress
;
211 } DMA2_ADDRESS_COUNT
, *PDMA2_ADDRESS_COUNT
;
213 typedef struct _DMA1_CONTROL
{
214 DMA1_ADDRESS_COUNT DmaAddressCount
[4];
219 UCHAR ClearBytePointer
;
223 } DMA1_CONTROL
, *PDMA1_CONTROL
;
225 typedef struct _DMA2_CONTROL
{
226 DMA2_ADDRESS_COUNT DmaAddressCount
[4];
235 UCHAR ClearBytePointer
;
243 } DMA2_CONTROL
, *PDMA2_CONTROL
;
245 /* This Structure Defines the I/O Map of the 82537 Controller
246 I've only defined the registers which are likely to be useful to us */
247 typedef struct _EISA_CONTROL
{
248 /* DMA Controller 1 */
249 DMA1_CONTROL DmaController1
; /* 00h-0Fh */
250 UCHAR Reserved1
[16]; /* 0Fh-1Fh */
252 /* Interrupt Controller 1 (PIC) */
253 UCHAR Pic1Operation
; /* 20h */
254 UCHAR Pic1Interrupt
; /* 21h */
255 UCHAR Reserved2
[30]; /* 22h-3Fh */
258 UCHAR TimerCounter
; /* 40h */
259 UCHAR TimerMemoryRefresh
; /* 41h */
260 UCHAR Speaker
; /* 42h */
261 UCHAR TimerOperation
; /* 43h */
262 UCHAR TimerMisc
; /* 44h */
263 UCHAR Reserved3
[2]; /* 45-46h */
264 UCHAR TimerCounterControl
; /* 47h */
265 UCHAR TimerFailSafeCounter
; /* 48h */
266 UCHAR Reserved4
; /* 49h */
267 UCHAR TimerCounter2
; /* 4Ah */
268 UCHAR TimerOperation2
; /* 4Bh */
269 UCHAR Reserved5
[20]; /* 4Ch-5Fh */
271 /* NMI / Keyboard / RTC */
272 UCHAR Keyboard
; /* 60h */
273 UCHAR NmiStatus
; /* 61h */
274 UCHAR Reserved6
[14]; /* 62h-6Fh */
275 UCHAR NmiEnable
; /* 70h */
276 UCHAR Reserved7
[15]; /* 71h-7Fh */
278 /* DMA Page Registers Controller 1 */
279 DMA_PAGE DmaController1Pages
; /* 80h-8Fh */
280 UCHAR Reserved8
[16]; /* 90h-9Fh */
282 /* Interrupt Controller 2 (PIC) */
283 UCHAR Pic2Operation
; /* 0A0h */
284 UCHAR Pic2Interrupt
; /* 0A1h */
285 UCHAR Reserved9
[30]; /* 0A2h-0BFh */
287 /* DMA Controller 2 */
288 DMA1_CONTROL DmaController2
; /* 0C0h-0CFh */
290 /* System Reserved Ports */
291 UCHAR SystemReserved
[816]; /* 0D0h-3FFh */
293 /* Extended DMA Registers, Controller 1 */
294 UCHAR DmaHighByteCount1
[8]; /* 400h-407h */
295 UCHAR Reserved10
[2]; /* 408h-409h */
296 UCHAR DmaChainMode1
; /* 40Ah */
297 UCHAR DmaExtendedMode1
; /* 40Bh */
298 UCHAR DmaBufferControl
; /* 40Ch */
299 UCHAR Reserved11
[84]; /* 40Dh-460h */
300 UCHAR ExtendedNmiControl
; /* 461h */
301 UCHAR NmiCommand
; /* 462h */
302 UCHAR Reserved12
; /* 463h */
303 UCHAR BusMaster
; /* 464h */
304 UCHAR Reserved13
[27]; /* 465h-47Fh */
306 /* DMA Page Registers Controller 2 */
307 DMA_PAGE DmaController2Pages
; /* 480h-48Fh */
308 UCHAR Reserved14
[48]; /* 490h-4BFh */
310 /* Extended DMA Registers, Controller 2 */
311 UCHAR DmaHighByteCount2
[16]; /* 4C0h-4CFh */
313 /* Edge/Level Control Registers */
314 UCHAR Pic1EdgeLevel
; /* 4D0h */
315 UCHAR Pic2EdgeLevel
; /* 4D1h */
316 UCHAR Reserved15
[2]; /* 4D2h-4D3h */
318 /* Extended DMA Registers, Controller 2 */
319 UCHAR DmaChainMode2
; /* 4D4h */
320 UCHAR Reserved16
; /* 4D5h */
321 UCHAR DmaExtendedMode2
; /* 4D6h */
322 UCHAR Reserved17
[9]; /* 4D7h-4DFh */
324 /* DMA Stop Registers */
325 DMA_CHANNEL_STOP DmaChannelStop
[8]; /* 4E0h-4FFh */
326 } EISA_CONTROL
, *PEISA_CONTROL
;
328 extern ULONG HalpEisaDma
;
329 extern PADAPTER_OBJECT MasterAdapter
;
332 PADAPTER_OBJECT MasterAdapter
;
335 * ADAPTER_OBJECT - Track a busmaster DMA adapter and its associated resources
338 * - I've updated this to the Windows Object Defintion.
340 struct _ADAPTER_OBJECT
{
341 DMA_ADAPTER DmaHeader
;
342 struct _ADAPTER_OBJECT
*MasterAdapter
;
343 ULONG MapRegistersPerChannel
;
345 PVOID MapRegisterBase
;
346 ULONG NumberOfMapRegisters
;
347 ULONG CommittedMapRegisters
;
348 PWAIT_CONTEXT_BLOCK CurrentWcb
;
349 KDEVICE_QUEUE ChannelWaitQueue
;
350 PKDEVICE_QUEUE RegisterWaitQueue
;
351 LIST_ENTRY AdapterQueue
;
353 PRTL_BITMAP MapRegisters
;
357 USHORT DmaPortAddress
;
359 DMA_MODE AdapterMode
;
360 UCHAR AdapterModeByte
;
362 BOOLEAN NeedsMapRegisters
;
363 BOOLEAN MasterDevice
;
367 UCHAR Dma32BitAddresses
;
368 UCHAR Dma64BitAddresses
;
369 BOOLEAN LegacyAdapter
;
370 LIST_ENTRY AdapterList
;
374 struct _ADAPTER_OBJECT {
375 INTERFACE_TYPE InterfaceType;
384 ULONG AvailableMapRegisters;
385 PVOID MapRegisterBase;
386 ULONG AllocatedMapRegisters;
387 PWAIT_CONTEXT_BLOCK WaitContextBlock;
388 KDEVICE_QUEUE DeviceQueue;
389 BOOLEAN ScatterGather;
391 BOOLEAN AutoInitialize;
397 HalpQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass
,
400 OUT PULONG ReturnedLength
);
403 /* Non-standard functions */
405 HalReleaseDisplayOwnership();
408 HalQueryDisplayOwnership();
410 #if defined(__GNUC__)
411 #define Ki386SaveFlags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
412 #define Ki386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
413 #define Ki386DisableInterrupts() __asm__ __volatile__("cli\n\t")
414 #define Ki386EnableInterrupts() __asm__ __volatile__("sti\n\t")
415 #define Ki386HaltProcessor() __asm__ __volatile__("hlt\n\t")
416 #define Ki386RdTSC(x) __asm__ __volatile__("rdtsc\n\t" : "=A" (x.u.LowPart), "=d" (x.u.HighPart));
417 #define Ki386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a" (val1), "=d" (val2) : "c" (msr))
418 #define Ki386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
420 static inline BYTE
Ki386ReadFsByte(ULONG offset
)
423 __asm__
__volatile__("movb %%fs:(%1),%0":"=q" (b
):"r" (offset
));
427 static inline VOID
Ki386WriteFsByte(ULONG offset
, BYTE value
)
429 __asm__
__volatile__("movb %0,%%fs:(%1)"::"r" (value
), "r" (offset
));
432 #elif defined(_MSC_VER)
433 #define Ki386SaveFlags(x) __asm pushfd __asm pop x;
434 #define Ki386RestoreFlags(x) __asm push x __asm popfd;
435 #define Ki386DisableInterrupts() __asm cli
436 #define Ki386EnableInterrupts() __asm sti
437 #define Ki386HaltProcessor() __asm hlt
439 #error Unknown compiler for inline assembler
442 typedef struct tagHALP_HOOKS
444 void (*InitPciBus
)(ULONG BusNumber
, PBUS_HANDLER BusHandler
);
445 } HALP_HOOKS
, *PHALP_HOOKS
;
447 extern HALP_HOOKS HalpHooks
;
449 #endif /* __INTERNAL_HAL_HAL_H */