| From 3a636d178fd77891d0924137db2bd074b0b7deed Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 29 Mar 2022 17:47:04 +0700 |
| Subject: x86/delay: Fix the wrong asm constraint in delay_loop() |
| |
| From: Ammar Faizi <ammarfaizi2@gnuweeb.org> |
| |
| [ Upstream commit b86eb74098a92afd789da02699b4b0dd3f73b889 ] |
| |
| The asm constraint does not reflect the fact that the asm statement can |
| modify the value of the local variable loops. Which it does. |
| |
| Specifying the wrong constraint may lead to undefined behavior, it may |
| clobber random stuff (e.g. local variable, important temporary value in |
| regs, etc.). This is especially dangerous when the compiler decides to |
| inline the function and since it doesn't know that the value gets |
| modified, it might decide to use it from a register directly without |
| reloading it. |
| |
| Change the constraint to "+a" to denote that the first argument is an |
| input and an output argument. |
| |
| [ bp: Fix typo, massage commit message. ] |
| |
| Fixes: e01b70ef3eb3 ("x86: fix bug in arch/i386/lib/delay.c file, delay_loop function") |
| Signed-off-by: Ammar Faizi <ammarfaizi2@gnuweeb.org> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Link: https://lore.kernel.org/r/20220329104705.65256-2-ammarfaizi2@gnuweeb.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/lib/delay.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c |
| index 71a3759a2d4e..60cc4f222cbf 100644 |
| --- a/arch/x86/lib/delay.c |
| +++ b/arch/x86/lib/delay.c |
| @@ -42,8 +42,8 @@ static void delay_loop(unsigned long loops) |
| " jnz 2b \n" |
| "3: dec %0 \n" |
| |
| - : /* we don't need output */ |
| - :"a" (loops) |
| + : "+a" (loops) |
| + : |
| ); |
| } |
| |
| -- |
| 2.35.1 |
| |