| From 5eeb8f96ccc49c436139e3b1a8b5da64d889db31 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 24 Mar 2025 14:56:10 -0700 |
| Subject: objtool, regulator: rk808: Remove potential undefined behavior in |
| rk806_set_mode_dcdc() |
| |
| From: Josh Poimboeuf <jpoimboe@kernel.org> |
| |
| [ Upstream commit 29c578c848402a34e8c8e115bf66cb6008b77062 ] |
| |
| If 'ctr_bit' is negative, the shift counts become negative, causing a |
| shift of bounds and undefined behavior. |
| |
| Presumably that's not possible in normal operation, but the code |
| generation isn't optimal. And undefined behavior should be avoided |
| regardless. |
| |
| Improve code generation and remove the undefined behavior by converting |
| the signed variables to unsigned. |
| |
| Fixes the following warning with an UBSAN kernel: |
| |
| vmlinux.o: warning: objtool: rk806_set_mode_dcdc() falls through to next function rk806_get_mode_dcdc() |
| vmlinux.o: warning: objtool: .text.rk806_set_mode_dcdc: unexpected end of section |
| |
| Reported-by: kernel test robot <lkp@intel.com> |
| Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Acked-by: Mark Brown <broonie@kernel.org> |
| Cc: Liam Girdwood <lgirdwood@gmail.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Link: https://lore.kernel.org/r/2023abcddf3f524ba478d64339996f25dc4097d2.1742852847.git.jpoimboe@kernel.org |
| Closes: https://lore.kernel.org/oe-kbuild-all/202503182350.52KeHGD4-lkp@intel.com/ |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/regulator/rk808-regulator.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c |
| index 37476d2558fda..72df554b6375b 100644 |
| --- a/drivers/regulator/rk808-regulator.c |
| +++ b/drivers/regulator/rk808-regulator.c |
| @@ -270,8 +270,8 @@ static const unsigned int rk817_buck1_4_ramp_table[] = { |
| |
| static int rk806_set_mode_dcdc(struct regulator_dev *rdev, unsigned int mode) |
| { |
| - int rid = rdev_get_id(rdev); |
| - int ctr_bit, reg; |
| + unsigned int rid = rdev_get_id(rdev); |
| + unsigned int ctr_bit, reg; |
| |
| reg = RK806_POWER_FPWM_EN0 + rid / 8; |
| ctr_bit = rid % 8; |
| -- |
| 2.39.5 |
| |