windows-nt/Source/XPSP1/NT/drivers/wdm/rt/exec/x86.h
2020-09-26 16:20:57 +08:00

399 lines
5.2 KiB
C

/*++
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