hwmon: (occ) fix unaligned accesses
[ Upstream commit 2c021b45c154958566aad0cae9f74ab26a2d5732 ]
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.
Fixes: c10e753d43
("hwmon (occ): Add sensor types and versions")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20250610092553.2641094-1-arnd@kernel.org
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1312d9bf88
commit
4c8f5b0483
@@ -459,12 +459,10 @@ static ssize_t occ_show_power_1(struct device *dev,
|
|||||||
return sysfs_emit(buf, "%llu\n", val);
|
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 (samples == 0) ? 0 :
|
||||||
|
mul_u64_u32_div(accum, 1000000UL, samples);
|
||||||
return (divisor == 0) ? 0 :
|
|
||||||
div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t occ_show_power_2(struct device *dev,
|
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),
|
get_unaligned_be32(&power->sensor_id),
|
||||||
power->function_id, power->apss_channel);
|
power->function_id, power->apss_channel);
|
||||||
case 1:
|
case 1:
|
||||||
val = occ_get_powr_avg(&power->accumulator,
|
val = occ_get_powr_avg(get_unaligned_be64(&power->accumulator),
|
||||||
&power->update_tag);
|
get_unaligned_be32(&power->update_tag));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
val = (u64)get_unaligned_be32(&power->update_tag) *
|
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",
|
return sysfs_emit(buf, "%u_system\n",
|
||||||
get_unaligned_be32(&power->sensor_id));
|
get_unaligned_be32(&power->sensor_id));
|
||||||
case 1:
|
case 1:
|
||||||
val = occ_get_powr_avg(&power->system.accumulator,
|
val = occ_get_powr_avg(get_unaligned_be64(&power->system.accumulator),
|
||||||
&power->system.update_tag);
|
get_unaligned_be32(&power->system.update_tag));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
val = (u64)get_unaligned_be32(&power->system.update_tag) *
|
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",
|
return sysfs_emit(buf, "%u_proc\n",
|
||||||
get_unaligned_be32(&power->sensor_id));
|
get_unaligned_be32(&power->sensor_id));
|
||||||
case 5:
|
case 5:
|
||||||
val = occ_get_powr_avg(&power->proc.accumulator,
|
val = occ_get_powr_avg(get_unaligned_be64(&power->proc.accumulator),
|
||||||
&power->proc.update_tag);
|
get_unaligned_be32(&power->proc.update_tag));
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
val = (u64)get_unaligned_be32(&power->proc.update_tag) *
|
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",
|
return sysfs_emit(buf, "%u_vdd\n",
|
||||||
get_unaligned_be32(&power->sensor_id));
|
get_unaligned_be32(&power->sensor_id));
|
||||||
case 9:
|
case 9:
|
||||||
val = occ_get_powr_avg(&power->vdd.accumulator,
|
val = occ_get_powr_avg(get_unaligned_be64(&power->vdd.accumulator),
|
||||||
&power->vdd.update_tag);
|
get_unaligned_be32(&power->vdd.update_tag));
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
val = (u64)get_unaligned_be32(&power->vdd.update_tag) *
|
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",
|
return sysfs_emit(buf, "%u_vdn\n",
|
||||||
get_unaligned_be32(&power->sensor_id));
|
get_unaligned_be32(&power->sensor_id));
|
||||||
case 13:
|
case 13:
|
||||||
val = occ_get_powr_avg(&power->vdn.accumulator,
|
val = occ_get_powr_avg(get_unaligned_be64(&power->vdn.accumulator),
|
||||||
&power->vdn.update_tag);
|
get_unaligned_be32(&power->vdn.update_tag));
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
val = (u64)get_unaligned_be32(&power->vdn.update_tag) *
|
val = (u64)get_unaligned_be32(&power->vdn.update_tag) *
|
||||||
|
Reference in New Issue
Block a user