Blame SOURCES/kvm-i386-Add-new-property-to-control-cache-info.patch

1bdc94
From 64b860ac7db707ef2a29d957b794c831637315a6 Mon Sep 17 00:00:00 2001
1bdc94
From: Eduardo Habkost <ehabkost@redhat.com>
1bdc94
Date: Tue, 3 Jul 2018 17:23:50 +0200
1bdc94
Subject: [PATCH 05/89] i386: Add new property to control cache info
1bdc94
1bdc94
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
1bdc94
Message-id: <20180703172356.21038-5-ehabkost@redhat.com>
1bdc94
Patchwork-id: 81212
1bdc94
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH v3 04/10] i386: Add new property to control cache info
1bdc94
Bugzilla: 1481253
1bdc94
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
1bdc94
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
1bdc94
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
1bdc94
From: Babu Moger <babu.moger@amd.com>
1bdc94
1bdc94
The property legacy-cache will be used to control the cache information.
1bdc94
If user passes "-cpu legacy-cache" then older information will
1bdc94
be displayed even if the hardware supports new information. Otherwise
1bdc94
use the statically loaded cache definitions if available.
1bdc94
1bdc94
Renamed the previous cache structures to legacy_*. If there is any change in
1bdc94
the cache information, then it needs to be initialized in builtin_x86_defs.
1bdc94
1bdc94
Signed-off-by: Babu Moger <babu.moger@amd.com>
1bdc94
Tested-by: Geoffrey McRae <geoff@hostfission.com>
1bdc94
Message-Id: <20180514164156.27034-3-babu.moger@amd.com>
1bdc94
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
1bdc94
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
1bdc94
(cherry picked from commit ab8f992e3e63e91be257e4e343d386dae7be4bcb)
1bdc94
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 include/hw/i386/pc.h |  4 +++
1bdc94
 target/i386/cpu.c    | 97 ++++++++++++++++++++++++++++++++++++++--------------
1bdc94
 target/i386/cpu.h    |  5 +++
1bdc94
 3 files changed, 80 insertions(+), 26 deletions(-)
1bdc94
1bdc94
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
1bdc94
index d5a0827..3ff55c6 100644
1bdc94
--- a/include/hw/i386/pc.h
1bdc94
+++ b/include/hw/i386/pc.h
1bdc94
@@ -979,6 +979,10 @@ extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
1bdc94
             .driver   = "Skylake-Server" "-" TYPE_X86_CPU,\
1bdc94
             .property = "clflushopt",\
1bdc94
             .value    = "off",\
1bdc94
+        },{ /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_12 */ \
1bdc94
+            .driver   = TYPE_X86_CPU,\
1bdc94
+            .property = "legacy-cache",\
1bdc94
+            .value    = "on",\
1bdc94
         },
1bdc94
 
1bdc94
 
1bdc94
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
1bdc94
index 23eb47d..3426130 100644
1bdc94
--- a/target/i386/cpu.c
1bdc94
+++ b/target/i386/cpu.c
1bdc94
@@ -336,10 +336,14 @@ static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
1bdc94
     }
1bdc94
 }
1bdc94
 
1bdc94
-/* Definitions of the hardcoded cache entries we expose: */
1bdc94
+/*
1bdc94
+ * Definitions of the hardcoded cache entries we expose:
1bdc94
+ * These are legacy cache values. If there is a need to change any
1bdc94
+ * of these values please use builtin_x86_defs
1bdc94
+ */
1bdc94
 
1bdc94
 /* L1 data cache: */
