Messages in this thread Patch in this message | | | From | Chuanhua Lei <> | Subject | [PATCH] x86/tsc: Fix 32bit mode issue in get_loops_per_jiffy() | Date | Thu, 6 Sep 2018 18:03:23 +0800 |
| |
lpj returns as zero which is not expected in 32 bit mode After disassembling the code, 0xc1239a9e <+199>: imul $0x3e8,0xc12296e4,%edx 0xc1239aa8 <+209>: xor %ecx,%ecx 0xc1239aaa <+211>: test %edx,%edx 0xc1239aac <+213>: mov %eax,%ebx 0xc1239aae <+215>: je 0xc1239abd <tsc_init+230> 0xc1239ab0 <+217>: mov $0x64,%ecx 0xc1239ab5 <+222>: mov %edx,%eax 0xc1239ab7 <+224>: xor %edx,%edx 0xc1239ab9 <+226>: div %ecx 0xc1239abb <+228>: mov %eax,%ecx 0xc1239abd <+230>: mov %ebx,%eax 0xc1239abf <+232>: mov $0x64,%ebx 0xc1239ac4 <+237>: div %ebx 0xc1239ac6 <+239>: mov %ecx,%edx
imul will load the result into %edx, %edx supposed to be high 32 bit which is not zero. It should be zero in this case. Both lpj and tsc_khz should be u64 to work properly for both 32 bit and 64 bit mode.
Signed-off-by: Chuanhua Lei <chuanhua.lei@linux.intel.com> ---
arch/x86/kernel/tsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 1463468..b346e3f 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1415,7 +1415,7 @@ static bool __init determine_cpu_tsc_frequencies(bool early) static unsigned long __init get_loops_per_jiffy(void) { - unsigned long lpj = tsc_khz * KHZ; + u64 lpj = ((u64)tsc_khz * KHZ); do_div(lpj, HZ); return lpj; -- 2.7.5
| |