Sfoglia il codice sorgente

hv_vcpu_config_get_feature_regs: Update feature regs with masking

osy 2 anni fa
parent
commit
4a7229e612
1 ha cambiato i file con 26 aggiunte e 13 eliminazioni
  1. 26 13
      hv.m

+ 26 - 13
hv.m

@@ -69,6 +69,20 @@ struct hv_vcpu_data_feature_regs {
   uint64_t ccsidr_el1_data_or_unified[8]; // 0xA8
   uint64_t ccsidr_el1_data_or_unified[8]; // 0xA8
 };
 };
 
 
+// TODO: define names for the flags from aarch64 documents
+#define MODIFY_FLAGS_AA64DFR0_EL1(reg) ((reg) & 0xf0f0f000 | 6)
+#define MODIFY_FLAGS_AA64DFR1_EL1(reg) ((reg) & 0)
+#define MODIFY_FLAGS_AA64ISAR0_EL1(reg) ((reg) & 0xfffffffff0fffff0)
+#define MODIFY_FLAGS_AA64ISAR1_EL1(reg) ((reg) & 0xfffffffffff)
+#define MODIFY_FLAGS_AA64MMFR0_EL1(reg) ((reg) & 0xf000fff000f0 | 1)
+#define MODIFY_FLAGS_AA64MMFR1_EL1(reg) ((reg) & 0xfffff0f0)
+#define MODIFY_FLAGS_AA64MMFR2_EL1(reg) ((reg) & 0xf000000000000000 | (((((reg) >> 48) & 0xff) << 48) | ((((reg) >> 32) & 0xff) << 32) | (((reg) & 0xff0ff))))
+#define MODIFY_FLAGS_AA64PFR0_EL1(reg) ((reg) & 0xff0f0000f0ff00ff | 0x1100)
+#define MODIFY_FLAGS_AA64PFR1_EL1(reg) ((reg) & 0xf0)
+#define MODIFY_FLAGS_CTR_EL0(reg) (reg)
+#define MODIFY_FLAGS_DCZID_EL0(reg) (reg)
+#define MODIFY_FLAGS_CLIDR_EL1(reg) (reg)
+
 static hv_return_t _hv_vcpu_config_get_feature_regs(
 static hv_return_t _hv_vcpu_config_get_feature_regs(
     struct hv_vcpu_data_feature_regs* feature_regs) {
     struct hv_vcpu_data_feature_regs* feature_regs) {
   hv_capabilities_t* caps = nil;
   hv_capabilities_t* caps = nil;
@@ -76,19 +90,18 @@ static hv_return_t _hv_vcpu_config_get_feature_regs(
   if (err) {
   if (err) {
     return err;
     return err;
   }
   }
-  // TODO(zhuowei): they do a bunch of fancy shifting to flip a few bits; we just copy over
-  feature_regs->aa64dfr0_el1 = caps->id_aa64dfr0_el1;
-  feature_regs->aa64dfr1_el1 = caps->id_aa64dfr1_el1;
-  feature_regs->aa64isar0_el1 = caps->id_aa64isar0_el1;
-  feature_regs->aa64isar1_el1 = caps->id_aa64isar1_el1;
-  feature_regs->aa64mmfr0_el1 = caps->id_aa64mmfr0_el1;
-  feature_regs->aa64mmfr1_el1 = caps->id_aa64mmfr1_el1;
-  feature_regs->aa64mmfr2_el1 = caps->id_aa64mmfr2_el1;
-  feature_regs->aa64pfr0_el1 = caps->id_aa64pfr0_el1;
-  feature_regs->aa64pfr1_el1 = caps->id_aa64pfr1_el1;
-  feature_regs->ctr_el0 = caps->ctr_el0;
-  feature_regs->dczid_el0 = caps->dczid_el0;
-  feature_regs->clidr_el1 = caps->clidr_el1;
+  feature_regs->aa64dfr0_el1 = MODIFY_FLAGS_AA64DFR0_EL1(caps->id_aa64dfr0_el1);
+  feature_regs->aa64dfr1_el1 = MODIFY_FLAGS_AA64DFR1_EL1(caps->id_aa64dfr1_el1);
+  feature_regs->aa64isar0_el1 = MODIFY_FLAGS_AA64ISAR0_EL1(caps->id_aa64isar0_el1);
+  feature_regs->aa64isar1_el1 = MODIFY_FLAGS_AA64ISAR1_EL1(caps->id_aa64isar1_el1);
+  feature_regs->aa64mmfr0_el1 = MODIFY_FLAGS_AA64MMFR0_EL1(caps->id_aa64mmfr0_el1);
+  feature_regs->aa64mmfr1_el1 = MODIFY_FLAGS_AA64MMFR1_EL1(caps->id_aa64mmfr1_el1);
+  feature_regs->aa64mmfr2_el1 = MODIFY_FLAGS_AA64MMFR2_EL1(caps->id_aa64mmfr2_el1);
+  feature_regs->aa64pfr0_el1 = MODIFY_FLAGS_AA64PFR0_EL1(caps->id_aa64pfr0_el1);
+  feature_regs->aa64pfr1_el1 = MODIFY_FLAGS_AA64PFR1_EL1(caps->id_aa64pfr1_el1);
+  feature_regs->ctr_el0 = MODIFY_FLAGS_CTR_EL0(caps->ctr_el0);
+  feature_regs->dczid_el0 = MODIFY_FLAGS_DCZID_EL0(caps->dczid_el0);
+  feature_regs->clidr_el1 = MODIFY_FLAGS_CLIDR_EL1(caps->clidr_el1);
   static_assert(sizeof(feature_regs->ccsidr_el1_inst) == sizeof(caps->ccsidr_el1_inst), "ccsidr_el1_inst size");
   static_assert(sizeof(feature_regs->ccsidr_el1_inst) == sizeof(caps->ccsidr_el1_inst), "ccsidr_el1_inst size");
   memcpy(feature_regs->ccsidr_el1_inst, caps->ccsidr_el1_inst, sizeof(feature_regs->ccsidr_el1_inst));
   memcpy(feature_regs->ccsidr_el1_inst, caps->ccsidr_el1_inst, sizeof(feature_regs->ccsidr_el1_inst));
   static_assert(sizeof(feature_regs->ccsidr_el1_data_or_unified) == sizeof(caps->ccsidr_el1_data_or_unified), "ccsidr_el1_data_or_unified size");
   static_assert(sizeof(feature_regs->ccsidr_el1_data_or_unified) == sizeof(caps->ccsidr_el1_data_or_unified), "ccsidr_el1_data_or_unified size");