The branch main has been updated by andrew:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=6b1f53295148fb1a10b1193dbd22cb00a796f8d6

commit 6b1f53295148fb1a10b1193dbd22cb00a796f8d6
Author:     Andrew Turner <[email protected]>
AuthorDate: 2023-07-03 09:38:10 +0000
Commit:     Andrew Turner <[email protected]>
CommitDate: 2023-07-05 09:42:14 +0000

    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
---
 sys/arm64/arm64/identcpu.c | 4 ++--
 1 file 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);
                }
        }

Reply via email to