On 6/20/2025 5:27 PM, Zhao Liu wrote:
> Based on legacy_l1d_cachei_amd, legacy_l1i_cache_amd, legacy_l2_cache_amd
> and legacy_l3_cache, build a complete legacy AMD 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 | 112 ++++++++++++++++++++++------------------------
> 1 file changed, 53 insertions(+), 59 deletions(-)
>
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index ec229830c532..bf8d7a19c88d 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -643,60 +643,58 @@ 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
> */
> -static CPUCacheInfo legacy_l1d_cache_amd = {
> - .type = DATA_CACHE,
> - .level = 1,
> - .size = 64 * KiB,
> - .self_init = 1,
> - .line_size = 64,
> - .associativity = 2,
> - .sets = 512,
> - .partitions = 1,
> - .lines_per_tag = 1,
> - .no_invd_sharing = true,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> -static CPUCacheInfo legacy_l1i_cache_amd = {
> - .type = INSTRUCTION_CACHE,
> - .level = 1,
> - .size = 64 * KiB,
> - .self_init = 1,
> - .line_size = 64,
> - .associativity = 2,
> - .sets = 512,
> - .partitions = 1,
> - .lines_per_tag = 1,
> - .no_invd_sharing = true,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> -static CPUCacheInfo legacy_l2_cache_amd = {
> - .type = UNIFIED_CACHE,
> - .level = 2,
> - .size = 512 * KiB,
> - .line_size = 64,
> - .lines_per_tag = 1,
> - .associativity = 16,
> - .sets = 512,
> - .partitions = 1,
> - .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> -};
> -
> -/* Level 3 unified cache: */
> -static CPUCacheInfo legacy_l3_cache = {
> - .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,
> +static const CPUCaches legacy_amd_cache_info = {
> + .l1d_cache = &(CPUCacheInfo) {
> + .type = DATA_CACHE,
> + .level = 1,
> + .size = 64 * KiB,
> + .self_init = 1,
> + .line_size = 64,
> + .associativity = 2,
> + .sets = 512,
> + .partitions = 1,
> + .lines_per_tag = 1,
> + .no_invd_sharing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> + },
> + .l1i_cache = &(CPUCacheInfo) {
> + .type = INSTRUCTION_CACHE,
> + .level = 1,
> + .size = 64 * KiB,
> + .self_init = 1,
> + .line_size = 64,
> + .associativity = 2,
> + .sets = 512,
> + .partitions = 1,
> + .lines_per_tag = 1,
> + .no_invd_sharing = true,
> + .share_level = CPU_TOPOLOGY_LEVEL_CORE,
> + },
> + .l2_cache = &(CPUCacheInfo) {
> + .type = UNIFIED_CACHE,
> + .level = 2,
> + .size = 512 * KiB,
> + .line_size = 64,
> + .lines_per_tag = 1,
> + .associativity = 16,
> + .sets = 512,
> + .partitions = 1,
> + .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,
> + },
> };
>
> /*
> @@ -8982,11 +8980,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
> }
>
> 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;
> - env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
> - env->cache_info_amd.l3_cache = &legacy_l3_cache;
> + env->cache_info_amd = legacy_amd_cache_info;
> }
>
> #ifndef CONFIG_USER_ONLY
Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>