diff --git a/xtoskrnl/ar/amd64/cpufunc.c b/xtoskrnl/ar/amd64/cpufunc.c index 2db1e562..b65b0417 100644 --- a/xtoskrnl/ar/amd64/cpufunc.c +++ b/xtoskrnl/ar/amd64/cpufunc.c @@ -82,6 +82,30 @@ ArFlushTlb(VOID) ArWriteControlRegister(3, ArReadControlRegister(3)); } +/** + * Gets the RFLAGS register. + * + * @return This routine returns the RFLAGS register. + * + * @since XT 1.0 + */ +XTCDECL +ULONG +ArGetCpuFlags(VOID) +{ + ULONG Flags; + + /* Get RFLAGS register */ + asm volatile("pushf\n" + "pop %0\n" + : "=rm" (Flags) + : + : "memory"); + + /* Return flags */ + return Flags; +} + /** * Gets the address of the current stack register. * diff --git a/xtoskrnl/ar/i686/cpufunc.c b/xtoskrnl/ar/i686/cpufunc.c index 8da2efab..2072a369 100644 --- a/xtoskrnl/ar/i686/cpufunc.c +++ b/xtoskrnl/ar/i686/cpufunc.c @@ -82,6 +82,30 @@ ArFlushTlb(VOID) ArWriteControlRegister(3, ArReadControlRegister(3)); } +/** + * Gets the EFLAGS register. + * + * @return This routine returns the EFLAGS register. + * + * @since XT 1.0 + */ +XTCDECL +ULONG +ArGetCpuFlags(VOID) +{ + ULONG Flags; + + /* Get EFLAGS register */ + asm volatile("pushf\n" + "pop %0\n" + : "=rm" (Flags) + : + : "memory"); + + /* Return flags */ + return Flags; +} + /** * Gets the address of the current stack register. * diff --git a/xtoskrnl/includes/amd64/ari.h b/xtoskrnl/includes/amd64/ari.h index b4da180c..54c702a9 100644 --- a/xtoskrnl/includes/amd64/ari.h +++ b/xtoskrnl/includes/amd64/ari.h @@ -25,6 +25,10 @@ XTCDECL VOID ArFlushTlb(VOID); +XTCDECL +ULONG +ArGetCpuFlags(VOID); + XTASSEMBLY XTCDECL ULONG_PTR diff --git a/xtoskrnl/includes/i686/ari.h b/xtoskrnl/includes/i686/ari.h index 199fcb14..d61a0bd9 100644 --- a/xtoskrnl/includes/i686/ari.h +++ b/xtoskrnl/includes/i686/ari.h @@ -25,6 +25,10 @@ XTCDECL VOID ArFlushTlb(VOID); +XTCDECL +ULONG +ArGetCpuFlags(VOID); + XTASSEMBLY XTCDECL ULONG_PTR