Skip to content

Commit ed4f963

Browse files
blitzbp3tk0v
authored andcommitted
x86/apic: Fix frequency in apic=verbose log output
When apic=verbose is specified, the LAPIC timer calibration prints its results to the console. At least while debugging virtualization code, the CPU and bus frequencies are printed incorrectly. Specifically, for a 1.7 GHz CPU with 1 GHz bus frequency and HZ=1000, the log includes a superfluous 0 after the period: ..... calibration result: 999978 ..... CPU clock speed is 1696.0783 MHz. ..... host bus clock speed is 999.0978 MHz. Looking at the code, this only worked as intended for HZ=100. After the fix, the correct frequency is printed: ..... calibration result: 999828 ..... CPU clock speed is 1696.507 MHz. ..... host bus clock speed is 999.828 MHz. There is no functional change to the LAPIC calibration here, beyond the printing format changes. [ bp: - Massage commit message - Figures it should apply this patch about ~4 years later - Massage it into the current code ] Suggested-by: Markus Napierkowski <markus.napierkowski@cyberus-technology.de> Signed-off-by: Julian Stecklina <julian.stecklina@cyberus-technology.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Link: https://patch.msgid.link/20211030142148.143261-1-js@alien8.de
1 parent 27d2afa commit ed4f963

1 file changed

Lines changed: 9 additions & 6 deletions

File tree

arch/x86/kernel/apic/apic.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ static struct resource lapic_resource = {
173173
.flags = IORESOURCE_MEM | IORESOURCE_BUSY,
174174
};
175175

176+
/* Measured in ticks per HZ. */
176177
unsigned int lapic_timer_period = 0;
177178

178179
static void apic_pm_activate(void);
@@ -792,6 +793,7 @@ static int __init calibrate_APIC_clock(void)
792793
{
793794
struct clock_event_device *levt = this_cpu_ptr(&lapic_events);
794795
u64 tsc_perj = 0, tsc_start = 0;
796+
long delta_tsc_khz, bus_khz;
795797
unsigned long jif_start;
796798
unsigned long deltaj;
797799
long delta, deltatsc;
@@ -894,14 +896,15 @@ static int __init calibrate_APIC_clock(void)
894896
apic_pr_verbose("..... calibration result: %u\n", lapic_timer_period);
895897

896898
if (boot_cpu_has(X86_FEATURE_TSC)) {
897-
apic_pr_verbose("..... CPU clock speed is %ld.%04ld MHz.\n",
898-
(deltatsc / LAPIC_CAL_LOOPS) / (1000000 / HZ),
899-
(deltatsc / LAPIC_CAL_LOOPS) % (1000000 / HZ));
899+
delta_tsc_khz = (deltatsc * HZ) / (1000 * LAPIC_CAL_LOOPS);
900+
901+
apic_pr_verbose("..... CPU clock speed is %ld.%03ld MHz.\n",
902+
delta_tsc_khz / 1000, delta_tsc_khz % 1000);
900903
}
901904

902-
apic_pr_verbose("..... host bus clock speed is %u.%04u MHz.\n",
903-
lapic_timer_period / (1000000 / HZ),
904-
lapic_timer_period % (1000000 / HZ));
905+
bus_khz = (long)lapic_timer_period * HZ / 1000;
906+
apic_pr_verbose("..... host bus clock speed is %ld.%03ld MHz.\n",
907+
bus_khz / 1000, bus_khz % 1000);
905908

906909
/*
907910
* Do a sanity check on the APIC calibration result

0 commit comments

Comments
 (0)