diff --git a/sdk/xtdk/amd64/arfuncs.h b/sdk/xtdk/amd64/arfuncs.h index ca4fa43..6ac7a03 100644 --- a/sdk/xtdk/amd64/arfuncs.h +++ b/sdk/xtdk/amd64/arfuncs.h @@ -44,6 +44,10 @@ XTCDECL VOID ArLoadInterruptDescriptorTable(IN PVOID Source); +XTCDECL +VOID +ArLoadMxcsrRegister(IN ULONG Source); + XTCDECL VOID ArLoadSegment(IN USHORT Segment, diff --git a/xtoskrnl/ar/amd64/cpufunc.c b/xtoskrnl/ar/amd64/cpufunc.c index 1fb86dd..74fbf9e 100644 --- a/xtoskrnl/ar/amd64/cpufunc.c +++ b/xtoskrnl/ar/amd64/cpufunc.c @@ -141,6 +141,25 @@ ArLoadInterruptDescriptorTable(IN PVOID Source) : "memory"); } +/** + * Loads the value in the source operand into the MXCSR register + * + * @param Source + * Supplies a source value to be loaded into the MXCSR register. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTCDECL +VOID +ArLoadMxcsrRegister(IN ULONG Source) +{ + asm volatile("ldmxcsr %0" + : + : "m" (Source)); +} + /** * Loads source data into specified segment. * diff --git a/xtoskrnl/ar/amd64/procsup.c b/xtoskrnl/ar/amd64/procsup.c index bba02c4..fee75cc 100644 --- a/xtoskrnl/ar/amd64/procsup.c +++ b/xtoskrnl/ar/amd64/procsup.c @@ -66,6 +66,9 @@ ArInitializeProcessor(VOID) /* Initialize processor registers */ ArpInitializeProcessorRegisters(); + + /* Identify processor */ + ArpIdentifyProcessor(); } /** @@ -254,6 +257,9 @@ ArpInitializeProcessorRegisters(VOID) PatAttributes = (PAT_TYPE_WB << 0) | (PAT_TYPE_USWC << 8) | (PAT_TYPE_WEAK_UC << 16) | (PAT_TYPE_STRONG_UC << 24) | (PAT_TYPE_WB << 32) | (PAT_TYPE_USWC << 40) | (PAT_TYPE_WEAK_UC << 48) | (PAT_TYPE_STRONG_UC << 56); ArWriteModelSpecificRegister(X86_MSR_PAT, PatAttributes); + + /* Initialize MXCSR register */ + ArLoadMxcsrRegister(INITIAL_MXCSR); } /**