Page MenuHomeFreeBSD

D40500.id.diff
No OneTemporary

D40500.id.diff

diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c
--- a/sys/arm64/arm64/identcpu.c
+++ b/sys/arm64/arm64/identcpu.c
@@ -1721,38 +1721,6 @@
return (1);
}
-bool
-extract_user_id_field(u_int reg, u_int field_shift, uint8_t *val)
-{
- uint64_t value;
- int i;
-
- for (i = 0; i < nitems(user_regs); i++) {
- if (user_regs[i].reg == reg) {
- value = CPU_DESC_FIELD(user_cpu_desc, i);
- *val = value >> field_shift;
- return (true);
- }
- }
-
- return (false);
-}
-
-bool
-get_kernel_reg(u_int reg, uint64_t *val)
-{
- int i;
-
- for (i = 0; i < nitems(user_regs); i++) {
- if (user_regs[i].reg == reg) {
- *val = CPU_DESC_FIELD(kern_cpu_desc, i);
- return (true);
- }
- }
-
- return (false);
-}
-
/*
* Compares two field values that may be signed or unsigned.
* Returns:
@@ -1808,6 +1776,64 @@
return (val);
}
+bool
+extract_user_id_field(u_int reg, u_int field_shift, uint8_t *val)
+{
+ uint64_t value;
+ int i;
+
+ for (i = 0; i < nitems(user_regs); i++) {
+ if (user_regs[i].reg == reg) {
+ value = CPU_DESC_FIELD(user_cpu_desc, i);
+ *val = value >> field_shift;
+ return (true);
+ }
+ }
+
+ return (false);
+}
+
+bool
+get_kernel_reg(u_int reg, uint64_t *val)
+{
+ int i;
+
+ for (i = 0; i < nitems(user_regs); i++) {
+ if (user_regs[i].reg == reg) {
+ *val = CPU_DESC_FIELD(kern_cpu_desc, i);
+ return (true);
+ }
+ }
+
+ return (false);
+}
+
+/*
+ * Fetch the specified register's value, ensuring that individual field values
+ * do not exceed those in the mask.
+ */
+bool
+get_kernel_reg_masked(u_int reg, uint64_t *valp, uint64_t mask)
+{
+ struct mrs_field *fields;
+ uint64_t val;
+
+ 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,
+ fields[j].shift, 4, fields[j].sign);
+ }
+ return (true);
+ }
+ }
+
+ return (false);
+}
+
void
update_special_regs(u_int cpu)
{
diff --git a/sys/arm64/include/cpu.h b/sys/arm64/include/cpu.h
--- a/sys/arm64/include/cpu.h
+++ b/sys/arm64/include/cpu.h
@@ -213,6 +213,7 @@
void update_special_regs(u_int);
bool extract_user_id_field(u_int, u_int, uint8_t *);
bool get_kernel_reg(u_int, uint64_t *);
+bool get_kernel_reg_masked(u_int, uint64_t *, uint64_t);
void cpu_desc_init(void);

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 5, 11:18 PM (1 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27502302
Default Alt Text
D40500.id.diff (2 KB)

Event Timeline