To get the number of cache leaves on AMD or Hygon platform, it should get the value of cpuid leaf 0x8000001d. But on certain broken platform such as a not fullly implemented virtual platform(for example Xen), the value of the cpuid leaf will nerver be CTYPE_NULL, so the kernel will run into an endless loop.
To fix this problem, add a new enum type CTYPE_MAX to limit the maximum cpuid accessing. Signed-off-by: Pu Wen <pu...@hygon.cn> --- arch/x86/kernel/cpu/cacheinfo.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c index dc1b934..7bd167f 100644 --- a/arch/x86/kernel/cpu/cacheinfo.c +++ b/arch/x86/kernel/cpu/cacheinfo.c @@ -121,7 +121,8 @@ enum _cache_type { CTYPE_NULL = 0, CTYPE_DATA = 1, CTYPE_INST = 2, - CTYPE_UNIFIED = 3 + CTYPE_UNIFIED = 3, + CTYPE_MAX = 4 }; union _cpuid4_leaf_eax { @@ -640,7 +641,7 @@ static int find_num_cache_leaves(struct cpuinfo_x86 *c) /* Do cpuid(op) loop to find out num_cache_leaves */ cpuid_count(op, i, &eax, &ebx, &ecx, &edx); cache_eax.full = eax; - } while (cache_eax.split.type != CTYPE_NULL); + } while (cache_eax.split.type != CTYPE_NULL && i != CTYPE_MAX); return i; } -- 2.7.4