xref: /reactos/hal/halx86/include/halp.h (revision 7e069ccd)
1 /*
2  *
3  */
4 
5 #pragma once
6 
7 #ifdef CONFIG_SMP
8 #define HAL_BUILD_TYPE (DBG ? PRCB_BUILD_DEBUG : 0)
9 #else
10 #define HAL_BUILD_TYPE ((DBG ? PRCB_BUILD_DEBUG : 0) | PRCB_BUILD_UNIPROCESSOR)
11 #endif
12 
13 typedef struct _HAL_BIOS_FRAME
14 {
15     ULONG SegSs;
16     ULONG Esp;
17     ULONG EFlags;
18     ULONG SegCs;
19     ULONG Eip;
20     PKTRAP_FRAME TrapFrame;
21     ULONG CsLimit;
22     ULONG CsBase;
23     ULONG CsFlags;
24     ULONG SsLimit;
25     ULONG SsBase;
26     ULONG SsFlags;
27     ULONG Prefix;
28 } HAL_BIOS_FRAME, *PHAL_BIOS_FRAME;
29 
30 typedef
31 VOID
32 (__cdecl *PHAL_SW_INTERRUPT_HANDLER)(
33     VOID
34 );
35 
36 typedef
37 VOID
38 (FASTCALL *PHAL_SW_INTERRUPT_HANDLER_2ND_ENTRY)(
39     IN PKTRAP_FRAME TrapFrame
40 );
41 
42 #define HAL_APC_REQUEST         0
43 #define HAL_DPC_REQUEST         1
44 
45 /* HAL profiling offsets in KeGetPcr()->HalReserved[] */
46 #define HAL_PROFILING_INTERVAL      0
47 #define HAL_PROFILING_MULTIPLIER    1
48 
49 /* Usage flags */
50 #define IDT_REGISTERED          0x01
51 #define IDT_LATCHED             0x02
52 #define IDT_READ_ONLY           0x04
53 #define IDT_INTERNAL            0x11
54 #define IDT_DEVICE              0x21
55 
56 /* Conversion functions */
57 #define BCD_INT(bcd)            \
58     (((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F))
59 #define INT_BCD(int)            \
60     (UCHAR)(((int / 10) << 4) + (int % 10))
61 
62 typedef
63 BOOLEAN
64 (NTAPI *PHAL_DISMISS_INTERRUPT)(
65     IN KIRQL Irql,
66     IN ULONG Irq,
67     OUT PKIRQL OldIrql
68 );
69 
70 BOOLEAN
71 NTAPI
72 HalpDismissIrqGeneric(
73     IN KIRQL Irql,
74     IN ULONG Irq,
75     OUT PKIRQL OldIrql
76 );
77 
78 BOOLEAN
79 NTAPI
80 HalpDismissIrq15(
81     IN KIRQL Irql,
82     IN ULONG Irq,
83     OUT PKIRQL OldIrql
84 );
85 
86 BOOLEAN
87 NTAPI
88 HalpDismissIrq13(
89     IN KIRQL Irql,
90     IN ULONG Irq,
91     OUT PKIRQL OldIrql
92 );
93 
94 BOOLEAN
95 NTAPI
96 HalpDismissIrq07(
97     IN KIRQL Irql,
98     IN ULONG Irq,
99     OUT PKIRQL OldIrql
100 );
101 
102 BOOLEAN
103 NTAPI
104 HalpDismissIrqLevel(
105     IN KIRQL Irql,
106     IN ULONG Irq,
107     OUT PKIRQL OldIrql
108 );
109 
110 BOOLEAN
111 NTAPI
112 HalpDismissIrq15Level(
113     IN KIRQL Irql,
114     IN ULONG Irq,
115     OUT PKIRQL OldIrql
116 );
117 
118 BOOLEAN
119 NTAPI
120 HalpDismissIrq13Level(
121     IN KIRQL Irql,
122     IN ULONG Irq,
123     OUT PKIRQL OldIrql
124 );
125 
126 BOOLEAN
127 NTAPI
128 HalpDismissIrq07Level(
129     IN KIRQL Irql,
130     IN ULONG Irq,
131     OUT PKIRQL OldIrql
132 );
133 
134 VOID
135 __cdecl
136 HalpHardwareInterruptLevel(
137     VOID
138 );
139 
140 //
141 // Hack Flags
142 //
143 #define HALP_REVISION_FROM_HACK_FLAGS(x)    ((x) >> 24)
144 #define HALP_REVISION_HACK_FLAGS(x)         ((x) >> 12)
145 #define HALP_HACK_FLAGS(x)                  ((x) & 0xFFF)
146 
147 //
148 // Feature flags
149 //
150 #define HALP_CARD_FEATURE_FULL_DECODE   0x0001
151 
152 //
153 // Match Flags
154 //
155 #define HALP_CHECK_CARD_REVISION_ID     0x10000
156 #define HALP_CHECK_CARD_SUBVENDOR_ID    0x20000
157 #define HALP_CHECK_CARD_SUBSYSTEM_ID    0x40000
158 
159 //
160 // Mm PTE/PDE to Hal PTE/PDE
161 //
162 #define HalAddressToPde(x) (PHARDWARE_PTE)MiAddressToPde(x)
163 #define HalAddressToPte(x) (PHARDWARE_PTE)MiAddressToPte(x)
164 
165 typedef struct _IDTUsageFlags
166 {
167     UCHAR Flags;
168 } IDTUsageFlags;
169 
170 typedef struct
171 {
172     KIRQL Irql;
173     UCHAR BusReleativeVector;
174 } IDTUsage;
175 
176 typedef struct _HalAddressUsage
177 {
178     struct _HalAddressUsage *Next;
179     CM_RESOURCE_TYPE Type;
180     UCHAR Flags;
181     struct
182     {
183         ULONG Start;
184         ULONG Length;
185     } Element[];
186 } ADDRESS_USAGE, *PADDRESS_USAGE;
187 
188 /* adapter.c */
189 PADAPTER_OBJECT NTAPI HalpAllocateAdapterEx(ULONG NumberOfMapRegisters,BOOLEAN IsMaster, BOOLEAN Dma32BitAddresses);
190 
191 /* sysinfo.c */
192 INIT_FUNCTION
193 VOID
194 NTAPI
195 HalpRegisterVector(IN UCHAR Flags,
196                    IN ULONG BusVector,
197                    IN ULONG SystemVector,
198                    IN KIRQL Irql);
199 
200 INIT_FUNCTION
201 VOID
202 NTAPI
203 HalpEnableInterruptHandler(IN UCHAR Flags,
204                            IN ULONG BusVector,
205                            IN ULONG SystemVector,
206                            IN KIRQL Irql,
207                            IN PVOID Handler,
208                            IN KINTERRUPT_MODE Mode);
209 
210 /* pic.c */
211 VOID NTAPI HalpInitializePICs(IN BOOLEAN EnableInterrupts);
212 VOID __cdecl HalpApcInterrupt(VOID);
213 VOID __cdecl HalpDispatchInterrupt(VOID);
214 PHAL_SW_INTERRUPT_HANDLER __cdecl HalpDispatchInterrupt2(VOID);
215 DECLSPEC_NORETURN VOID FASTCALL HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
216 DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
217 
218 /* profil.c */
219 extern BOOLEAN HalpProfilingStopped;
220 
221 /* timer.c */
222 INIT_FUNCTION VOID NTAPI HalpInitializeClock(VOID);
223 VOID __cdecl HalpClockInterrupt(VOID);
224 VOID __cdecl HalpProfileInterrupt(VOID);
225 
226 VOID
227 NTAPI
228 HalpCalibrateStallExecution(VOID);
229 
230 /* pci.c */
231 VOID HalpInitPciBus (VOID);
232 
233 /* dma.c */
234 INIT_FUNCTION VOID HalpInitDma (VOID);
235 
236 /* Non-generic initialization */
237 VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock);
238 VOID HalpInitPhase1(VOID);
239 
240 VOID
241 NTAPI
242 HalpFlushTLB(VOID);
243 
244 //
245 // KD Support
246 //
247 VOID
248 NTAPI
249 HalpCheckPowerButton(
250     VOID
251 );
252 
253 INIT_FUNCTION
254 VOID
255 NTAPI
256 HalpRegisterKdSupportFunctions(
257     VOID
258 );
259 
260 INIT_FUNCTION
261 NTSTATUS
262 NTAPI
263 HalpSetupPciDeviceForDebugging(
264     IN PVOID LoaderBlock,
265     IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
266 );
267 
268 INIT_FUNCTION
269 NTSTATUS
270 NTAPI
271 HalpReleasePciDeviceForDebugging(
272     IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice
273 );
274 
275 //
276 // Memory routines
277 //
278 ULONG64
279 NTAPI
280 HalpAllocPhysicalMemory(
281     IN PLOADER_PARAMETER_BLOCK LoaderBlock,
282     IN ULONG64 MaxAddress,
283     IN PFN_NUMBER PageCount,
284     IN BOOLEAN Aligned
285 );
286 
287 PVOID
288 NTAPI
289 HalpMapPhysicalMemory64Vista(
290     IN PHYSICAL_ADDRESS PhysicalAddress,
291     IN PFN_COUNT PageCount,
292     IN BOOLEAN FlushCurrentTLB
293 );
294 
295 VOID
296 NTAPI
297 HalpUnmapVirtualAddressVista(
298     IN PVOID VirtualAddress,
299     IN PFN_COUNT NumberPages,
300     IN BOOLEAN FlushCurrentTLB
301 );
302 
303 PVOID
304 NTAPI
305 HalpMapPhysicalMemory64(
306     IN PHYSICAL_ADDRESS PhysicalAddress,
307     IN PFN_COUNT PageCount
308 );
309 
310 VOID
311 NTAPI
312 HalpUnmapVirtualAddress(
313     IN PVOID VirtualAddress,
314     IN PFN_COUNT NumberPages
315 );
316 
317 /* sysinfo.c */
318 NTSTATUS
319 NTAPI
320 HaliQuerySystemInformation(
321     IN HAL_QUERY_INFORMATION_CLASS InformationClass,
322     IN ULONG BufferSize,
323     IN OUT PVOID Buffer,
324     OUT PULONG ReturnedLength
325 );
326 
327 NTSTATUS
328 NTAPI
329 HaliSetSystemInformation(
330     IN HAL_SET_INFORMATION_CLASS InformationClass,
331     IN ULONG BufferSize,
332     IN OUT PVOID Buffer
333 );
334 
335 //
336 // BIOS Routines
337 //
338 BOOLEAN
339 NTAPI
340 HalpBiosDisplayReset(
341     VOID
342 );
343 
344 VOID
345 FASTCALL
346 HalpExitToV86(
347     PKTRAP_FRAME TrapFrame
348 );
349 
350 VOID
351 __cdecl
352 HalpRealModeStart(
353     VOID
354 );
355 
356 //
357 // Processor Halt Routine
358 //
359 VOID
360 NTAPI
361 HaliHaltSystem(
362     VOID
363 );
364 
365 //
366 // CMOS Routines
367 //
368 INIT_FUNCTION
369 VOID
370 NTAPI
371 HalpInitializeCmos(
372     VOID
373 );
374 
375 UCHAR
376 NTAPI
377 HalpReadCmos(
378     IN UCHAR Reg
379 );
380 
381 VOID
382 NTAPI
383 HalpWriteCmos(
384     IN UCHAR Reg,
385     IN UCHAR Value
386 );
387 
388 //
389 // Spinlock for protecting CMOS access
390 //
391 VOID
392 NTAPI
393 HalpAcquireCmosSpinLock(
394     VOID
395 );
396 
397 VOID
398 NTAPI
399 HalpReleaseCmosSpinLock(
400     VOID
401 );
402 
403 VOID
404 NTAPI
405 HalpInitializeLegacyPICs(
406     VOID
407 );
408 
409 NTSTATUS
410 NTAPI
411 HalpOpenRegistryKey(
412     IN PHANDLE KeyHandle,
413     IN HANDLE RootKey,
414     IN PUNICODE_STRING KeyName,
415     IN ACCESS_MASK DesiredAccess,
416     IN BOOLEAN Create
417 );
418 
419 INIT_FUNCTION
420 VOID
421 NTAPI
422 HalpGetNMICrashFlag(
423     VOID
424 );
425 
426 INIT_FUNCTION
427 BOOLEAN
428 NTAPI
429 HalpGetDebugPortTable(
430     VOID
431 );
432 
433 INIT_FUNCTION
434 VOID
435 NTAPI
436 HalpReportSerialNumber(
437     VOID
438 );
439 
440 INIT_FUNCTION
441 NTSTATUS
442 NTAPI
443 HalpMarkAcpiHal(
444     VOID
445 );
446 
447 INIT_FUNCTION
448 VOID
449 NTAPI
450 HalpBuildAddressMap(
451     VOID
452 );
453 
454 INIT_FUNCTION
455 VOID
456 NTAPI
457 HalpReportResourceUsage(
458     IN PUNICODE_STRING HalName,
459     IN INTERFACE_TYPE InterfaceType
460 );
461 
462 INIT_FUNCTION
463 ULONG
464 NTAPI
465 HalpIs16BitPortDecodeSupported(
466     VOID
467 );
468 
469 NTSTATUS
470 NTAPI
471 HalpQueryAcpiResourceRequirements(
472     OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements
473 );
474 
475 VOID
476 FASTCALL
477 KeUpdateSystemTime(
478     IN PKTRAP_FRAME TrapFrame,
479     IN ULONG Increment,
480     IN KIRQL OldIrql
481 );
482 
483 INIT_FUNCTION
484 VOID
485 NTAPI
486 HalpInitBusHandlers(
487     VOID
488 );
489 
490 NTSTATUS
491 NTAPI
492 HaliInitPnpDriver(
493     VOID
494 );
495 
496 INIT_FUNCTION
497 VOID
498 NTAPI
499 HalpDebugPciDumpBus(
500     IN ULONG i,
501     IN ULONG j,
502     IN ULONG k,
503     IN PPCI_COMMON_CONFIG PciData
504 );
505 
506 VOID
507 NTAPI
508 HalpInitProcessor(
509     IN ULONG ProcessorNumber,
510     IN PLOADER_PARAMETER_BLOCK LoaderBlock
511 );
512 
513 #ifdef _M_AMD64
514 
515 VOID
516 NTAPI
517 HalInitializeBios(
518     _In_ ULONG Unknown,
519     _In_ PLOADER_PARAMETER_BLOCK LoaderBlock
520 );
521 
522 #define KfLowerIrql KeLowerIrql
523 #define KiEnterInterruptTrap(TrapFrame) /* We do all neccessary in asm code */
524 #define KiEoiHelper(TrapFrame) return /* Just return to the caller */
525 #define HalBeginSystemInterrupt(Irql, Vector, OldIrql) ((*(OldIrql) = PASSIVE_LEVEL), TRUE)
526 #ifndef CONFIG_SMP
527 /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */
528 #define KiAcquireSpinLock(SpinLock)
529 #define KiReleaseSpinLock(SpinLock)
530 #define KfAcquireSpinLock(SpinLock) KfRaiseIrql(DISPATCH_LEVEL);
531 #define KfReleaseSpinLock(SpinLock, OldIrql) KeLowerIrql(OldIrql);
532 #endif // !CONFIG_SMP
533 #endif // _M_AMD64
534 
535 extern BOOLEAN HalpNMIInProgress;
536 
537 extern ADDRESS_USAGE HalpDefaultIoSpace;
538 
539 extern KSPIN_LOCK HalpSystemHardwareLock;
540 
541 extern PADDRESS_USAGE HalpAddressUsageList;
542 
543 extern LARGE_INTEGER HalpPerfCounter;
544 
545 extern KAFFINITY HalpActiveProcessors;
546 
547 extern BOOLEAN HalDisableFirmwareMapper;
548 extern PWCHAR HalHardwareIdString;
549 extern PWCHAR HalName;
550 
551 extern KAFFINITY HalpDefaultInterruptAffinity;
552 
553 extern IDTUsageFlags HalpIDTUsageFlags[MAXIMUM_IDTVECTOR+1];
554 
555 extern const USHORT HalpBuildType;
556