Jump to content

DevHelp RegisterKrnlExit: Difference between revisions

From EDM2
Created page with "DevHlp_RegisterKrnlExit allows an OS/2 device driver to handle NMIs (Non-Masked Interrupts), Trap 2 Parity Errors, and System Fatal Faults (fatal errors at Ring 0). This DevH..."
(No difference)

Revision as of 23:36, 27 July 2018

DevHlp_RegisterKrnlExit allows an OS/2 device driver to handle NMIs (Non-Masked Interrupts), Trap 2 Parity Errors, and System Fatal Faults (fatal errors at Ring 0).

This DevHlp provides a notification to the device driver that a serious error occurred in the operating system and gives the device driver limited access to system resources. This DevHlp is valid at initialization time and in kernel mode.

Syntax

C

None available.

Assembler

         MOV       ax,0x1000           ; Kernel Exit Flags
                                       ;   Add     0x1000
                                       ;   Delete  0x0000
                                       ;
         MOV       cx,0x0001           ; Kernel Exit Type
                                       ;   NMI     0x0000
                                       ;   SFF     0x0001
                                       ;
         MOV       bx,SEL Sel          ; 16-bit Selector to User Exit
         MOV       si,OFF Off          ; 16-bit Offset   to User Exit
         MOV       dl,DevHlp_RegisterKrnlExit

         CALL      Device_Help

Parameters

C

None available.

Assembler

         MOV       ax,0x1000           ; Kernel Exit Flags
                                       ;   Add     0x1000
                                       ;   Delete  0x0000
                                       ;
         MOV       cx,0x0001           ; Kernel Exit Type
                                       ;   NMI     0x0000
                                       ;   SFF     0x0001
                                       ;
         MOV       bx,SEL Sel          ; 16-bit Selector to User Exit
         MOV       si,OFF Off          ; 16-bit Offset   to User Exit

Return Code

C

None available.

Assembler

         EAX is any system return code
              0  = success
        non-zero = Error

Remarks

When DevHlp_RegisterKrnlExit is initialized, it is the only active thread in the system. Therefore, this exit must return control to the operating system.
NMI's
The DevHlp_RegisterKrnlExit will stop enumerating through the NMI device driver chain when an NMI condition is handled.

Note: If the exit routine handled the NMI, it must return with EAX - set to 0xffffffff.

System Fatal Faults
System Fatal Faults are notifications to the device driver that the operating system encountered a non-recoverable error. At this point, you can attempt device-specific shutdown or cleanup.

If the device driver does not handle the error condition correctly, the result can be a hung system. The device driver must perform a Return Far to return control to OS/2.

NMI Handling

              Entry:
                      EAX         = Kernel Exit Routine's DS

              Exit:
                      EAX         = Return Code Kernel Exit Routine
                                    0xffffffff (is the only valid one)

The following are restored registers the exit routine can use:

              EAX, EBX, ECX, EDX, EBP, ESI, EDI,
              ESP, DS,  ES,  FS,  GS,  Flags

The exit routine can handle the the NMI or allow OS/2 to handle the NMI. If the exit routine handled the NMI, it must return with EAX - set to 0xffffffff.

The DevHlp_RegisterKrnlExit will stop enumerating through the NMI device driver chain when an NMI condition is handled.

SFF (System Fatal Fault) Handling

SFF is only a notification to the device driver.

              Entry:
                      EAX         = Kernel Exit Routine's DS
              Exit:
                      No Return Codes from this function

The following are restored registers the exit routine could have used:

                               EAX, EBX, ECX, EDX, EBP, ESI, EDI,
                               ESP, DS,  ES,  FS,  GS,  Flags

              IF EBX =  -9L
                 this is a debug kernel
                 and the debugger will display
                 the registers.
              ELSE (this is a Retail Kernel)
                 IF EBX =  -1
                    this is a TSF or VSF  stack frame
                    and ESI is the Trap Number
                 ELSE
                    this is a KSF stack frame
                    and ESI is the Trap Number
                 ENDIF
              ENDIF