2020-09-30 17:17:25 +02:00

105 lines
2.6 KiB
NASM

TITLE "System Control Interrupt Service Routine"
;++
;
; Copyright (c) 2001 Microsoft Corporation
;
; Module Name:
;
; sciinta.asm
;
; Abstract:
;
; This module implements the routines to handle a System Control Interrupt
; (SCI) from the ACPI logic block or external SMI.
;
; Environment:
;
; Kernel mode only.
;
;--
.586p
.xlist
INCLUDE ks386.inc
INCLUDE callconv.inc
INCLUDE i386\kimacro.inc
INCLUDE i386\ix8259.inc
INCLUDE i386\mcpxacpi.inc
.list
EXTRNP HalBeginSystemControlInterrupt,2,,FASTCALL
EXTRNP HalEndSystemLevelInterrupt,1,,FASTCALL
EXTRNP _KeInsertQueueDpc,3
EXTRNP _HalpAcpiTimerCarry,0
EXTRN _KiPCR:DWORD
EXTRN _HalpSystemControlInterruptDpc:DWORD
_TEXT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; VOID
; HalpSystemControlInterrupt(
; VOID
; )
;
; Routine Description:
;
; This routine is entered as the result of an interrupt generated by the
; ACPI logic block or an external SMI that has been rerouted to the SCI.
;
; Arguments:
;
; None.
;
; Return Value:
;
; None.
;
;--
cPublicProc _HalpSystemControlInterrupt, 0
ENTER_INTERRUPT
mov ecx, SCI_VECTOR - PRIMARY_VECTOR_BASE
mov edx, SCI_LEVEL
push 0 ; allocate space to save OldIrql
fstCall HalBeginSystemControlInterrupt
;
; Check if the signal for an ACPI timer overflow has been set. If so, clear the
; signal and increment the high bits of the performance counter.
;
mov edx, XPCICFG_LPCBRIDGE_IO_REGISTER_BASE_0 + MCPX_ACPI_PM1_STATUS_REGISTER
in al, dx
and al, PM1_TIMER_STATUS
jz NotAcpiTimerInterrupt
out dx, al ; clear signal by writing the bit back
stdCall _HalpAcpiTimerCarry
;
; Check if the signal for the external SMI has been set. If so, clear the
; signal and queue a DPC to talk to the SMC at a safe point.
;
NotAcpiTimerInterrupt:
mov edx, XPCICFG_LPCBRIDGE_IO_REGISTER_BASE_0 + MCPX_ACPI_GPE0_STATUS_REGISTER
in al, dx
test al, GPE0_EXTSMI_STATUS
jz NotExternalSMI
mov al, GPE0_EXTSMI_STATUS
out dx, al
stdCall _KeInsertQueueDpc,<offset _HalpSystemControlInterruptDpc, 0, 0>
NotExternalSMI:
mov eax, SCI_VECTOR - PRIMARY_VECTOR_BASE
LEVEL_INTERRUPT_EXIT
stdENDP _HalpSystemControlInterrupt
_TEXT ends
end