Windows2000/private/ntos/ke/i386/i386pcr.asm
2020-09-30 17:12:32 +02:00

201 lines
3.7 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
cPublicProc _KeGetPcr ,0
mov eax,PCR[PcSelfPcr]
stdRET _KeGetPcr
stdENDP _KeGetPcr
; PKPRCB
; KeGetCurrentPrcb()
; Return Value:
; Pointer to current PRCB.
cPublicProc _KeGetCurrentPrcb ,0
mov eax,PCR[PcPrcb]
stdRET _KeGetCurrentPrcb
stdENDP _KeGetCurrentPrcb
; 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