Author: sginsberg
Date: Mon Sep 21 17:20:18 2009
New Revision: 43103
URL:
http://svn.reactos.org/svn/reactos?rev=43103&view=rev
Log:
Mega compiler intrinsics patch:
FreeLdr
- Goodbye Ke386EraseFlags & KeAmd64EraseFlags. Welcome __writeeflags.
- Respect MSVC when generating clc (clear carry flag) instruction in PcGetTime.
- Use portable __wbinvd instead of __asm__ in XboxMemInit.
- Replace broken gcc assembly by portable intrinsics in WinLdrpMapApic.
- Use portable Ke386SetSs and Ke386SetGs (new) in WinLdrSetProcessorContext.
- The far jump in WinLdrSetProcessorContext can not be expressed in masm, so we use a
(untested) far return instead.
Kernel
- Replace Ke386Set/GetInterruptDescriptorTable, Ke386Save/RestoreFlags, Ke386Set/GetDr,
Ki386Cpuid, Ke386Rdmsr and Ke386Wrmsr by MSVC alternatives present in intrin.h.
- Fixed Ke386Get/SetGlobalDescriptorTable, Ke386GetLocalDescriptorTable and Ke386GetTr --
the intrinsics were completely broken for MSVC and generated bogus code. Moreover,
Ke386Set/GetInterruptDescriptorTable and Ke386Rdmsr were also affected. This lets us (in
addition to having a bootable, working msvc compiled kernel) get rid of several hacky
variable zero-initializations that hid this bug -- the way MSVC interpreted the inlined
assembly resulted in uninitialized variable usage.
- Implement Ke386SetGs and add missing Ke386SetGs for gcc.
- KdPollBreakIn: Use portable KeDisableInterrupts instead of x86 intrinsics and flags.
Modified:
trunk/reactos/boot/freeldr/freeldr/arch/amd64/loader.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/loader.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxmem.c
trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
trunk/reactos/boot/freeldr/freeldr/windows/wlmemory.c
trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
trunk/reactos/ntoskrnl/include/internal/i386/intrin_i.h
trunk/reactos/ntoskrnl/include/internal/ke.h
trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
trunk/reactos/ntoskrnl/kd64/kdlock.c
trunk/reactos/ntoskrnl/kdbg/kdb.c
trunk/reactos/ntoskrnl/kdbg/kdb_cli.c
trunk/reactos/ntoskrnl/ke/freeldr.c
trunk/reactos/ntoskrnl/ke/i386/cpu.c
trunk/reactos/ntoskrnl/ke/i386/irqobj.c
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/amd64/loader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/amd64/loader.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/amd64/loader.c [iso-8859-1] Mon Sep 21
17:20:18 2009
@@ -90,7 +90,7 @@
_disable();
/* Re-initalize EFLAGS */
- KeAmd64EraseFlags();
+ __writeeflags(0);
/* Initialize the page directory */
FrLdrSetupPageDirectory();
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/loader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/loader.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/loader.c [iso-8859-1] Mon Sep 21 17:20:18
2009
@@ -58,7 +58,7 @@
_disable();
/* Re-initalize EFLAGS */
- Ke386EraseFlags();
+ __writeeflags(0);
/* Initialize the page directory */
FrLdrSetupPageDirectory();
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/pcrtc.c [iso-8859-1] Mon Sep 21 17:20:18
2009
@@ -19,6 +19,19 @@
#include <freeldr.h>
+FORCEINLINE
+VOID
+ClearCarryFlag(VOID)
+{
+#if defined(__GNUC__)
+ __asm__ ("clc");
+#elif defined(_MSC_VER)
+ __asm clc;
+#else
+#error
+#endif
+}
+
#define BCD_INT(bcd) (((bcd & 0xf0) >> 4) * 10 + (bcd &0x0f))
TIMEINFO*
@@ -31,7 +44,7 @@
* in the Compaq Deskpro EP/SB, leave CF unchanged
* if successful, so CF should be cleared before
* calling this function. */
- __asm__ ("clc");
+ ClearCarryFlag();
/* Int 1Ah AH=04h
* TIME - GET REAL-TIME CLOCK DATE (AT,XT286,PS)
@@ -55,7 +68,7 @@
/* Some BIOSes leave CF unchanged if successful,
* so CF should be cleared before calling this function. */
- __asm__ ("clc");
+ ClearCarryFlag();
/* Int 1Ah AH=02h
* TIME - GET REAL-TIME CLOCK TIME (AT,XT286,PS)
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxmem.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxmem.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxmem.c [iso-8859-1] Mon Sep 21
17:20:18 2009
@@ -45,14 +45,14 @@
InstalledMemoryMb = 64;
memset(ControlRegion, TEST_PATTERN1, TEST_SIZE);
memset(MembaseTop, TEST_PATTERN1, TEST_SIZE);
- __asm__ ("wbinvd\n");
+ __wbinvd();
if (0 == memcmp(MembaseTop, ControlRegion, TEST_SIZE))
{
/* Looks like there is memory .. maybe a 128MB box */
memset(ControlRegion, TEST_PATTERN2, TEST_SIZE);
memset(MembaseTop, TEST_PATTERN2, TEST_SIZE);
- __asm__ ("wbinvd\n");
+ __wbinvd();
if (0 == memcmp(MembaseTop, ControlRegion, TEST_SIZE))
{
/* Definitely looks like there is memory */
Modified: trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/inclu…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/freeldr.h [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/freeldr.h [iso-8859-1] Mon Sep 21 17:20:18
2009
@@ -109,25 +109,6 @@
/* Swap */
#include <bytesex.h>
-/* arch defines */
-#ifdef __GNUC__
-#ifdef _X86_
-#define Ke386EraseFlags() __asm__ __volatile__("pushl $0 ; popfl\n")
-#endif
-
-#ifdef _M_AMD64
-#define KeAmd64EraseFlags() __asm__ __volatile__("pushq $0 ; popfq\n")
-#endif
-#else
-#ifdef _X86_
-#define Ke386EraseFlags() __asm push 0; __asm popf;
-#endif
-
-#ifdef _M_AMD64
-#error FIXME
-#endif
-#endif
-
VOID BootMain(LPSTR CmdLine);
VOID RunLoader(VOID);
Modified: trunk/reactos/boot/freeldr/freeldr/windows/wlmemory.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windo…
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/wlmemory.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/wlmemory.c [iso-8859-1] Mon Sep 21 17:20:18
2009
@@ -401,33 +401,24 @@
}
#ifdef _M_IX86
-
-BOOLEAN LocalAPIC = FALSE;
-ULONG_PTR APICAddress = 0;
-
VOID
WinLdrpMapApic()
{
+ BOOLEAN LocalAPIC;
+ LARGE_INTEGER MsrValue;
+ ULONG APICAddress, CpuInfo[4];
+
/* Check if we have a local APIC */
- asm(".intel_syntax noprefix\n");
- asm("mov eax, 1\n");
- asm("cpuid\n");
- asm("shr edx, 9\n");
- asm("and edx, 0x1\n");
- asm("mov _LocalAPIC, edx\n");
- asm(".att_syntax\n");
+ __cpuid((int*)CpuInfo, 1);
+ LocalAPIC = (((CpuInfo[3] >> 9) & 1) != 0);
/* If there is no APIC, just return */
if (!LocalAPIC)
return;
- asm(".intel_syntax noprefix\n");
- asm("mov ecx, 0x1B\n");
- asm("rdmsr\n");
- asm("mov edx, eax\n");
- asm("and edx, 0xFFFFF000\n");
- asm("mov _APICAddress, edx");
- asm(".att_syntax\n");
+ /* Read the APIC Address */
+ MsrValue.QuadPart = __readmsr(0x1B);
+ APICAddress = (MsrValue.LowPart & 0xFFFFF000);
DPRINTM(DPRINT_WINDOWS, "Local APIC detected at address 0x%x\n",
APICAddress);
@@ -643,7 +634,7 @@
_disable();
// Re-initalize EFLAGS
- Ke386EraseFlags();
+ __writeeflags(0);
// Set the PDBR
__writecr3((ULONG_PTR)PDE);
@@ -743,8 +734,8 @@
RtlZeroMemory((PVOID)Pcr, MM_PAGE_SIZE); //FIXME: Why zero only 1 page when we allocate
2?
// Get old values of GDT and IDT
- Ke386GetGlobalDescriptorTable(GdtDesc);
- Ke386GetInterruptDescriptorTable(IdtDesc);
+ Ke386GetGlobalDescriptorTable(&GdtDesc);
+ __sidt(&IdtDesc);
// Save old IDT
OldIdt.Base = IdtDesc.Base;
@@ -918,18 +909,28 @@
//asm("cli\n"); // they are already masked before enabling paged mode
// Load GDT+IDT
- Ke386SetGlobalDescriptorTable(GdtDesc);
- Ke386SetInterruptDescriptorTable(IdtDesc);
+ Ke386SetGlobalDescriptorTable(&GdtDesc);
+ __lidt(&IdtDesc);
// Jump to proper CS and clear prefetch queue
+#if defined(__GNUC__)
asm("ljmp $0x08, $1f\n"
"1:\n");
+#elif defined(_MSC_VER)
+ /* We can't express the above in MASM so we use this far return instead */
+ DbgPrint("WinLdrSetProcessorContext: Performing untested far-return\n");
+ __asm {
+ push 8
+ push offset resume
+ retf
+ resume:
+ };
+#else
+#error
+#endif
// Set SS selector
- asm(".intel_syntax noprefix\n");
- asm("mov ax, 0x10\n"); // DataSelector=0x10
- asm("mov ss, ax\n");
- asm(".att_syntax\n");
+ Ke386SetSs(0x10); // DataSelector=0x10
// Set DS and ES selectors
Ke386SetDs(0x10);
@@ -942,10 +943,7 @@
Ke386SetTr(0x28);
// Clear GS
- asm(".intel_syntax noprefix\n");
- asm("push 0\n");
- asm("pop gs\n");
- asm(".att_syntax\n");
+ Ke386SetGs(0);
// Set FS to PCR
Ke386SetFs(0x30);
Modified: trunk/reactos/ntoskrnl/config/i386/cmhardwr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/i386/cmhar…
==============================================================================
--- trunk/reactos/ntoskrnl/config/i386/cmhardwr.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/config/i386/cmhardwr.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -238,7 +238,7 @@
HANDLE KeyHandle, BiosHandle, SystemHandle, FpuHandle, SectionHandle;
CONFIGURATION_COMPONENT_DATA ConfigData;
CHAR Buffer[128];
- ULONG ExtendedId, Dummy;
+ ULONG ExtendedId, CpuInfo[4];
PKPRCB Prcb;
USHORT IndexTable[MaximumType + 1] = {0};
ANSI_STRING TempString;
@@ -428,19 +428,17 @@
else
{
/* Check if we have extended CPUID that supports name ID */
- Ki386Cpuid(0x80000000, &ExtendedId, &Dummy, &Dummy,
&Dummy);
+ CPUID(CpuInfo, 0x80000000);
+ ExtendedId = CpuInfo[0];
if (ExtendedId >= 0x80000004)
{
- /* Do all the CPUIDs requred to get the full name */
+ /* Do all the CPUIDs required to get the full name */
PartialString = CpuString;
for (ExtendedId = 2; ExtendedId <= 4; ExtendedId++)
{
/* Do the CPUID and save the name string */
- Ki386Cpuid(0x80000000 | ExtendedId,
- (PULONG)PartialString,
- (PULONG)PartialString + 1,
- (PULONG)PartialString + 2,
- (PULONG)PartialString + 3);
+ CPUID((PULONG)PartialString,
+ 0x80000000 | ExtendedId);
/* Go to the next name string */
PartialString += 16;
Modified: trunk/reactos/ntoskrnl/include/internal/i386/intrin_i.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/i386/intrin_i.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/i386/intrin_i.h [iso-8859-1] Mon Sep 21
17:20:18 2009
@@ -9,31 +9,20 @@
#if defined(__GNUC__)
-#define Ke386SetInterruptDescriptorTable(X) \
- __asm__("lidt %0\n\t" \
- : /* no outputs */ \
- : "m" (X));
-
-#define Ke386GetInterruptDescriptorTable(X) \
- __asm__("sidt %0\n\t" \
- : "=m" (X) \
- : /* no input */ \
- : "memory");
-
#define Ke386SetGlobalDescriptorTable(X) \
__asm__("lgdt %0\n\t" \
: /* no outputs */ \
- : "m" (X));
+ : "m" (*X));
#define Ke386GetGlobalDescriptorTable(X) \
__asm__("sgdt %0\n\t" \
- : "=m" (X) \
+ : "=m" (*X) \
: /* no input */ \
: "memory");
#define Ke386GetLocalDescriptorTable(X) \
__asm__("sldt %0\n\t" \
- : "=m" (X) \
+ : "=m" (*X) \
: /* no input */ \
: "memory");
@@ -46,10 +35,7 @@
#define Ke386GetTr(X) \
__asm__("str %0\n\t" \
- : "=m" (X));
-
-#define Ke386SaveFlags(x) __asm__ __volatile__("pushfl ; popl
%0":"=g" (x): /* no input */)
-#define Ke386RestoreFlags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no
output */ :"g" (x):"memory")
+ : "=m" (*X));
#define _Ke386GetSeg(N) ({ \
unsigned int __d; \
@@ -59,25 +45,6 @@
#define _Ke386SetSeg(N,X) __asm__ __volatile__("movl %0,%%" #N :
:"r" (X));
-#define _Ke386GetDr(N) ({ \
- unsigned int __d; \
- __asm__("movl %%dr" #N ",%0\n\t"
:"=r" (__d)); \
- __d; \
- })
-
-#define _Ke386SetDr(N,X) __asm__ __volatile__("movl %0,%%dr" #N :
:"r" (X));
-
-
-static inline void Ki386Cpuid(ULONG Op, PULONG Eax, PULONG Ebx, PULONG Ecx, PULONG Edx)
-{
- __asm__("cpuid"
- : "=a" (*Eax), "=b" (*Ebx), "=c" (*Ecx),
"=d" (*Edx)
- : "0" (Op));
-}
-
-#define Ke386Rdmsr(msr,val1,val2) __asm__ __volatile__("rdmsr" : "=a"
(val1), "=d" (val2) : "c" (msr))
-#define Ke386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs
*/ : "c" (msr), "a" (val1), "d" (val2))
-
#define Ke386HaltProcessor() __asm__("hlt\n\t");
#define Ke386FnInit() __asm__("fninit\n\t");
@@ -87,24 +54,6 @@
// CR Macros
//
#define Ke386SetCr2(X) __asm__ __volatile__("movl %0,%%cr2" :
:"r" (X));
-
-//
-// DR Macros
-//
-#define Ke386GetDr0() _Ke386GetDr(0)
-#define Ke386GetDr1() _Ke386GetDr(1)
-#define Ke386SetDr0(X) _Ke386SetDr(0,X)
-#define Ke386SetDr1(X) _Ke386SetDr(1,X)
-#define Ke386GetDr2() _Ke386GetDr(2)
-#define Ke386SetDr2(X) _Ke386SetDr(2,X)
-#define Ke386GetDr3() _Ke386GetDr(3)
-#define Ke386SetDr3(X) _Ke386SetDr(3,X)
-#define Ke386GetDr4() _Ke386GetDr(4)
-#define Ke386SetDr4(X) _Ke386SetDr(4,X)
-#define Ke386GetDr6() _Ke386GetDr(6)
-#define Ke386SetDr6(X) _Ke386SetDr(6,X)
-#define Ke386GetDr7() _Ke386GetDr(7)
-#define Ke386SetDr7(X) _Ke386SetDr(7,X)
//
// Segment Macros
@@ -114,51 +63,13 @@
#define Ke386SetFs(X) _Ke386SetSeg(fs, X)
#define Ke386SetDs(X) _Ke386SetSeg(ds, X)
#define Ke386SetEs(X) _Ke386SetSeg(es, X)
+#define Ke386SetSs(X) _Ke386SetSeg(ss, X)
+#define Ke386SetGs(X) _Ke386SetSeg(gs, X)
#elif defined(_MSC_VER)
FORCEINLINE
VOID
-Ke386Wrmsr(IN ULONG Register,
- IN ULONG Var1,
- IN ULONG Var2)
-{
- __asm mov ecx, Register;
- __asm mov eax, Var1;
- __asm mov edx, Var2;
- __asm wrmsr;
-}
-
-FORCEINLINE
-ULONGLONG
-Ke386Rdmsr(IN ULONG Register,
- IN ULONG Var1,
- IN ULONG Var2)
-{
- __asm mov ecx, Register;
- __asm mov eax, Var1;
- __asm mov edx, Var2;
- __asm rdmsr;
-}
-
-FORCEINLINE
-VOID
-Ki386Cpuid(IN ULONG Operation,
- OUT PULONG Var1,
- OUT PULONG Var2,
- OUT PULONG Var3,
- OUT PULONG Var4)
-{
- __asm mov eax, Operation;
- __asm cpuid;
- __asm mov [Var1], eax;
- __asm mov [Var2], ebx;
- __asm mov [Var3], ecx;
- __asm mov [Var4], edx;
-}
-
-FORCEINLINE
-VOID
Ke386FnInit(VOID)
{
__asm fninit;
@@ -173,37 +84,25 @@
FORCEINLINE
VOID
-Ke386GetInterruptDescriptorTable(OUT KDESCRIPTOR Descriptor)
-{
- __asm sidt Descriptor;
-}
-
-FORCEINLINE
-VOID
-Ke386SetInterruptDescriptorTable(IN KDESCRIPTOR Descriptor)
-{
- __asm lidt Descriptor;
-}
-
-FORCEINLINE
-VOID
-Ke386GetGlobalDescriptorTable(OUT KDESCRIPTOR Descriptor)
-{
- __asm sgdt Descriptor;
-}
-
-FORCEINLINE
-VOID
-Ke386SetGlobalDescriptorTable(IN KDESCRIPTOR Descriptor)
-{
- __asm lgdt Descriptor;
-}
-
-FORCEINLINE
-VOID
-Ke386GetLocalDescriptorTable(OUT USHORT Descriptor)
-{
- __asm sldt Descriptor;
+Ke386GetGlobalDescriptorTable(OUT PVOID Descriptor)
+{
+ __asm sgdt [Descriptor];
+}
+
+FORCEINLINE
+VOID
+Ke386SetGlobalDescriptorTable(IN PVOID Descriptor)
+{
+ __asm lgdt [Descriptor];
+}
+
+FORCEINLINE
+VOID
+Ke386GetLocalDescriptorTable(OUT PUSHORT Descriptor)
+{
+ USHORT _Descriptor;
+ __asm sldt _Descriptor;
+ *Descriptor = _Descriptor;
}
FORCEINLINE
@@ -215,22 +114,6 @@
FORCEINLINE
VOID
-Ke386SaveFlags(IN ULONG Flags)
-{
- __asm pushf;
- __asm pop Flags;
-}
-
-FORCEINLINE
-VOID
-Ke386RestoreFlags(IN ULONG Flags)
-{
- __asm push Flags;
- __asm popf;
-}
-
-FORCEINLINE
-VOID
Ke386SetTr(IN USHORT Tr)
{
__asm ltr Tr;
@@ -238,9 +121,11 @@
FORCEINLINE
USHORT
-Ke386GetTr(IN USHORT Tr)
-{
- __asm str Tr;
+Ke386GetTr(OUT PUSHORT Tr)
+{
+ USHORT _Tr;
+ __asm str _Tr;
+ *Tr = _Tr;
}
//
@@ -255,99 +140,6 @@
}
//
-// DR Macros
-//
-FORCEINLINE
-ULONG
-Ke386GetDr0(VOID)
-{
- __asm mov eax, dr0;
-}
-
-FORCEINLINE
-ULONG
-Ke386GetDr1(VOID)
-{
- __asm mov eax, dr1;
-}
-
-FORCEINLINE
-ULONG
-Ke386GetDr2(VOID)
-{
- __asm mov eax, dr2;
-}
-
-FORCEINLINE
-ULONG
-Ke386GetDr3(VOID)
-{
- __asm mov eax, dr3;
-}
-
-FORCEINLINE
-ULONG
-Ke386GetDr6(VOID)
-{
- __asm mov eax, dr6;
-}
-
-FORCEINLINE
-ULONG
-Ke386GetDr7(VOID)
-{
- __asm mov eax, dr7;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr0(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr0, eax;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr1(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr1, eax;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr2(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr2, eax;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr3(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr3, eax;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr6(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr6, eax;
-}
-
-FORCEINLINE
-VOID
-Ke386SetDr7(IN ULONG Value)
-{
- __asm mov eax, Value;
- __asm mov dr7, eax;
-}
-
-//
// Segment Macros
//
FORCEINLINE
@@ -408,6 +200,14 @@
{
__asm mov ax, Value;
__asm mov es, ax;
+}
+
+FORCEINLINE
+VOID
+Ke386SetGs(IN USHORT Value)
+{
+ __asm mov ax, Value;
+ __asm mov gs, ax;
}
#else
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -994,6 +994,7 @@
KiI386PentiumLockErrataFixup(VOID);
VOID
+NTAPI
WRMSR(
IN ULONG Register,
IN LONGLONG Value
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd/wrappers/gdbst…
==============================================================================
--- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -1115,7 +1115,7 @@
DPRINT("GspUnloadBreakpoints\n");
/* Disable hardware debugging while we are inside the stub */
- Ke386SetDr7(0);
+ __writedr(7, 0);
for (Index = 0; Index < GspSwBreakpointCount; Index++)
{
@@ -1402,7 +1402,7 @@
if (Stepping)
Context->EFlags |= EFLAGS_TF;
- Dr6 = Ke386GetDr6();
+ Dr6 = __readdr(6);
if (!(Dr6 & DR6_BS))
{
for (BreakpointNumber = 0;
@@ -1422,7 +1422,7 @@
}
GspLoadBreakpoints(TrapFrame);
- Ke386SetDr6(0);
+ __writedr(6, 0);
if (NULL != GspDbgThread)
{
Modified: trunk/reactos/ntoskrnl/kd64/kdlock.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd64/kdlock.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/kd64/kdlock.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd64/kdlock.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -74,16 +74,13 @@
NTAPI
KdPollBreakIn(VOID)
{
- BOOLEAN DoBreak = FALSE;
- ULONG Flags = 0;
+ BOOLEAN DoBreak = FALSE, Enable;
/* First make sure that KD is enabled */
if (KdDebuggerEnabled)
{
/* Disable interrupts */
- Ke386SaveFlags(Flags);
- //Flags = __getcallerseflags();
- _disable();
+ Enable = KeDisableInterrupts();
/* Check if a CTRL-C is in the queue */
if (KdpContext.KdpControlCPending)
@@ -115,11 +112,10 @@
}
}
- /* Re-enable interrupts if they were disabled */
- if (Flags & EFLAGS_INTERRUPT_MASK) _enable();
+ /* Re-enable interrupts if they were enabled previously */
+ if (Enable) _enable();
}
/* Tell the caller to do a break */
return DoBreak;
}
-
Modified: trunk/reactos/ntoskrnl/kdbg/kdb.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb.c?rev=43…
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -413,7 +413,7 @@
}
/* Read the interrupt descriptor table register */
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&Idtr.Limit);
+ __sidt(&Idtr.Limit);
if (IntVect >= (Idtr.Limit + 1) / 8)
{
/*KdbpPrint("IDT does not contain interrupt vector %d\n.", IntVect);*/
@@ -1573,14 +1573,7 @@
ULONG_PTR TrapCr2;
ULONG Err;
-#ifdef __GNUC__
- asm volatile("movl %%cr2, %0" : "=r"(TrapCr2));
-#elif _MSC_VER
- __asm mov eax, cr2;
- __asm mov TrapCr2, eax;
-#else
-#error Unknown compiler for inline assembler
-#endif
+ TrapCr2 = __readcr2();
Err = TrapFrame->ErrCode;
KdbpPrint("Memory at 0x%p could not be %s: ", TrapCr2, (Err &
(1 << 1)) ? "written" : "read");
@@ -1611,13 +1604,13 @@
KdbpTrapFrameToKdbTrapFrame(TrapFrame, &KdbTrapFrame);
/* Enter critical section */
- Ke386SaveFlags(OldEflags);
+ OldEflags = __readeflags();
_disable();
/* Exception inside the debugger? Game over. */
if (InterlockedIncrement(&KdbEntryCount) > 1)
{
- Ke386RestoreFlags(OldEflags);
+ __writeeflags(OldEflags);
return kdHandleException;
}
@@ -1654,7 +1647,7 @@
InterlockedDecrement(&KdbEntryCount);
/* Leave critical section */
- Ke386RestoreFlags(OldEflags);
+ __writeeflags(OldEflags);
/* Check if user requested a bugcheck */
if (KdbpBugCheckRequested)
Modified: trunk/reactos/ntoskrnl/kdbg/kdb_cli.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb_cli.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -648,8 +648,8 @@
else if (Argv[0][0] == 'c') /* cregs */
{
ULONG Cr0, Cr2, Cr3, Cr4;
- KDESCRIPTOR Gdtr = {0}, Ldtr = {0}, Idtr = {0};
- ULONG Tr = 0;
+ KDESCRIPTOR Gdtr, Ldtr, Idtr;
+ ULONG Tr;
static const PCHAR Cr0Bits[32] = { " PE", " MP", "
EM", " TS", " ET", " NE", NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL,
" WP", NULL, " AM", NULL,
NULL, NULL, NULL, NULL,
@@ -665,12 +665,12 @@
Cr4 = KdbCurrentTrapFrame->Cr4;
/* Get descriptor table regs */
- Ke386GetGlobalDescriptorTable(*(PKDESCRIPTOR)&Gdtr.Limit);
- Ke386GetLocalDescriptorTable(Ldtr.Limit);
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&Idtr.Limit);
+ Ke386GetGlobalDescriptorTable(&Gdtr.Limit);
+ Ke386GetLocalDescriptorTable(&Ldtr.Limit);
+ __sidt(&Idtr.Limit);
/* Get the task register */
- Ke386GetTr(Tr);
+ Ke386GetTr((PUSHORT)&Tr);
/* Display the control registers */
KdbpPrint("CR0 0x%08x ", Cr0);
@@ -1541,7 +1541,7 @@
ULONG Argc,
PCHAR Argv[])
{
- KDESCRIPTOR Reg = {0};
+ KDESCRIPTOR Reg;
ULONG SegDesc[2];
ULONG SegBase;
ULONG SegLimit;
@@ -1554,7 +1554,7 @@
if (Argv[0][0] == 'i')
{
/* Read IDTR */
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&Reg.Limit);
+ __sidt(&Reg.Limit);
if (Reg.Limit < 7)
{
@@ -1614,7 +1614,7 @@
if (Argv[0][0] == 'g')
{
/* Read GDTR */
- Ke386GetGlobalDescriptorTable(*(PKDESCRIPTOR)&Reg.Limit);
+ Ke386GetGlobalDescriptorTable(&Reg.Limit);
i = 8;
}
else
@@ -1622,7 +1622,7 @@
ASSERT(Argv[0][0] == 'l');
/* Read LDTR */
- Ke386GetLocalDescriptorTable(Reg.Limit);
+ Ke386GetLocalDescriptorTable(&Reg.Limit);
i = 0;
ul = 1 << 2;
}
@@ -2742,7 +2742,7 @@
HANDLE hFile = NULL;
INT FileSize;
PCHAR FileBuffer;
- ULONG OldEflags = 0;
+ ULONG OldEflags;
/* Initialize the object attributes */
RtlInitUnicodeString(&FileName,
L"\\SystemRoot\\system32\\drivers\\etc\\KDBinit");
@@ -2793,7 +2793,7 @@
FileBuffer[FileSize] = '\0';
/* Enter critical section */
- Ke386SaveFlags(OldEflags);
+ OldEflags = __readeflags();
_disable();
/* Interpret the init file... */
@@ -2802,7 +2802,7 @@
KdbInitFileBuffer = NULL;
/* Leave critical section */
- Ke386RestoreFlags(OldEflags);
+ __writeeflags(OldEflags);
ExFreePool(FileBuffer);
}
Modified: trunk/reactos/ntoskrnl/ke/freeldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/freeldr.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/freeldr.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/freeldr.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -1269,16 +1269,16 @@
#if defined(_M_IX86)
PKTSS Tss;
PKGDTENTRY TssEntry;
- KDESCRIPTOR IdtDescriptor = { 0, 0, 0 };
-
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+ KDESCRIPTOR IdtDescriptor;
+
+ __sidt(&IdtDescriptor.Limit);
RtlCopyMemory(KiHackIdt, (PVOID)IdtDescriptor.Base, IdtDescriptor.Limit + 1);
IdtDescriptor.Base = (ULONG)&KiHackIdt;
IdtDescriptor.Limit = sizeof(KiHackIdt) - 1;
/* Load the GDT and IDT */
- Ke386SetGlobalDescriptorTable(*(PKDESCRIPTOR)&KiGdtDescriptor.Limit);
- Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+ Ke386SetGlobalDescriptorTable(&KiGdtDescriptor.Limit);
+ __lidt(&IdtDescriptor.Limit);
/* Initialize the boot TSS */
Tss = &KiBootTss;
Modified: trunk/reactos/ntoskrnl/ke/i386/cpu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/cpu.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/cpu.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -90,24 +90,25 @@
CPUID(OUT ULONG CpuInfo[4],
IN ULONG InfoType)
{
- Ki386Cpuid(InfoType, &CpuInfo[0], &CpuInfo[1], &CpuInfo[2],
&CpuInfo[3]);
-}
-
-VOID
+ /* Perform the CPUID Operation */
+ __cpuid((int*)CpuInfo, InfoType);
+}
+
+VOID
+NTAPI
WRMSR(IN ULONG Register,
IN LONGLONG Value)
{
- LARGE_INTEGER LargeVal;
- LargeVal.QuadPart = Value;
- Ke386Wrmsr(Register, LargeVal.HighPart, LargeVal.LowPart);
+ /* Write to the MSR */
+ __writemsr(Register, Value);
}
LONGLONG
+NTAPI
RDMSR(IN ULONG Register)
{
- LARGE_INTEGER LargeVal = {{0, 0}};
- Ke386Rdmsr(Register, LargeVal.HighPart, LargeVal.LowPart);
- return LargeVal.QuadPart;
+ /* Read from the MSR */
+ return __readmsr(Register);
}
/* FUNCTIONS *****************************************************************/
@@ -116,7 +117,7 @@
NTAPI
KiSetProcessorType(VOID)
{
- ULONG EFlags = 0, NewEFlags;
+ ULONG EFlags, NewEFlags;
ULONG Reg[4];
ULONG Stepping, Type;
@@ -124,19 +125,19 @@
KeGetCurrentPrcb()->CpuID = 0;
/* Save EFlags */
- Ke386SaveFlags(EFlags);
+ EFlags = __readeflags();
/* XOR out the ID bit and update EFlags */
NewEFlags = EFlags ^ EFLAGS_ID;
- Ke386RestoreFlags(NewEFlags);
+ __writeeflags(NewEFlags);
/* Get them back and see if they were modified */
- Ke386SaveFlags(NewEFlags);
+ NewEFlags = __readeflags();
if (NewEFlags != EFlags)
{
/* The modification worked, so CPUID exists. Set the ID Bit again. */
EFlags |= EFLAGS_ID;
- Ke386RestoreFlags(EFlags);
+ __writeeflags(EFlags);
/* Peform CPUID 0 to see if CPUID 1 is supported */
CPUID(Reg, 0);
@@ -175,7 +176,7 @@
}
/* Restore EFLAGS */
- Ke386RestoreFlags(EFlags);
+ __writeeflags(EFlags);
}
ULONG
@@ -720,18 +721,18 @@
//
// Restore the DR registers
//
- Ke386SetDr0(ProcessorState->SpecialRegisters.KernelDr0);
- Ke386SetDr1(ProcessorState->SpecialRegisters.KernelDr1);
- Ke386SetDr2(ProcessorState->SpecialRegisters.KernelDr2);
- Ke386SetDr3(ProcessorState->SpecialRegisters.KernelDr3);
- Ke386SetDr6(ProcessorState->SpecialRegisters.KernelDr6);
- Ke386SetDr7(ProcessorState->SpecialRegisters.KernelDr7);
+ __writedr(0, ProcessorState->SpecialRegisters.KernelDr0);
+ __writedr(1, ProcessorState->SpecialRegisters.KernelDr1);
+ __writedr(2, ProcessorState->SpecialRegisters.KernelDr2);
+ __writedr(3, ProcessorState->SpecialRegisters.KernelDr3);
+ __writedr(6, ProcessorState->SpecialRegisters.KernelDr6);
+ __writedr(7, ProcessorState->SpecialRegisters.KernelDr7);
//
// Restore GDT, IDT, LDT and TSS
//
-
Ke386SetGlobalDescriptorTable(*(PKDESCRIPTOR)&ProcessorState->SpecialRegisters.Gdtr.Limit);
-
Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&ProcessorState->SpecialRegisters.Idtr.Limit);
+ Ke386SetGlobalDescriptorTable(&ProcessorState->SpecialRegisters.Gdtr.Limit);
+ __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
Ke386SetTr(ProcessorState->SpecialRegisters.Tr);
Ke386SetLocalDescriptorTable(ProcessorState->SpecialRegisters.Ldtr);
}
@@ -748,19 +749,19 @@
__readcr4() : 0;
/* Save the DR registers */
- ProcessorState->SpecialRegisters.KernelDr0 = Ke386GetDr0();
- ProcessorState->SpecialRegisters.KernelDr1 = Ke386GetDr1();
- ProcessorState->SpecialRegisters.KernelDr2 = Ke386GetDr2();
- ProcessorState->SpecialRegisters.KernelDr3 = Ke386GetDr3();
- ProcessorState->SpecialRegisters.KernelDr6 = Ke386GetDr6();
- ProcessorState->SpecialRegisters.KernelDr7 = Ke386GetDr7();
- Ke386SetDr7(0);
+ ProcessorState->SpecialRegisters.KernelDr0 = __readdr(0);
+ ProcessorState->SpecialRegisters.KernelDr1 = __readdr(1);
+ ProcessorState->SpecialRegisters.KernelDr2 = __readdr(2);
+ ProcessorState->SpecialRegisters.KernelDr3 = __readdr(3);
+ ProcessorState->SpecialRegisters.KernelDr6 = __readdr(6);
+ ProcessorState->SpecialRegisters.KernelDr7 = __readdr(7);
+ __writedr(7, 0);
/* Save GDT, IDT, LDT and TSS */
-
Ke386GetGlobalDescriptorTable(*(PKDESCRIPTOR)&ProcessorState->SpecialRegisters.Gdtr.Limit);
-
Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&ProcessorState->SpecialRegisters.Idtr.Limit);
- Ke386GetTr(ProcessorState->SpecialRegisters.Tr);
- Ke386GetLocalDescriptorTable(ProcessorState->SpecialRegisters.Ldtr);
+ Ke386GetGlobalDescriptorTable(&ProcessorState->SpecialRegisters.Gdtr.Limit);
+ __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
+ Ke386GetTr(&ProcessorState->SpecialRegisters.Tr);
+ Ke386GetLocalDescriptorTable(&ProcessorState->SpecialRegisters.Ldtr);
}
VOID
@@ -776,11 +777,11 @@
KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context)
{
/* Set CS and ESP */
- Ke386Wrmsr(0x174, KGDT_R0_CODE, 0);
- Ke386Wrmsr(0x175, (ULONG)KeGetCurrentPrcb()->DpcStack, 0);
+ WRMSR(0x174, KGDT_R0_CODE);
+ WRMSR(0x175, (ULONG_PTR)KeGetCurrentPrcb()->DpcStack);
/* Set LSTAR */
- Ke386Wrmsr(0x176, (ULONG)KiFastCallEntry, 0);
+ WRMSR(0x176, (ULONG_PTR)KiFastCallEntry);
return 0;
}
@@ -842,7 +843,7 @@
NTAPI
KiI386PentiumLockErrataFixup(VOID)
{
- KDESCRIPTOR IdtDescriptor = { 0, 0, 0 };
+ KDESCRIPTOR IdtDescriptor;
PKIDTENTRY NewIdt, NewIdt2;
/* Allocate memory for a new IDT */
@@ -855,14 +856,14 @@
_disable();
/* Get the current IDT and copy it */
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+ __sidt(&IdtDescriptor.Limit);
RtlCopyMemory(NewIdt2,
(PVOID)IdtDescriptor.Base,
IdtDescriptor.Limit + 1);
IdtDescriptor.Base = (ULONG)NewIdt2;
/* Set the new IDT */
- Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+ __lidt(&IdtDescriptor.Limit);
((PKIPCR)KeGetPcr())->IDT = NewIdt2;
/* Restore interrupts */
@@ -877,10 +878,10 @@
KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
IN PKEXCEPTION_FRAME ExceptionFrame)
{
- ULONG Flags = 0;
+ ULONG Flags;
/* Disable interrupts and get previous state */
- Ke386SaveFlags(Flags);
+ Flags = __readeflags();
//Flags = __getcallerseflags();
_disable();
Modified: trunk/reactos/ntoskrnl/ke/i386/irqobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/irqobj.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/irqobj.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/irqobj.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -27,11 +27,11 @@
NTAPI
KeDisableInterrupts(VOID)
{
- ULONG Flags = 0;
+ ULONG Flags;
BOOLEAN Return;
/* Get EFLAGS and check if the interrupt bit is set */
- Ke386SaveFlags(Flags);
+ Flags = __readeflags();
Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
/* Disable interrupts */
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c [iso-8859-1] Mon Sep 21 17:20:18 2009
@@ -607,20 +607,20 @@
IN PKIPCR *Pcr,
IN PKTSS *Tss)
{
- KDESCRIPTOR GdtDescriptor = { 0, 0, 0 }, IdtDescriptor = { 0, 0, 0 };
+ KDESCRIPTOR GdtDescriptor, IdtDescriptor;
KGDTENTRY TssSelector, PcrSelector;
- USHORT Tr = 0, Fs;
+ USHORT Tr, Fs;
/* Get GDT and IDT descriptors */
- Ke386GetGlobalDescriptorTable(*(PKDESCRIPTOR)&GdtDescriptor.Limit);
- Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+ Ke386GetGlobalDescriptorTable(&GdtDescriptor.Limit);
+ __sidt(&IdtDescriptor.Limit);
/* Save IDT and GDT */
*Gdt = (PKGDTENTRY)GdtDescriptor.Base;
*Idt = (PKIDTENTRY)IdtDescriptor.Base;
/* Get TSS and FS Selectors */
- Ke386GetTr(Tr);
+ Ke386GetTr(&Tr);
if (Tr != KGDT_TSS) Tr = KGDT_TSS; // FIXME: HACKHACK
Fs = Ke386GetFs();