The code used to flush the cache on VIA processors unconditionally, which is excessive. Check for cpuid family and execute wbinvd only on C3 and earlier.
Fixes: https://savannah.gnu.org/bugs/?45149 Fixes: commit 25492a0f047cb7a6583ae195568599c296a604d6 Signed-off-by: ValdikSS <i...@valdikss.org.ru> Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com> --- grub-core/kern/i386/pc/init.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/grub-core/kern/i386/pc/init.c b/grub-core/kern/i386/pc/init.c index 27bc68b8a..7f08d2067 100644 --- a/grub-core/kern/i386/pc/init.c +++ b/grub-core/kern/i386/pc/init.c @@ -191,7 +191,7 @@ extern grub_uint16_t grub_bios_via_workaround1, grub_bios_via_workaround2; static void grub_via_workaround_init (void) { - grub_uint32_t manufacturer[3], max_cpuid; + grub_uint32_t manufacturer[3], max_cpuid, procinfo; if (! grub_cpu_is_cpuid_supported ()) return; @@ -200,6 +200,15 @@ grub_via_workaround_init (void) if (grub_memcmp (manufacturer, "CentaurHauls", 12) != 0) return; + if (max_cpuid > 0) + { + grub_cpuid (1, procinfo, /* Don't care */ manufacturer[0], + manufacturer[2], manufacturer[1]); + /* Check model, apply only to VIA C3 and lower */ + if (((procinfo & 0xF0) >> 4 | (procinfo & 0xF0000) >> 12) > 10) + return; + } + grub_bios_via_workaround1 = 0x090f; grub_bios_via_workaround2 = 0x090f; asm volatile ("wbinvd"); -- 2.41.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel