aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2023-07-03 09:38:10 +0000
committerAndrew Turner <andrew@FreeBSD.org>2023-07-05 09:42:14 +0000
commit6b1f53295148fb1a10b1193dbd22cb00a796f8d6 (patch)
tree306c015b891c3911022cb97adbfb80e165fe1e88
parent3743f3d020bbb8899af68fc5e01086113468fd2c (diff)
downloadsrc-6b1f53295148fb1a10b1193dbd22cb00a796f8d6.tar.gz
src-6b1f53295148fb1a10b1193dbd22cb00a796f8d6.zip
arm64: Fix a use of update_lower_register
In get_kernel_reg_masked we use update_lower_register to get the lower value of two registers for a given field. It will return the entire register value with just the single field updated. Because of this get_kernel_reg_masked needs to use the returned value directly rather than ORing each field together. Fix this by updating the mask and returning that from get_kernel_reg_masked. Reviewed by: markj Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D40846
-rw-r--r--sys/arm64/arm64/identcpu.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c
index 20ef74f58de2..bbb3e2d1484b 100644
--- a/sys/arm64/arm64/identcpu.c
+++ b/sys/arm64/arm64/identcpu.c
@@ -1821,12 +1821,12 @@ get_kernel_reg_masked(u_int reg, uint64_t *valp, uint64_t mask)
for (int i = 0; i < nitems(user_regs); i++) {
if (user_regs[i].reg == reg) {
val = CPU_DESC_FIELD(kern_cpu_desc, i);
- *valp = 0;
fields = user_regs[i].fields;
for (int j = 0; fields[j].type != 0; j++) {
- *valp |= update_lower_register(mask, val,
+ mask = update_lower_register(mask, val,
fields[j].shift, 4, fields[j].sign);
}
+ *valp = mask;
return (true);
}
}