1bdc94
-static CPUCacheInfo l1d_cache = {
1bdc94
+static CPUCacheInfo legacy_l1d_cache = {
1bdc94
     .type = DCACHE,
1bdc94
     .level = 1,
1bdc94
     .size = 32 * KiB,
1bdc94
@@ -352,7 +356,7 @@ static CPUCacheInfo l1d_cache = {
1bdc94
 };
1bdc94
 
1bdc94
 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
1bdc94
-static CPUCacheInfo l1d_cache_amd = {
1bdc94
+static CPUCacheInfo legacy_l1d_cache_amd = {
1bdc94
     .type = DCACHE,
1bdc94
     .level = 1,
1bdc94
     .size = 64 * KiB,
1bdc94
@@ -366,7 +370,7 @@ static CPUCacheInfo l1d_cache_amd = {
1bdc94
 };
1bdc94
 
1bdc94
 /* L1 instruction cache: */
1bdc94
-static CPUCacheInfo l1i_cache = {
1bdc94
+static CPUCacheInfo legacy_l1i_cache = {
1bdc94
     .type = ICACHE,
1bdc94
     .level = 1,
1bdc94
     .size = 32 * KiB,
1bdc94
@@ -379,7 +383,7 @@ static CPUCacheInfo l1i_cache = {
1bdc94
 };
1bdc94
 
1bdc94
 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
1bdc94
-static CPUCacheInfo l1i_cache_amd = {
1bdc94
+static CPUCacheInfo legacy_l1i_cache_amd = {
1bdc94
     .type = ICACHE,
1bdc94
     .level = 1,
1bdc94
     .size = 64 * KiB,
1bdc94
@@ -393,7 +397,7 @@ static CPUCacheInfo l1i_cache_amd = {
1bdc94
 };
1bdc94
 
1bdc94
 /* Level 2 unified cache: */
1bdc94
-static CPUCacheInfo l2_cache = {
1bdc94
+static CPUCacheInfo legacy_l2_cache = {
1bdc94
     .type = UNIFIED_CACHE,
1bdc94
     .level = 2,
1bdc94
     .size = 4 * MiB,
1bdc94
@@ -406,7 +410,7 @@ static CPUCacheInfo l2_cache = {
1bdc94
 };
1bdc94
 
1bdc94
 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
1bdc94
-static CPUCacheInfo l2_cache_cpuid2 = {
1bdc94
+static CPUCacheInfo legacy_l2_cache_cpuid2 = {
1bdc94
     .type = UNIFIED_CACHE,
1bdc94
     .level = 2,
1bdc94
     .size = 2 * MiB,
1bdc94
@@ -416,7 +420,7 @@ static CPUCacheInfo l2_cache_cpuid2 = {
1bdc94
 
1bdc94
 
1bdc94
 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
1bdc94
-static CPUCacheInfo l2_cache_amd = {
1bdc94
+static CPUCacheInfo legacy_l2_cache_amd = {
1bdc94
     .type = UNIFIED_CACHE,
1bdc94
     .level = 2,
1bdc94
     .size = 512 * KiB,
1bdc94
@@ -428,7 +432,7 @@ static CPUCacheInfo l2_cache_amd = {
1bdc94
 };
1bdc94
 
1bdc94
 /* Level 3 unified cache: */
1bdc94
-static CPUCacheInfo l3_cache = {
1bdc94
+static CPUCacheInfo legacy_l3_cache = {
1bdc94
     .type = UNIFIED_CACHE,
1bdc94
     .level = 3,
1bdc94
     .size = 16 * MiB,
1bdc94
@@ -3321,6 +3325,10 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
1bdc94
         env->features[w] = def->features[w];
1bdc94
     }
1bdc94
 
1bdc94
+    /* Store Cache information from the X86CPUDefinition if available */
1bdc94
+    env->cache_info = def->cache_info;
1bdc94
+    cpu->legacy_cache = def->cache_info ? 0 : 1;
1bdc94
+
1bdc94
     /* Special cases not set in the X86CPUDefinition structs: */
1bdc94
     /* TODO: in-kernel irqchip for hvf */
1bdc94
     if (kvm_enabled()) {
1bdc94
@@ -3670,11 +3678,21 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1bdc94
         if (!cpu->enable_l3_cache) {
1bdc94
             *ecx = 0;
1bdc94
         } else {
1bdc94
-            *ecx = cpuid2_cache_descriptor(&l3_cache);
1bdc94
+            if (env->cache_info && !cpu->legacy_cache) {
1bdc94
+                *ecx = cpuid2_cache_descriptor(&env->cache_info->l3_cache);
1bdc94
+            } else {
1bdc94
+                *ecx = cpuid2_cache_descriptor(&legacy_l3_cache);
1bdc94
+            }
1bdc94
+        }
1bdc94
+        if (env->cache_info && !cpu->legacy_cache) {
1bdc94
+            *edx = (cpuid2_cache_descriptor(&env->cache_info->l1d_cache) << 16) |
1bdc94
+                   (cpuid2_cache_descriptor(&env->cache_info->l1i_cache) <<  8) |
1bdc94
+                   (cpuid2_cache_descriptor(&env->cache_info->l2_cache));
1bdc94
+        } else {
1bdc94
+            *edx = (cpuid2_cache_descriptor(&legacy_l1d_cache) << 16) |
1bdc94
+                   (cpuid2_cache_descriptor(&legacy_l1i_cache) <<  8) |
1bdc94
+                   (cpuid2_cache_descriptor(&legacy_l2_cache_cpuid2));
1bdc94
         }
1bdc94
-        *edx = (cpuid2_cache_descriptor(&l1d_cache) << 16) |
1bdc94
-               (cpuid2_cache_descriptor(&l1i_cache) <<  8) |
1bdc94
-               (cpuid2_cache_descriptor(&l2_cache_cpuid2));
1bdc94
         break;
1bdc94
     case 4:
1bdc94
         /* cache info: needed for Core compatibility */
1bdc94
@@ -3687,27 +3705,35 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1bdc94
             }
1bdc94
         } else {
1bdc94
             *eax = 0;
1bdc94
+            CPUCacheInfo *l1d, *l1i, *l2, *l3;
1bdc94
+            if (env->cache_info && !cpu->legacy_cache) {
1bdc94
+                l1d = &env->cache_info->l1d_cache;
1bdc94
+                l1i = &env->cache_info->l1i_cache;
1bdc94
+                l2 = &env->cache_info->l2_cache;
1bdc94
+                l3 = &env->cache_info->l3_cache;
1bdc94
+            } else {
1bdc94
+                l1d = &legacy_l1d_cache;
1bdc94
+                l1i = &legacy_l1i_cache;
1bdc94
+                l2 = &legacy_l2_cache;
1bdc94
+                l3 = &legacy_l3_cache;
1bdc94
+            }
1bdc94
             switch (count) {
1bdc94
             case 0: /* L1 dcache info */
1bdc94
-                encode_cache_cpuid4(&l1d_cache,
1bdc94
-                                    1, cs->nr_cores,
1bdc94
+                encode_cache_cpuid4(l1d, 1, cs->nr_cores,
1bdc94
                                     eax, ebx, ecx, edx);
1bdc94
                 break;
1bdc94
             case 1: /* L1 icache info */
1bdc94
-                encode_cache_cpuid4(&l1i_cache,
1bdc94
-                                    1, cs->nr_cores,
1bdc94
+                encode_cache_cpuid4(l1i, 1, cs->nr_cores,
1bdc94
                                     eax, ebx, ecx, edx);
1bdc94
                 break;
1bdc94
             case 2: /* L2 cache info */
1bdc94
-                encode_cache_cpuid4(&l2_cache,
1bdc94
-                                    cs->nr_threads, cs->nr_cores,
1bdc94
+                encode_cache_cpuid4(l2, cs->nr_threads, cs->nr_cores,
1bdc94
                                     eax, ebx, ecx, edx);
1bdc94
                 break;
1bdc94
             case 3: /* L3 cache info */
1bdc94
                 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
1bdc94
                 if (cpu->enable_l3_cache) {
1bdc94
-                    encode_cache_cpuid4(&l3_cache,
1bdc94
-                                        (1 << pkg_offset), cs->nr_cores,
1bdc94
+                    encode_cache_cpuid4(l3, (1 << pkg_offset), cs->nr_cores,
1bdc94
                                         eax, ebx, ecx, edx);
1bdc94
                     break;
1bdc94
                 }
1bdc94
@@ -3920,8 +3946,13 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1bdc94
                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
1bdc94
         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
1bdc94
                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
1bdc94
-        *ecx = encode_cache_cpuid80000005(&l1d_cache_amd);
1bdc94
-        *edx = encode_cache_cpuid80000005(&l1i_cache_amd);
1bdc94
+        if (env->cache_info && !cpu->legacy_cache) {
1bdc94
+            *ecx = encode_cache_cpuid80000005(&env->cache_info->l1d_cache);
1bdc94
+            *edx = encode_cache_cpuid80000005(&env->cache_info->l1i_cache);
1bdc94
+        } else {
1bdc94
+            *ecx = encode_cache_cpuid80000005(&legacy_l1d_cache_amd);
1bdc94
+            *edx = encode_cache_cpuid80000005(&legacy_l1i_cache_amd);
1bdc94
+        }
1bdc94
         break;
1bdc94
     case 0x80000006:
1bdc94
         /* cache info (L2 cache) */
1bdc94
@@ -3937,9 +3968,17 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1bdc94
                (L2_DTLB_4K_ENTRIES << 16) | \
1bdc94
                (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
1bdc94
                (L2_ITLB_4K_ENTRIES);
1bdc94
-        encode_cache_cpuid80000006(&l2_cache_amd,
1bdc94
-                                   cpu->enable_l3_cache ? &l3_cache : NULL,
1bdc94
-                                   ecx, edx);
1bdc94
+        if (env->cache_info && !cpu->legacy_cache) {
1bdc94
+            encode_cache_cpuid80000006(&env->cache_info->l2_cache,
1bdc94
+                                       cpu->enable_l3_cache ?
1bdc94
+                                       &env->cache_info->l3_cache : NULL,
1bdc94
+                                       ecx, edx);
1bdc94
+        } else {
1bdc94
+            encode_cache_cpuid80000006(&legacy_l2_cache_amd,
1bdc94
+                                       cpu->enable_l3_cache ?
1bdc94
+                                       &legacy_l3_cache : NULL,
1bdc94
+                                       ecx, edx);
1bdc94
+        }
1bdc94
         break;
1bdc94
     case 0x80000007:
1bdc94
         *eax = 0;
1bdc94
@@ -5119,6 +5158,12 @@ static Property x86_cpu_properties[] = {
1bdc94
                      false),
1bdc94
     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
1bdc94
     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
1bdc94
+    /*
1bdc94
+     * lecacy_cache defaults to CPU model being chosen. This is set in
1bdc94
+     * x86_cpu_load_def based on cache_info which is initialized in
1bdc94
+     * builtin_x86_defs
1bdc94
+     */
1bdc94
+    DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, false),
1bdc94
 
1bdc94
     /*
1bdc94
      * From "Requirements for Implementing the Microsoft
1bdc94
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
1bdc94
index 912aa34..b01b0c1 100644
1bdc94
--- a/target/i386/cpu.h
1bdc94
+++ b/target/i386/cpu.h
1bdc94
@@ -1397,6 +1397,11 @@ struct X86CPU {
1bdc94
      */
1bdc94
     bool enable_l3_cache;
1bdc94
 
1bdc94
+    /* Compatibility bits for old machine types.
1bdc94
+     * If true present the old cache topology information
1bdc94
+     */
1bdc94
+    bool legacy_cache;
1bdc94
+
1bdc94
     /* Compatibility bits for old machine types: */
1bdc94
     bool enable_cpuid_0xb;
1bdc94
 
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94