hwmon: occ: fix unaligned accesses
PATCH 1/1 hwmon: occ: fix unaligned accesses
From: Arnd Bergmann <[email protected]>
Passing a pointer to an unaligned integer as a function argument is undefined behavior:
drivers/hwmon/occ/common.c:492:27: warning: taking address of packed member 'accumulator' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member]
492 | val = occ_get_powr_avg(&power->accumulator,
| ^~~~~~~~~~~~~~~~~~
drivers/hwmon/occ/common.c:493:13: warning: taking address of packed member 'update_tag' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member]
493 | &power->update_tag);
| ^~~~~~~~~~~~~~~~~Move the get_unaligned() calls out of the function and pass these through argument registers instead.
--- drivers/hwmon/occ/common.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-)
drivers/hwmon/occ/common.c +13 -15
@@ -459,12 +459,10 @@ static ssize_t occ_show_power_1(struct device *dev,return sysfs_emit (buf,"%llu\n" , val); } -static u64 occ_get_powr_avg (u64 *accum,u32 *samples) +static u64 occ_get_powr_avg (u64 accum,u32 samples) { -u64 divisor =get_unaligned_be32 (samples); - -return (divisor ==0 ) ?0 : -div64_u64 (get_unaligned_be64 (accum) *1000000ULL , divisor); +return (samples ==0 ) ?0 : +mul_u64_u32_div (accum,1000000UL , samples); } static ssize_t occ_show_power_2(struct device *dev,
@@ -489,8 +487,8 @@ static ssize_t occ_show_power_2(struct device *dev,get_unaligned_be32 (&power->sensor_id), power->function_id, power->apss_channel);case 1 : - val =occ_get_powr_avg (&power->accumulator, - &power->update_tag); + val =occ_get_powr_avg (get_unaligned_be64 (&power->accumulator), +get_unaligned_be32 (&power->update_tag));break ;case 2 : val = (u64)get_unaligned_be32(&power->update_tag) *
@@ -527,8 +525,8 @@ static ssize_t occ_show_power_a0(struct device *dev,return sysfs_emit (buf,"%u_system\n" ,get_unaligned_be32 (&power->sensor_id));case 1 : - val =occ_get_powr_avg (&power->system.accumulator, - &power->system.update_tag); + val =occ_get_powr_avg (get_unaligned_be64 (&power->system.accumulator), +get_unaligned_be32 (&power->system.update_tag));break ;case 2 : val = (u64)get_unaligned_be32(&power->system.update_tag) *
@@ -541,8 +539,8 @@ static ssize_t occ_show_power_a0(struct device *dev,return sysfs_emit (buf,"%u_proc\n" ,get_unaligned_be32 (&power->sensor_id));case 5 : - val =occ_get_powr_avg (&power->proc.accumulator, - &power->proc.update_tag); + val =occ_get_powr_avg (get_unaligned_be64 (&power->proc.accumulator), +get_unaligned_be32 (&power->proc.update_tag));break ;case 6 : val = (u64)get_unaligned_be32(&power->proc.update_tag) *
@@ -555,8 +553,8 @@ static ssize_t occ_show_power_a0(struct device *dev,return sysfs_emit (buf,"%u_vdd\n" ,get_unaligned_be32 (&power->sensor_id));case 9 : - val =occ_get_powr_avg (&power->vdd.accumulator, - &power->vdd.update_tag); + val =occ_get_powr_avg (get_unaligned_be64 (&power->vdd.accumulator), +get_unaligned_be32 (&power->vdd.update_tag));break ;case 10 : val = (u64)get_unaligned_be32(&power->vdd.update_tag) *
@@ -569,8 +567,8 @@ static ssize_t occ_show_power_a0(struct device *dev,return sysfs_emit (buf,"%u_vdn\n" ,get_unaligned_be32 (&power->sensor_id));case 13 : - val =occ_get_powr_avg (&power->vdn.accumulator, - &power->vdn.update_tag); + val =occ_get_powr_avg (get_unaligned_be64 (&power->vdn.accumulator), +get_unaligned_be32 (&power->vdn.update_tag));break ;case 14 : val = (u64)get_unaligned_be32(&power->vdn.update_tag) *
Signature · 1 line
2.39.5
Quoted 12 lines · Arnd Bergmann
From: Arnd Bergmann <[email protected]>
Passing a pointer to an unaligned integer as a function argument is undefined behavior:
drivers/hwmon/occ/common.c:492:27: warning: taking address of packed member 'accumulator' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member]
492 | val = occ_get_powr_avg(&power->accumulator,| ^~~~~~~~~~~~~~~~~~ drivers/hwmon/occ/common.c:493:13: warning: taking address of packed member 'update_tag' of class or structure 'power_sensor_2' may result in an unaligned pointer value [-Waddress-of-packed-member] 493 | &power->update_tag); | ^~~~~~~~~~~~~~~~~
Quoted 5 lines
Move the
get_unaligned()calls out of the function and pass these through argument registers instead.Fixes c10e753d43eb ("hwmon (occ): Add sensor types and versions")Signed-off-by Arnd Bergmann <[email protected]>
Applied.
Thanks,
Guenter