x86/mtrr: split "enabled" field into two boolean flags
authorJan Beulich <jbeulich@suse.com>
Mon, 16 Jul 2018 13:09:12 +0000 (15:09 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 16 Jul 2018 13:09:12 +0000 (15:09 +0200)
The code hopefully is more readable this way.

Also switch have_fixed to bool, seeing that it already is used as a
boolean.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
[switched to use MASK_*]
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
xen/arch/x86/cpu/mtrr/generic.c
xen/arch/x86/hvm/hvm.c
xen/arch/x86/hvm/mtrr.c
xen/include/asm-x86/msr-index.h
xen/include/asm-x86/mtrr.h

index 7ba0c3f0fe893cdc32a9ebecdb4dbd8b8a14ce83..09763654be9bb99b9084a3fa7b2aaf5d5e31028b 100644 (file)
@@ -80,7 +80,8 @@ void __init get_mtrr_state(void)
 
        rdmsrl(MSR_MTRRdefType, msr_content);
        mtrr_state.def_type = (msr_content & 0xff);
-       mtrr_state.enabled = (msr_content & 0xc00) >> 10;
+       mtrr_state.enabled = MASK_EXTR(msr_content, MTRRdefType_E);
+       mtrr_state.fixed_enabled = MASK_EXTR(msr_content, MTRRdefType_FE);
 
        /* Store mtrr_cap for HVM MTRR virtualisation. */
        rdmsrl(MSR_MTRRcap, mtrr_state.mtrr_cap);
@@ -159,7 +160,7 @@ static void __init print_mtrr_state(const char *level)
                unsigned int base = 0, step = 0x10000;
 
                printk("%sMTRR fixed ranges %sabled:\n", level,
-                      mtrr_state.enabled & 1 ? "en" : "dis");
+                      mtrr_state.fixed_enabled ? "en" : "dis");
                for (; block->ranges; ++block, step >>= 2) {
                        for (i = 0; i < block->ranges; ++i, fr += 8) {
                                print_fixed(base, step, fr, level);
@@ -169,7 +170,7 @@ static void __init print_mtrr_state(const char *level)
                print_fixed_last(level);
        }
        printk("%sMTRR variable ranges %sabled:\n", level,
-              mtrr_state.enabled & 2 ? "en" : "dis");
+              mtrr_state.enabled ? "en" : "dis");
        width = (paddr_bits - PAGE_SHIFT + 3) / 4;
 
        for (i = 0; i < num_var_ranges; ++i) {
@@ -383,8 +384,11 @@ static unsigned long set_mtrr_state(void)
        /*  Set_mtrr_restore restores the old value of MTRRdefType,
           so to set it we fiddle with the saved value  */
        if ((deftype & 0xff) != mtrr_state.def_type
-           || ((deftype & 0xc00) >> 10) != mtrr_state.enabled) {
-               deftype = (deftype & ~0xcff) | mtrr_state.def_type | (mtrr_state.enabled << 10);
+           || MASK_EXTR(deftype, MTRRdefType_E) != mtrr_state.enabled
+           || MASK_EXTR(deftype, MTRRdefType_FE) != mtrr_state.fixed_enabled) {
+               deftype = (deftype & ~0xcff) | mtrr_state.def_type |
+                         MASK_INSR(mtrr_state.enabled, MTRRdefType_E) |
+                         MASK_INSR(mtrr_state.fixed_enabled, MTRRdefType_FE);
                change_mask |= MTRR_CHANGE_MASK_DEFTYPE;
        }
 
index e022f5ab0e7a34d935cedb5262f91bcc68d5cdfc..3e2abeb2740188a500a7852bfd8de70d860e5445 100644 (file)
@@ -3453,8 +3453,10 @@ int hvm_msr_read_intercept(unsigned int msr, uint64_t *msr_content)
     case MSR_MTRRdefType:
         if ( !d->arch.cpuid->basic.mtrr )
             goto gp_fault;
-        *msr_content = v->arch.hvm_vcpu.mtrr.def_type
-                        | (v->arch.hvm_vcpu.mtrr.enabled << 10);
+        *msr_content = v->arch.hvm_vcpu.mtrr.def_type |
+                       MASK_INSR(v->arch.hvm_vcpu.mtrr.enabled, MTRRdefType_E) |
+                       MASK_INSR(v->arch.hvm_vcpu.mtrr.fixed_enabled,
+                                 MTRRdefType_FE);
         break;
     case MSR_MTRRfix64K_00000:
         if ( !d->arch.cpuid->basic.mtrr )
index a63601238816623e1564a57d8b85fa70405df2b9..d74b3638514c0a1870561b179ef1d63b4e47caa5 100644 (file)
@@ -195,11 +195,11 @@ static int get_mtrr_type(const struct mtrr_state *m,
    uint64_t    mask = -(uint64_t)PAGE_SIZE << order;
    unsigned int seg, num_var_ranges = MASK_EXTR(m->mtrr_cap, MTRRcap_VCNT);
 
-   if ( unlikely(!(m->enabled & 0x2)) )
+   if ( unlikely(!m->enabled) )
        return MTRR_TYPE_UNCACHABLE;
 
    pa &= mask;
-   if ( (pa < 0x100000) && (m->enabled & 1) )
+   if ( (pa < 0x100000) && m->fixed_enabled )
    {
        /* Fixed range MTRR takes effect. */
        uint32_t addr = (uint32_t)pa, index;
@@ -391,7 +391,8 @@ bool_t mtrr_def_type_msr_set(struct domain *d, struct mtrr_state *m,
                              uint64_t msr_content)
 {
     uint8_t def_type = msr_content & 0xff;
-    uint8_t enabled = (msr_content >> 10) & 0x3;
+    bool fixed_enabled = MASK_EXTR(msr_content, MTRRdefType_FE);
+    bool enabled = MASK_EXTR(msr_content, MTRRdefType_E);
 
     if ( unlikely(!valid_mtrr_type(def_type)) )
     {
@@ -406,10 +407,12 @@ bool_t mtrr_def_type_msr_set(struct domain *d, struct mtrr_state *m,
          return 0;
     }
 
-    if ( m->enabled != enabled || m->def_type != def_type )
+    if ( m->enabled != enabled || m->fixed_enabled != fixed_enabled ||
+         m->def_type != def_type )
     {
         m->enabled = enabled;
         m->def_type = def_type;
+        m->fixed_enabled = fixed_enabled;
         memory_type_changed(d);
     }
 
@@ -478,10 +481,10 @@ bool mtrr_pat_not_equal(const struct vcpu *vd, const struct vcpu *vs)
     const struct mtrr_state *md = &vd->arch.hvm_vcpu.mtrr;
     const struct mtrr_state *ms = &vs->arch.hvm_vcpu.mtrr;
 
-    if ( (md->enabled ^ ms->enabled) & 2 )
+    if ( md->enabled != ms->enabled )
         return true;
 
-    if ( md->enabled & 2 )
+    if ( md->enabled )
     {
         unsigned int num_var_ranges = MASK_EXTR(md->mtrr_cap, MTRRcap_VCNT);
 
@@ -490,10 +493,10 @@ bool mtrr_pat_not_equal(const struct vcpu *vd, const struct vcpu *vs)
             return true;
 
         /* Test fixed ranges. */
-        if ( (md->enabled ^ ms->enabled) & 1 )
+        if ( md->fixed_enabled != ms->fixed_enabled )
             return true;
 
-        if ( (md->enabled & 1) &&
+        if ( md->fixed_enabled &&
              memcmp(md->fixed_ranges, ms->fixed_ranges,
                     sizeof(md->fixed_ranges)) )
             return true;
@@ -681,7 +684,9 @@ static int hvm_save_mtrr_msr(struct domain *d, hvm_domain_context_t *h)
         const struct mtrr_state *mtrr_state = &v->arch.hvm_vcpu.mtrr;
         struct hvm_hw_mtrr hw_mtrr = {
             .msr_mtrr_def_type = mtrr_state->def_type |
-                                 (mtrr_state->enabled << 10),
+                                 MASK_INSR(mtrr_state->fixed_enabled,
+                                           MTRRdefType_FE) |
+                                 MASK_INSR(mtrr_state->enabled, MTRRdefType_E),
             .msr_mtrr_cap      = mtrr_state->mtrr_cap,
         };
         unsigned int i;
index 95bb66916c5c9caef4057c089a6d386f27842494..94bccf73a1dae9ffce87315fb0fae11859e1722d 100644 (file)
@@ -98,6 +98,8 @@
 #define MSR_MTRRfix4K_F0000            0x0000026e
 #define MSR_MTRRfix4K_F8000            0x0000026f
 #define MSR_MTRRdefType                        0x000002ff
+#define MTRRdefType_FE                 (1u << 10)
+#define MTRRdefType_E                  (1u << 11)
 
 #define MSR_IA32_DEBUGCTLMSR           0x000001d9
 #define IA32_DEBUGCTLMSR_LBR           (1<<0) /* Last Branch Record */
index 5cdc5d4fe3a39e65c47ef1e1c4e508b4228165c2..b1f7af6396e125f824e445377edf211f429a471b 100644 (file)
@@ -50,8 +50,9 @@ struct mtrr_var_range {
 struct mtrr_state {
        struct mtrr_var_range *var_ranges;
        mtrr_type fixed_ranges[NUM_FIXED_RANGES];
-       unsigned char enabled;
-       unsigned char have_fixed;
+       bool enabled;
+       bool fixed_enabled;
+       bool have_fixed;
        mtrr_type def_type;
 
        u64       mtrr_cap;