From eda689ee9aa29e6c4e791a7f295bc4a0a3ad5d83 Mon Sep 17 00:00:00 2001 From: Joshua Wise Date: Sat, 6 Dec 2008 08:56:14 -0500 Subject: [PATCH] Enable caching while in SMM. --- aseg-paging/smi.c | 7 +++++++ include/msr.h | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 include/msr.h diff --git a/aseg-paging/smi.c b/aseg-paging/smi.c index 7f75a85..d519341 100644 --- a/aseg-paging/smi.c +++ b/aseg-paging/smi.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "../net/net.h" #include "vga-overlay.h" @@ -18,6 +19,9 @@ void smi_entry(void) { char statstr[512]; + /* Reenable caching on SMRAM. */ + WRMSR(0x202, (RDMSR(0x202) & ~(0xFFULL)) | 0x06ULL); + pcisave = inl(0xCF8); vgasave = inb(0x3D4); pci_unbother_all(); @@ -51,6 +55,9 @@ void smi_entry(void) pci_bother_all(); outl(0xCF8, pcisave); outb(0x3D4, vgasave); + + /* Disable caching on SMRAM again, to prevent the user from whacking us. */ + WRMSR(0x202, RDMSR(0x202) & ~(0xFFULL)); } extern void timer_handler(smi_event_t ev); diff --git a/include/msr.h b/include/msr.h new file mode 100644 index 0000000..0bed091 --- /dev/null +++ b/include/msr.h @@ -0,0 +1,18 @@ +#ifndef _MSR_H +#define _MSR_H + +#define WRMSR(ad, da) \ + do { \ + unsigned long __a = (ad); \ + unsigned long long __d = (da); \ + asm volatile("wrmsr" : : "c" (__a), "A" (__d)); \ + } while (0) +#define RDMSR(ad) \ + ({ \ + unsigned long __a = (ad); \ + unsigned long long __d; \ + asm volatile("rdmsr" : "=A" (__d) : "c" (__a)); \ + __d; \ + }) + +#endif -- 2.43.0