windows-nt/Source/XPSP1/NT/base/ntos/ke/i386/i386pcr.asm
2020-09-26 16:20:57 +08:00

174 lines
3.5 KiB
NASM

title "I386 PCR"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; i386pcr.asm
;
; Abstract:
;
; This module implements routines for accessing and initing the pcr.
;
; Author:
;
; Bryan Willman (bryanwi) 20 Mar 90
;
; Environment:
;
; Kernel mode, early init of first processor.
;
; Revision History:
;
;--
.386p
.xlist
include ks386.inc
include callconv.inc ; calling convention macros
.list
;
; NOTE - This definition of PCR gives us 2 instructions to get to some
; variables that need to be addressable in one instruction. Any
; such variable (such as current thread) must be accessed via its
; own access procedure (see below), NOT by KeGetPcr()->PbCurrentThread.
; (This is only an issue on MP machines.)
;
_TEXT$00 SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; PKTHREAD
; KeGetCurrentThread()
;
; Return Value:
;
; Pointer to current Thread object.
;
;--
cPublicProc ___KeGetCurrentThread ,0
mov eax,PCR[PcPrcbData+PbCurrentThread]
stdRET ___KeGetCurrentThread
stdENDP ___KeGetCurrentThread
;++
;
; KPROCESSOR_MODE
; KeGetPreviousMode()
;
; Return Value:
;
; PreviousMode of current thread.
;
;--
cPublicProc _KeGetPreviousMode
mov eax,PCR[PcPrcbData+PbCurrentThread] ; (eax) -> Thread
movzx eax,byte ptr [eax]+ThPreviousMode ; (eax) = PreviousMode
stdRET _KeGetPreviousMode
stdENDP _KeGetPreviousMode
;++
;
; BOOLEAN
; KeIsExecutingDpc(
; VOID
; );
;
; Return Value:
;
; Value of flag which indicates whether we're executing in DPC context
;
;--
cPublicProc ___KeIsExecutingDpc ,0
mov eax,PCR[PcPrcbData.PbDpcRoutineActive]
stdRET ___KeIsExecutingDpc
stdENDP ___KeIsExecutingDpc
;++
;
; VOID
; GetMachineBootPointers(
; )
;
; Routine Description:
;
; This routine is called at system startup to extract the address of
; the PCR and machine control values. It is useful only for the P0
; case where the boot loader must already init the machine before it
; turns on paging and calls us.
;
; Pcr address is extracted from the base of KGDT_R0_PCR.
;
; Gdt and Idt are extracted from the machine GDTR and IDTR.
;
; TSS is derived from the TSR and related descriptor.
;
; Arguments:
;
; None.
;
; Return Value:
;
;
; (edi) -> gdt
; (esi) -> pcr
; (edx) -> tss
; (eax) -> idt
;
;--
cPublicProc GetMachineBootPointers
push ebp
mov ebp,esp
sub esp,8
sgdt fword ptr [ebp-8]
mov edi,[ebp-6] ; (edi) = gdt address
mov cx,fs
and cx,(NOT RPL_MASK)
movzx ecx,cx
add ecx,edi ; (ecx) -> pcr descriptor
mov dh,[ecx+KgdtBaseHi]
mov dl,[ecx+KgdtBaseMid]
shl edx,16
mov dx,[ecx+KgdtBaseLow] ; (edx) -> pcr
mov esi,edx ; (esi) -> pcr
str cx
movzx ecx,cx
add ecx,edi ; (ecx) -> TSS descriptor
mov dh,[ecx+KgdtBaseHi]
mov dl,[ecx+KgdtBaseMid]
shl edx,16
mov dx,[ecx+KgdtBaseLow] ; (edx) -> TSS
sidt fword ptr [ebp-8]
mov eax,[ebp-6] ; (eax) -> Idt
mov esp,ebp
pop ebp
stdRET GetMachineBootPointers
stdENDP GetMachineBootPointers
_TEXT$00 ENDS
end