The branch main has been updated by adrian:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=021a190c88fc41f981a79fe6822bdafbcda14e99

commit 021a190c88fc41f981a79fe6822bdafbcda14e99
Author:     Abdelkader Boudih <[email protected]>
AuthorDate: 2026-06-17 14:49:52 +0000
Commit:     Adrian Chadd <[email protected]>
CommitDate: 2026-06-17 14:49:52 +0000

    est: prevent divide-by-zero in est_msr_info
    
    When hw.est.msr_info=1 is set, est_msr_info() extracts the bus clock
    from MSR_PERF_STATUS upper bits. On secondary CPUs, the MSR may
    contain zero in the frequency ratio field, causing a
    divide-by-zero panic.
    
    Observed in pre Skylake Intel cpu.
    
    Reviewed by:    adrian
    Differential Revision:  https://reviews.freebsd.org/D57614
---
 sys/x86/cpufreq/est.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/sys/x86/cpufreq/est.c b/sys/x86/cpufreq/est.c
index 82f35934aa99..804de162ec60 100644
--- a/sys/x86/cpufreq/est.c
+++ b/sys/x86/cpufreq/est.c
@@ -1181,11 +1181,15 @@ est_msr_info(device_t dev, uint64_t msr, freq_info 
**freqs, size_t *freqslen)
        /* Figure out the bus clock. */
        freq = atomic_load_acq_64(&tsc_freq) / 1000000;
        id = msr >> 32;
+       if ((id >> 8) == 0)
+               return (EOPNOTSUPP);
        bus = freq / (id >> 8);
        device_printf(dev, "Guessed bus clock (high) of %d MHz\n", bus);
        if (!bus_speed_ok(bus)) {
                /* We may be running on the low frequency. */
                id = msr >> 48;
+               if ((id >> 8) == 0)
+                       return (EOPNOTSUPP);
                bus = freq / (id >> 8);
                device_printf(dev, "Guessed bus clock (low) of %d MHz\n", bus);
                if (!bus_speed_ok(bus))

Reply via email to