On 6/20/2025 5:27 PM, Zhao Liu wrote:
> Based on legacy_l1d_cache, legacy_l1i_cache, legacy_l2_cache and
> legacy_l3_cache, build a complete legacy intel cache model, which can
> clarify the purpose of these trivial legacy cache models, simplify the
> initialization of cache info in X86CPUState, and make it easier to
> handle compatibility later.
>
> Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
> ---
> target/i386/cpu.c | 101 +++++++++++++++++++++++++---------------------
> 1 file changed, 54 insertions(+), 47 deletions(-)
>
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 0b292aa2e07b..ec229830c532 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -643,21 +643,6 @@ static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
> * These are legacy cache values. If there is a need to change any
> * of these values please use builtin_x86_defs
> */
> -
> -/* L1 data cache: */
> -static CPUCacheInfo legacy_l1d_cache = {
> - .type = DATA_CACHE,
> - .level = 1,
> - .size = 32 * KiB,
> - .self_init = 1,
> - .line_size = 64,
> - .associativity = 8,
> - .sets = 64,
> - .partitions = 1,
> - .no_invd_sharing = true,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> static CPUCacheInfo legacy_l1d_cache_amd = {
> .type = DATA_CACHE,
> .level = 1,
> @@ -672,20 +657,6 @@ static CPUCacheInfo legacy_l1d_cache_amd = {
> .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> };
>
> -/* L1 instruction cache: */
> -static CPUCacheInfo legacy_l1i_cache = {
> - .type = INSTRUCTION_CACHE,
> - .level = 1,
> - .size = 32 * KiB,
> - .self_init = 1,
> - .line_size = 64,
> - .associativity = 8,
> - .sets = 64,
> - .partitions = 1,
> - .no_invd_sharing = true,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> static CPUCacheInfo legacy_l1i_cache_amd = {
> .type = INSTRUCTION_CACHE,
> .level = 1,
> @@ -700,20 +671,6 @@ static CPUCacheInfo legacy_l1i_cache_amd = {
> .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> };
>
> -/* Level 2 unified cache: */
> -static CPUCacheInfo legacy_l2_cache = {
> - .type = UNIFIED_CACHE,
> - .level = 2,
> - .size = 4 * MiB,
> - .self_init = 1,
> - .line_size = 64,
> - .associativity = 16,
> - .sets = 4096,
> - .partitions = 1,
> - .no_invd_sharing = true,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> static CPUCacheInfo legacy_l2_cache_amd = {
> .type = UNIFIED_CACHE,
> .level = 2,
> @@ -803,6 +760,59 @@ static const CPUCaches legacy_intel_cpuid2_cache_info = {
> },
> };
>
> +static const CPUCaches legacy_intel_cache_info = {
> + .l1d_cache = &(CPUCacheInfo) {
> + .type = DATA_CACHE,
> + .level = 1,
> + .size = 32 * KiB,
> + .self_init = 1,
> + .line_size = 64,
> + .associativity = 8,
> + .sets = 64,
> + .partitions = 1,
> + .no_invd_sharing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> + },
> + .l1i_cache = &(CPUCacheInfo) {
> + .type = INSTRUCTION_CACHE,
> + .level = 1,
> + .size = 32 * KiB,
> + .self_init = 1,
> + .line_size = 64,
> + .associativity = 8,
> + .sets = 64,
> + .partitions = 1,
> + .no_invd_sharing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> + },
> + .l2_cache = &(CPUCacheInfo) {
> + .type = UNIFIED_CACHE,
> + .level = 2,
> + .size = 4 * MiB,
> + .self_init = 1,
> + .line_size = 64,
> + .associativity = 16,
> + .sets = 4096,
> + .partitions = 1,
> + .no_invd_sharing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> + },
> + .l3_cache = &(CPUCacheInfo) {
> + .type = UNIFIED_CACHE,
> + .level = 3,
> + .size = 16 * MiB,
> + .line_size = 64,
> + .associativity = 16,
> + .sets = 16384,
> + .partitions = 1,
> + .lines_per_tag = 1,
> + .self_init = true,
> + .inclusive = true,
> + .complex_indexing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_DIE,
> + },
> +};
> +
> /* TLB definitions: */
>
> #define L1_DTLB_2M_ASSOC 1
> @@ -8971,10 +8981,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
> env->enable_legacy_cpuid2_cache = true;
> }
>
> - env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
> - env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
> - env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
> - env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
> + env->cache_info_cpuid4 = legacy_intel_cache_info;
>
> env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
> env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>