Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1999-2000 Microsoft Corporation. All Rights Reserved.
Module Name:
x86.h
Abstract:
This module contains private x86 processor specific defines, structures, inline functions and macros.
Author:
Joseph Ballantyne
Environment:
Kernel Mode
Revision History:
--*/
// CR0 floating point unit flags.
#define FPUMONITOR 0x2
#define FPUEMULATION 0x4
#define FPUTASKSWITCHED 0x8
#define FPU387COMPATIBLE 0x10
#define FPUEXCEPTION 0x20
#define FPUMASK (FPUEXCEPTION|FPU387COMPATIBLE|FPUTASKSWITCHED|FPUEMULATION|FPUMONITOR)
#pragma pack(push,1)
typedef struct { DWORD offset; WORD selector; } SPTR;
// x86 interrupt descriptor table base register
typedef struct { WORD limit; DWORD base; } IDT;
// x86 interrupt descriptor.
typedef struct { WORD lowoffset; WORD selector; WORD flags; WORD highoffset; } ID;
// x86 task state segment
typedef struct { WORD link; WORD reserved0; DWORD esp0; WORD ss0; WORD reserved1; DWORD esp1; WORD ss1; WORD reserved2; DWORD esp2; WORD ss2; WORD reserved3; DWORD cr3; DWORD eip; DWORD eflags; DWORD eax; DWORD ecx; DWORD edx; DWORD ebx; DWORD esp; DWORD ebp; DWORD esi; DWORD edi; WORD es; WORD reserved4; WORD cs; WORD reserved5; WORD ss; WORD reserved6; WORD ds; WORD reserved7; WORD fs; WORD reserved8; WORD gs; WORD reserved9; WORD ldt; WORD reserved10; WORD t; WORD iomap; } TSS;
#pragma pack(pop)
#pragma warning ( disable : 4035 )
//
// __inline
// ULONG
// ReadCR0 (
// VOID
// )
//
//*++
//
// Routine Description:
//
// This routine returns the current contents of the processor CR0 register.
//
// Arguments:
//
// None.
//
// Return Value:
//
// 32 bit contents of CR0.
//
//*--
__inline ULONG ReadCR0 ( VOID ) {
__asm { mov eax,cr0 }
}
// __inline
// VOID
// WriteCR0 (
// ULONG data
// )
//
//*++
//
// Routine Description:
//
// Loads processor CR0 register with the value passed in data.
//
// Arguments:
//
// data - Supplies the value to be loaded into processor CR0 register.
//
// Return Value:
//
// None.
//
//*--
__inline VOID WriteCR0 ( ULONG data ) {
__asm { mov eax,data mov cr0,eax }
}
// __inline
// ULONG
// ReadCR3 (
// VOID
// )
//
//*++
//
// Routine Description:
//
// This routine returns the current contents of the processor CR3 register.
//
// Arguments:
//
// Return Value:
//
// 32 bit contents of CR3.
//
//*--
__inline ULONG ReadCR3 ( VOID ) {
__asm { __asm _emit 0xf __asm _emit 0x20 __asm _emit 0xd8 //mov eax,cr3
}
}
// __inline
// ULONG
// ReadCR4 (
// VOID
// )
//
//*++
//
// Routine Description:
//
// This routine returns the current contents of the processor CR4 register.
//
// Arguments:
//
// Return Value:
//
// 32 bit contents of CR4.
//
//*--
__inline ULONG ReadCR4 ( VOID ) {
__asm { __asm _emit 0xf __asm _emit 0x20 __asm _emit 0xe0 //mov eax,cr4
}
}
// __inline
// VOID
// WriteCR4 (
// ULONG data
// )
//
//*++
//
// Routine Description:
//
// Loads processor CR4 register with the value passed in data.
//
// Arguments:
//
// Return Value:
//
// None.
//
//*--
__inline VOID WriteCR4 ( ULONG data ) {
__asm { mov eax,data __asm _emit 0xf __asm _emit 0x22 __asm _emit 0xe0 // mov cr4,eax
}
}
#pragma warning ( default : 4035 )
// __inline
// VOID
// LoadCR0 (
// ULONG value
// )
//
//*++
//
// Macro Description:
//
// Loads processor CR0 register with the value passed in value. Uses CS (code
// segment) override to read contents of value so that it can be used when the
// contents of DS (data segment) are indeterminate/invalid.
//
// Arguments:
//
// value - Supplies the variable whose value is to be loaded into processor CR0 register.
//
// (assumed) CS - code segment pointer is used to access value parameter.
//
// Return Value:
//
// None.
//
//*--
#define LoadCR0(value) \
__asm { \ __asm mov eax,cs:value \ __asm mov cr0,eax \ }
// __inline
// VOID
// SaveIDT (
// IDT IDT
// )
//
//*++
//
// Macro Description:
//
// Saves processor IDT register into variable IDT.
//
// Arguments:
//
// IDT - Supplies variable into which processor IDT value is written.
//
// Return Value:
//
// None.
//
//*--
#define SaveIDT( IDT ) \
__asm sidt IDT
// __inline
// VOID
// LoadIDT (
// IDT IDT
// )
//
//*++
//
// Macro Description:
//
// Loads processor IDT register from variable IDT.
//
// Arguments:
//
// IDT - Supplies value which is loaded into processor IDT. Uses CS (code
// segment) override to read contents of value so that it can be used when the
// contents of DS (data segment) are indeterminate/invalid.
//
// (assumed) CS - code segment pointer is used to access IDT parameter.
//
// Return Value:
//
// None.
//
//*--
#define LoadIDT( IDT ) \
__asm lidt cs:IDT
// __inline
// VOID
// Return (
// VOID
// )
//
//*++
//
// Macro Description:
//
// Performs an IRETD.
//
// Arguments:
//
// None.
//
// Return Value:
//
// None.
//
//*--
#define Return() \
__asm iretd
|