[MODERN FEATURES] CPUID and MSR
This commit is contained in:
27
kernel/arch/cpuid.c
Normal file
27
kernel/arch/cpuid.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <cpuid.h>
|
||||
#include <stdint.h>
|
||||
#include <debug.h>
|
||||
|
||||
uint32_t cpuid_features_b, cpuid_features_c, cpuid_features_d;
|
||||
uint32_t cpuid_featuresx_b, cpuid_featuresx_c, cpuid_featuresx_d;
|
||||
uint32_t cpuid_signature;
|
||||
uint32_t cpuid_max=0x0, cpuid_maxx=0x80000000;
|
||||
|
||||
|
||||
void cpuid(uint32_t code, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d)
|
||||
{
|
||||
uint32_t scrap;
|
||||
if(!a) a = &scrap;
|
||||
if(!b) b = &scrap;
|
||||
if(!c) c = &scrap;
|
||||
if(!d) d = &scrap;
|
||||
|
||||
if((code < CPUID_FUNCTIONX_VENDOR && code > cpuid_max) || code > cpuid_maxx)
|
||||
{
|
||||
*a = *b = *c = *d = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
asm volatile("cpuid" : "=a"(*a), "=b"(*b), "=c"(*c), "=d"(*d) : "a"(code));
|
||||
}
|
||||
|
||||
13
kernel/arch/msr.c
Normal file
13
kernel/arch/msr.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <stdint.h>
|
||||
|
||||
uint64_t msr_read(uint32_t msr)
|
||||
{
|
||||
uint64_t lo, hi;
|
||||
asm volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr));
|
||||
return ((hi&0xFFFFFFFF) << 32) | (lo&0xFFFFFFFF);
|
||||
}
|
||||
|
||||
void msr_write(uint32_t msr, uint64_t value)
|
||||
{
|
||||
asm volatile("wrmsr" : : "a" (value&0xFFFFFFFF), "d"(value>>32), "c"(msr));
|
||||
}
|
||||
Reference in New Issue
Block a user