Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include <ddk.h>
  2.  
  3. #define U64_C(x)  x ## ULL
  4. #define BIT_64(n) (U64_C(1) << (n))
  5.  
  6. struct e_msr {
  7.         union {
  8.                 struct {
  9.                         u32 l;
  10.                         u32 h;
  11.                 };
  12.                 u64 q;
  13.         };
  14. };
  15.  
  16. static void _msr_read(u32 msr, struct e_msr *m)
  17. {
  18.         __asm__ __volatile__(
  19.                 "rdmsr"
  20.                 :"=a"(m->l), "=d"(m->h)
  21.                 :"c"(msr)
  22.                 :"memory"
  23.         );
  24. }
  25.  
  26. static void _msr_write(u32 msr, struct e_msr *m)
  27. {
  28.         __asm__ __volatile__(
  29.            "wrmsr"
  30.                 ::"a"(m->l), "d"(m->h), "c"(msr)
  31.                 :"memory"
  32.         );
  33. }
  34.  
  35. static int __flip_bit(u32 msr, u8 bit, bool set)
  36. {
  37.         struct e_msr m, m1;
  38.         if (bit > 63)
  39.                 return EINVAL;
  40.                
  41.         _msr_read(msr, &m);
  42.  
  43.         m1 = m;
  44.  
  45.         if (set)
  46.                 m1.q |=  BIT_64(bit);
  47.         else
  48.                 m1.q &= ~BIT_64(bit);
  49.  
  50.         if (m1.q == m.q)
  51.                 return 0;
  52.  
  53.         _msr_write(msr, &m1);
  54.         return 1;
  55. }
  56.  
  57.  
  58. int e_msr_set_bit(u32 msr, u8 bit)
  59. {
  60.         return __flip_bit(msr, bit, true);
  61. }