00001 /*********************************************************** 00002 *PANALIX 0.06, (c) Adrian Panasiuk 2002-4 * 00003 *adek336[at]o2.pl, panalix.prv.pl * 00004 *under GPLv3 license * 00005 * * 00006 *panalix - small osdev project * 00007 ************************************************************ 00008 * msr.cpp, version 1.1 * 00009 ************************************************************ 00010 * * 00011 *Machine specific registers on the ia32 * 00012 * * 00013 *28'07'04- fork'd from branch 0.05j(1.1) * 00014 * * 00015 ***********************************************************/ 00016 00017 #include "src/common/shared.hpp" 00018 #include "src/arch/x86/msr.hpp" 00019 00020 00021 namespace Arch { 00022 namespace x86 { 00023 00024 /*==========================IA-32 MACHINE SPECIFIC REGISTERS===============================*/ 00025 00026 /*write a msr register*/ 00027 void wrmsr(uint32 reg, uint64 val) 00028 { 00029 union 00030 { 00031 uint64 q; 00032 uint32 l[2]; 00033 } uu; 00034 uu.q=val; 00035 asm volatile ("wrmsr" : : "c" (reg), "d" (uu.l[1]), "a" (uu.l[0])); 00036 } 00037 00038 /*read a msr register*/ 00039 uint64 rdmsr(uint32 reg) 00040 { 00041 union 00042 { 00043 uint64 q; 00044 uint32 l[2]; 00045 } uu; 00046 asm volatile ("rdmsr" : "=d" (uu.l[1]), "=a" (uu.l[0]) : "c" (reg)); 00047 00048 return uu.q; 00049 } 00050 00051 00052 }; /*namespace x86*/ 00053 }; /*namespace Arch*/ 00054 00055 00056 /***************************************************** 00057 * * 00058 *panalix 0.05 (c) Adrian Panasiuk 2002-4 * 00059 *adek336[at]o2.pl, panalix.prv.pl * 00060 * * 00061 ******************************************************/