[ros-diffs] [sginsberg] 43103: 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.

sginsberg at svn.reactos.org sginsberg at svn.reactos.org
Mon Sep 21 17:20:18 CEST 2009


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/amd64/loader.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/i386/loader.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/i386/pcrtc.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/i386/xboxmem.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/include/freeldr.h?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/windows/wlmemory.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/cmhardwr.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/i386/intrin_i.h?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/ke.h?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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/gdbstub.c?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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?rev=43103&r1=43102&r2=43103&view=diff
==============================================================================
--- 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();
 




More information about the Ros-diffs mailing list