ReactOS 0.4.15-dev-6068-g8061a6f
bios.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Hardware Abstraction Layer (HAL)
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * PURPOSE: BIOS Access Routines
5 * PROGRAMMERS: ReactOS Portable Systems Group
6 * Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <hal.h>
12
13#define NDEBUG
14#include <debug.h>
15
16#include <setjmp.h>
17
19
20/* GLOBALS ********************************************************************/
21
22//
23// PTE Data
24//
27
28//
29// IDT Data
30//
33
34//
35// TSS Data
36//
39
40//
41// IOPM Data
42//
47
48/* Where the protected mode stack is */
50
51/* Where the real mode code ends */
53
54/* Context saved for return from v86 mode */
56
57
58/* V86 OPCODE HANDLERS ********************************************************/
59
63{
64 PUCHAR Inst = (PUCHAR)(BiosFrame->CsBase + BiosFrame->Eip);
65
66 /* Print error message */
67 DPRINT1("HAL: An invalid V86 opcode was encountered at address %X:%X\n"
68 "Opcode: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
69 BiosFrame->SegCs, BiosFrame->Eip,
70 Inst[0], Inst[1], Inst[2], Inst[3], Inst[4],
71 Inst[5], Inst[6], Inst[7], Inst[8], Inst[9]);
72
73 /* Break */
75 return FALSE;
76}
77
82{
84 ULONG Eip;
85
86 /* Calculate stack address (SP) */
87 Stack = (PUSHORT)(BiosFrame->SsBase + (BiosFrame->Esp & 0xFFFF));
88
89 /* Push EFlags */
90 Stack--;
91 *Stack = BiosFrame->EFlags & 0xFFFF;
92
93 /* Push CS */
94 Stack--;
95 *Stack = BiosFrame->SegCs & 0xFFFF;
96
97 /* Push IP */
98 Stack--;
99 *Stack = BiosFrame->Eip & 0xFFFF;
100
101 /* Compute new CS:IP from the IVT address for this interrupt entry */
102 Eip = *(PULONG)(Interrupt * 4);
103 BiosFrame->Eip = Eip & 0xFFFF;
104 BiosFrame->SegCs = Eip >> 16;
105
106 /* Update stack address */
107 BiosFrame->Esp = (ULONG_PTR)Stack & 0xFFFF;
108
109 /* Update CS to linear */
110 BiosFrame->CsBase = BiosFrame->SegCs << 4;
111 BiosFrame->CsLimit = 0xFFFF;
112 BiosFrame->CsFlags = 0;
113
114 /* We're done */
115 return TRUE;
116}
117
121{
123 PKTRAP_FRAME TrapFrame;
124
125 /* Convert SS to linear */
126 BiosFrame->SsBase = BiosFrame->SegSs << 4;
127 BiosFrame->SsLimit = 0xFFFF;
128 BiosFrame->SsFlags = 0;
129
130 /* Increase EIP and validate */
131 BiosFrame->Eip++;
132 if (BiosFrame->Eip > BiosFrame->CsLimit) return FALSE;
133
134 /* Read interrupt number */
135 Interrupt = *(PUCHAR)(BiosFrame->CsBase + BiosFrame->Eip);
136
137 /* Increase EIP and push the interrupt */
138 BiosFrame->Eip++;
139 if (HalpPushInt(BiosFrame, Interrupt))
140 {
141 /* Update the trap frame */
142 TrapFrame = BiosFrame->TrapFrame;
143 TrapFrame->HardwareSegSs = BiosFrame->SegSs;
144 TrapFrame->HardwareEsp = BiosFrame->Esp;
145 TrapFrame->SegCs = BiosFrame->SegCs;
146 TrapFrame->EFlags = BiosFrame->EFlags;
147
148 /* Success */
149 return TRUE;
150 }
151
152 /* Failure */
153 return FALSE;
154}
155
159{
161 HAL_BIOS_FRAME BiosFrame;
162
163 /* Fill out the BIOS frame */
164 BiosFrame.TrapFrame = TrapFrame;
165 BiosFrame.SegSs = TrapFrame->HardwareSegSs;
166 BiosFrame.Esp = TrapFrame->HardwareEsp;
167 BiosFrame.EFlags = TrapFrame->EFlags;
168 BiosFrame.SegCs = TrapFrame->SegCs;
169 BiosFrame.Eip = TrapFrame->Eip;
170 BiosFrame.Prefix = 0;
171
172 /* Convert CS to linear */
173 BiosFrame.CsBase = BiosFrame.SegCs << 4;
174 BiosFrame.CsLimit = 0xFFFF;
175 BiosFrame.CsFlags = 0;
176
177 /* Validate IP */
178 if (BiosFrame.Eip > BiosFrame.CsLimit) return FALSE;
179
180 /* Read IP */
181 Instruction = *(PUCHAR)(BiosFrame.CsBase + BiosFrame.Eip);
182 if (Instruction != 0xCD)
183 {
184 /* We only support INT */
185 HalpOpcodeInvalid(&BiosFrame);
186 return FALSE;
187 }
188
189 /* Handle the interrupt */
190 if (HalpOpcodeINTnn(&BiosFrame))
191 {
192 /* Update EIP */
193 TrapFrame->Eip = BiosFrame.Eip;
194
195 /* We're done */
196 return TRUE;
197 }
198
199 /* Failure */
200 return FALSE;
201}
202
203/* V86 TRAP HANDLERS **********************************************************/
204
205#ifndef _MINIHAL_
207VOID
210{
211 /* Enter the trap */
212 KiEnterTrap(TrapFrame);
213
214 /* Check if this is a V86 trap */
215 if (TrapFrame->EFlags & EFLAGS_V86_MASK)
216 {
217 /* Dispatch the opcode and exit the trap */
218 HalpDispatchV86Opcode(TrapFrame);
219 KiEoiHelper(TrapFrame);
220 }
221
222 /* Strange, it isn't! This can happen during NMI */
223 DPRINT1("HAL: Trap0D while not in V86 mode\n");
224 KiDumpTrapFrame(TrapFrame);
225
226 ERROR_FATAL();
227 while (TRUE); /* 'noreturn' function */
228}
229
230VOID
233{
234 /* Restore ES/DS to known good values first */
235 Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
236 Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
237 Ke386SetFs(KGDT_R0_PCR);
238
239 /* Restore the stack */
240 KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
241
242 /* Return back to where we left */
243 longjmp(HalpSavedContext, 1);
245}
246
247/* V8086 ENTER ****************************************************************/
248
249VOID
250NTAPI
252{
253 /* Must be volatile so it doesn't get optimized away! */
254 volatile KTRAP_FRAME V86TrapFrame;
255 ULONG_PTR StackOffset, CodeOffset;
256
257 /* Save the context, check for return */
258 if (_setjmp(HalpSavedContext))
259 {
260 /* Returned from v86 */
261 return;
262 }
263
264 /* Kill alignment faults */
266
267 /* Set new stack address */
268 KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA);
269
270 /* Compute segmented IP and SP offsets */
272 CodeOffset = (ULONG_PTR)HalpRealModeStart & 0xFFF;
273
274 /* Now build the V86 trap frame */
275 V86TrapFrame.V86Es = 0;
276 V86TrapFrame.V86Ds = 0;
277 V86TrapFrame.V86Gs = 0;
278 V86TrapFrame.V86Fs = 0;
279 V86TrapFrame.HardwareSegSs = 0x2000;
280 V86TrapFrame.HardwareEsp = StackOffset + CodeOffset;
281 V86TrapFrame.EFlags = __readeflags() | EFLAGS_V86_MASK | EFLAGS_IOPL;
282 V86TrapFrame.SegCs = 0x2000;
283 V86TrapFrame.Eip = CodeOffset;
284
285 /* Exit to V86 mode */
286 HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame);
287}
288#endif
289
290/* FUNCTIONS ******************************************************************/
291
292VOID
293NTAPI
295{
296 USHORT Tss;
297 PKGDTENTRY TssGdt;
298 ULONG_PTR TssLimit;
299 PKTSS TssBase;
300
301 //
302 // Get the current TSS and its GDT entry
303 //
304 Tss = Ke386GetTr();
305 TssGdt = &KeGetPcr()->GDT[Tss / sizeof(KGDTENTRY)];
306
307 //
308 // Get the KTSS limit and check if it has IOPM space
309 //
310 TssLimit = TssGdt->LimitLow | TssGdt->HighWord.Bits.LimitHi << 16;
311
312 //
313 // If the KTSS doesn't have enough space this is probably an NMI or DF
314 //
315 if (TssLimit > IOPM_SIZE)
316 {
317 //
318 // We are good to go
319 //
320 HalpSavedTss = 0;
321 return;
322 }
323
324 //
325 // Get the "real" TSS
326 //
327 TssGdt = &KeGetPcr()->GDT[KGDT_TSS / sizeof(KGDTENTRY)];
328 TssBase = (PKTSS)(ULONG_PTR)(TssGdt->BaseLow |
329 TssGdt->HighWord.Bytes.BaseMid << 16 |
330 TssGdt->HighWord.Bytes.BaseHi << 24);
331
332 //
333 // Switch to it
334 //
335 KeGetPcr()->TSS = TssBase;
336
337 //
338 // Set it up
339 //
340 TssGdt->HighWord.Bits.Type = I386_TSS;
341 TssGdt->HighWord.Bits.Pres = 1;
342 TssGdt->HighWord.Bits.Dpl = 0;
343
344 //
345 // Load new TSS and return old one
346 //
347 Ke386SetTr(KGDT_TSS);
348 HalpSavedTss = Tss;
349}
350
351VOID
352NTAPI
354{
355 PKGDTENTRY TssGdt;
356 PKTSS TssBase;
357
358 //
359 // Get the original TSS
360 //
361 TssGdt = &KeGetPcr()->GDT[HalpSavedTss / sizeof(KGDTENTRY)];
362 TssBase = (PKTSS)(ULONG_PTR)(TssGdt->BaseLow |
363 TssGdt->HighWord.Bytes.BaseMid << 16 |
364 TssGdt->HighWord.Bytes.BaseHi << 24);
365
366 //
367 // Switch to it
368 //
369 KeGetPcr()->TSS = TssBase;
370
371 //
372 // Set it up
373 //
374 TssGdt->HighWord.Bits.Type = I386_TSS;
375 TssGdt->HighWord.Bits.Pres = 1;
376 TssGdt->HighWord.Bits.Dpl = 0;
377
378 //
379 // Load old TSS
380 //
381 Ke386SetTr(HalpSavedTss);
382}
383
384VOID
385NTAPI
387{
388 USHORT i, j;
390
391 //
392 // Loop the I/O Map
393 //
394 for (i = j = 0; i < IOPM_SIZE / sizeof(USHORT); i++)
395 {
396 //
397 // Check for non-FFFF entry
398 //
399 if (*Entry != 0xFFFF)
400 {
401 //
402 // Save it
403 //
404 HalpSavedIoMapData[j][0] = i;
406 j++;
407 }
408
409 //
410 // Clear it
411 //
412 *Entry++ = 0;
413 }
414
415 //
416 // Terminate it
417 //
418 while (i++ < IOPM_FULL_SIZE / sizeof(USHORT))
419 {
420 *Entry++ = 0xFFFF;
421 }
422
423 //
424 // Return the entries we saved
425 //
427}
428
429VOID
430NTAPI
432{
434
435 //
436 // Set default state
437 //
439
440 //
441 // Restore the backed up copy, and initialize it
442 //
444}
445
446#ifndef _MINIHAL_
447VOID
448NTAPI
450{
451 PHARDWARE_PTE Pte, V86Pte;
452 ULONG i;
453
454 //
455 // Get the page table directory for the lowest meg of memory
456 //
457 Pte = HalAddressToPde(0);
459 HalpSavedPte = *Pte;
460
461 //
462 // Map it to the HAL reserved region and make it valid
463 //
464 Pte->Valid = 1;
465 Pte->Write = 1;
466 Pte->Owner = 1;
467 Pte->PageFrameNumber = (HalAddressToPde(0xFFC00000))->PageFrameNumber;
468
469 //
470 // Flush the TLB
471 //
472 HalpFlushTLB();
473
474 //
475 // Now loop the first meg of memory
476 //
477 for (i = 0; i < 0x100000; i += PAGE_SIZE)
478 {
479 //
480 // Identity map it
481 //
482 Pte = HalAddressToPte(i);
483 Pte->PageFrameNumber = i >> PAGE_SHIFT;
484 Pte->Valid = 1;
485 Pte->Write = 1;
486 Pte->Owner = 1;
487 }
488
489 //
490 // Now get the entry for our real mode V86 code and the target
491 //
492 Pte = HalAddressToPte(0x20000);
494 do
495 {
496 //
497 // Map the physical address into our real-mode region
498 //
499 Pte->PageFrameNumber = V86Pte->PageFrameNumber;
500
501 //
502 // Keep going until we've reached the end of our region
503 //
504 Pte++;
505 V86Pte++;
506 } while (V86Pte <= HalAddressToPte(&HalpRealModeEnd));
507
508 //
509 // Flush the TLB
510 //
511 HalpFlushTLB();
512}
513
514VOID
515NTAPI
517{
518 //
519 // Save the current Invalid Opcode and General Protection Fault Handlers
520 //
523
524 //
525 // Now set our own GPF handler to handle exceptions while in real mode
526 //
528
529 //
530 // And our own invalid opcode handler to detect the BOP to get us out
531 //
533}
534#endif
535
536VOID
537NTAPI
539{
540 //
541 // Switch to valid TSS
542 //
544
545 //
546 // Save a copy of the I/O Map and delete it
547 //
548 HalpSavedIoMap = (PUSHORT)KeGetPcr()->TSS->IoMaps[0].IoMap;
550
551 //
552 // Save the IOPM and switch to the real-mode one
553 //
554 HalpSavedIopmBase = KeGetPcr()->TSS->IoMapBase;
555 KeGetPcr()->TSS->IoMapBase = KiComputeIopmOffset(1);
556
557 //
558 // Save our stack pointer
559 //
560 HalpSavedEsp0 = KeGetPcr()->TSS->Esp0;
561}
562
563VOID
564NTAPI
566{
567 //
568 // Keep dummy GPF handler in case we get an NMI during V8086
569 //
571 {
572 //
573 // Not an NMI -- put back the original handler
574 //
576 }
577
578 //
579 // Restore invalid opcode handler
580 //
582}
583
584VOID
585NTAPI
587{
588 //
589 // Restore the stack pointer
590 //
591 KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
592
593 //
594 // Restore the I/O Map
595 //
597
598 //
599 // Restore the IOPM
600 //
601 KeGetPcr()->TSS->IoMapBase = HalpSavedIopmBase;
602
603 //
604 // Restore the TSS
605 //
607}
608
609VOID
610NTAPI
612{
613 ULONG i;
614 PHARDWARE_PTE Pte;
615
616 //
617 // Loop the first meg of memory
618 //
619 for (i = 0; i < 0x100000; i += PAGE_SIZE)
620 {
621 //
622 // Invalidate each PTE
623 //
624 Pte = HalAddressToPte(i);
625 Pte->Valid = 0;
626 Pte->Write = 0;
627 Pte->Owner = 0;
628 Pte->PageFrameNumber = 0;
629 }
630
631 //
632 // Restore the PDE for the lowest megabyte of memory
633 //
634 Pte = HalAddressToPde(0);
635 *Pte = HalpSavedPte;
637
638 //
639 // Flush the TLB
640 //
641 HalpFlushTLB();
642}
643
644#ifndef _MINIHAL_
646NTAPI
648{
649#if defined(SARCH_XBOX) || defined(SARCH_PC98)
650 /* There is no VGA BIOS on these machine types */
651 return FALSE;
652#else
653 ULONG Flags;
654 PHARDWARE_PTE IdtPte;
655 BOOLEAN RestoreWriteProtection = FALSE;
656
657 //
658 // Disable interrupts
659 //
661 _disable();
662
663 //
664 // Map memory available to the V8086 real-mode code
665 //
667
668 //
669 // On P5, the first 7 entries of the IDT are write protected to work around
670 // the cmpxchg8b lock errata. Unprotect them here so we can set our custom
671 // invalid op-code handler.
672 //
673 IdtPte = HalAddressToPte(KeGetPcr()->IDT);
674 RestoreWriteProtection = IdtPte->Write != 0;
675 IdtPte->Write = 1;
676
677 //
678 // Use special invalid opcode and GPF trap handlers
679 //
681
682 //
683 // Configure the IOPM and TSS
684 //
686
687 //
688 // Now jump to real mode
689 //
690 HalpBiosCall();
691
692 //
693 // Restore kernel trap handlers
694 //
696
697 //
698 // Restore write permission
699 //
700 IdtPte->Write = RestoreWriteProtection;
701
702 //
703 // Restore TSS and IOPM
704 //
706
707 //
708 // Restore low memory mapping
709 //
711
712 //
713 // Restore interrupts if they were previously enabled
714 //
716 return TRUE;
717#endif
718}
719#endif
720
721/* EOF */
unsigned char BOOLEAN
#define __cdecl
Definition: accygwin.h:79
@ Instruction
Definition: asmpp.cpp:82
#define DPRINT1
Definition: precomp.h:8
_JBTYPE jmp_buf[_JBLEN]
Definition: setjmp.h:186
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ULONG_PTR
Definition: config.h:101
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
USHORT HalpSavedTss
Definition: bios.c:38
VOID NTAPI HalpBiosCall(VOID)
Definition: bios.c:251
VOID NTAPI HalpRestoreTrapHandlers(VOID)
Definition: bios.c:565
USHORT HalpSavedIopmBase
Definition: bios.c:43
HARDWARE_PTE HalpSavedPte
Definition: bios.c:26
VOID NTAPI HalpRestoreIoPermissionsAndTask(VOID)
Definition: bios.c:586
ULONG_PTR HalpSavedEsp
Definition: bios.c:49
DECLSPEC_NORETURN VOID FASTCALL HalpTrap0DHandler(IN PKTRAP_FRAME TrapFrame)
Definition: bios.c:209
VOID NTAPI HalpSwitchToRealModeTrapHandlers(VOID)
Definition: bios.c:516
USHORT HalpSavedIoMapData[IOPM_SIZE/sizeof(USHORT)][2]
Definition: bios.c:45
VOID NTAPI HalpStoreAndClearIopm(VOID)
Definition: bios.c:386
ULONG HalpSavedIoMapEntries
Definition: bios.c:46
BOOLEAN NTAPI HalpBiosDisplayReset(VOID)
Definition: bios.c:647
PUSHORT HalpSavedIoMap
Definition: bios.c:44
BOOLEAN FASTCALL HalpDispatchV86Opcode(IN PKTRAP_FRAME TrapFrame)
Definition: bios.c:158
VOID NTAPI HalpMapRealModeMemory(VOID)
Definition: bios.c:449
VOID NTAPI HalpUnmapRealModeMemory(VOID)
Definition: bios.c:611
jmp_buf HalpSavedContext
Definition: bios.c:55
PVOID HalpGpfHandler
Definition: bios.c:31
VOID NTAPI HalpReturnTss(VOID)
Definition: bios.c:353
BOOLEAN FASTCALL HalpPushInt(IN PHAL_BIOS_FRAME BiosFrame, IN ULONG Interrupt)
Definition: bios.c:80
VOID NTAPI HalpBorrowTss(VOID)
Definition: bios.c:294
BOOLEAN FASTCALL HalpOpcodeInvalid(IN PHAL_BIOS_FRAME BiosFrame)
Definition: bios.c:62
VOID DECLSPEC_NORETURN HalpTrap06(VOID)
Definition: bios.c:232
ULONG HalpSavedEsp0
Definition: bios.c:37
VOID NTAPI HalpSetupRealModeIoPermissionsAndTask(VOID)
Definition: bios.c:538
void __cdecl HalpTrap0D()
PVOID HalpRealModeEnd
ULONG HalpSavedPfn
Definition: bios.c:25
BOOLEAN FASTCALL HalpOpcodeINTnn(IN PHAL_BIOS_FRAME BiosFrame)
Definition: bios.c:120
VOID NTAPI HalpRestoreIopm(VOID)
Definition: bios.c:431
PVOID HalpBopHandler
Definition: bios.c:32
VOID NTAPI HalpFlushTLB(VOID)
Definition: misc.c:156
VOID __cdecl HalpRealModeStart(VOID)
VOID FASTCALL HalpExitToV86(PKTRAP_FRAME TrapFrame)
#define HalAddressToPte(x)
Definition: halp.h:163
#define HalAddressToPde(x)
Definition: halp.h:162
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:593
NTSYSAPI void WINAPI DbgBreakPoint(void)
void __cdecl _disable(void)
Definition: intrin_arm.h:365
__INTRIN_INLINE void __writeeflags(uintptr_t Value)
Definition: intrin_x86.h:1669
__INTRIN_INLINE unsigned long __readcr0(void)
Definition: intrin_x86.h:1804
__INTRIN_INLINE uintptr_t __readeflags(void)
Definition: intrin_x86.h:1674
__INTRIN_INLINE void __writecr0(unsigned int Data)
Definition: intrin_x86.h:1789
#define CR0_AM
Definition: asm.h:252
#define KiComputeIopmOffset(MapNumber)
Definition: ketypes.h:270
#define EFLAGS_V86_MASK
Definition: ketypes.h:132
#define I386_TSS
Definition: ketypes.h:60
#define PKTSS
Definition: ketypes.h:926
#define KGDTENTRY
Definition: ketypes.h:442
#define RPL_MASK
Definition: ketypes.h:69
#define EFLAGS_IOPL
Definition: ketypes.h:128
#define IOPM_FULL_SIZE
Definition: ketypes.h:181
#define KGDT_R3_DATA
Definition: ketypes.h:78
#define IOPM_SIZE
Definition: ketypes.h:180
#define KGDT_TSS
Definition: ketypes.h:79
#define KGDT_R0_PCR
Definition: ketypes.h:80
BOOLEAN HalpNMIInProgress
Definition: nmi.c:18
#define FASTCALL
Definition: nt_native.h:50
#define UNREACHABLE
#define DECLSPEC_NORETURN
Definition: ntbasedef.h:176
FORCEINLINE PVOID KeQueryInterruptHandler(IN ULONG Vector)
Definition: ke.h:327
FORCEINLINE VOID KeRegisterInterruptHandler(IN ULONG Vector, IN PVOID Handler)
Definition: ke.h:301
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
Definition: traphdlr.c:126
unsigned short USHORT
Definition: pedump.c:61
#define ERROR_FATAL(...)
Definition: debug.h:238
#define KeGetPcr()
Definition: ke.h:26
base of all file and directory entries
Definition: entries.h:83
PKTRAP_FRAME TrapFrame
Definition: halp.h:20
ULONG CsLimit
Definition: halp.h:21
ULONG Eip
Definition: halp.h:19
ULONG SegSs
Definition: halp.h:15
ULONG SegCs
Definition: halp.h:18
ULONG CsFlags
Definition: halp.h:23
ULONG CsBase
Definition: halp.h:22
ULONG Prefix
Definition: halp.h:27
ULONG EFlags
Definition: halp.h:17
ULONG Esp
Definition: halp.h:16
ULONG64 Owner
Definition: mmtypes.h:68
ULONG64 PageFrameNumber
Definition: mmtypes.h:78
ULONG64 Write
Definition: mmtypes.h:67
ULONG64 Valid
Definition: mmtypes.h:66
USHORT BaseLow
Definition: ketypes.h:337
USHORT LimitLow
Definition: ketypes.h:336
struct _KGDTENTRY::@2424::@2425 Bytes
union _KGDTENTRY::@2424 HighWord
struct _KGDTENTRY::@2424::@2426 Bits
ULONG HardwareSegSs
Definition: ketypes.h:272
ULONG V86Ds
Definition: ketypes.h:274
ULONG EFlags
Definition: ketypes.h:389
ULONG V86Es
Definition: ketypes.h:273
ULONG HardwareEsp
Definition: ketypes.h:271
USHORT SegSs
Definition: ketypes.h:392
ULONG Eip
Definition: ketypes.h:268
USHORT SegCs
Definition: ketypes.h:385
ULONG V86Fs
Definition: ketypes.h:275
UINT64 TrapFrame
Definition: ketypes.h:373
ULONG V86Gs
Definition: ketypes.h:276
Definition: ketypes.h:791
FORCEINLINE VOID KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
Definition: trap_x.h:402
FORCEINLINE VOID KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame)
Definition: trap_x.h:31
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
uint16_t * PUSHORT
Definition: typedefs.h:56
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:379
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
unsigned char UCHAR
Definition: xmlstorage.h:181