Skip to content

Commit 2bdd592

Browse files
committed
arm64: sysreg: Add validation checks to sysreg header generation script
JIRA: https://issues.redhat.com/browse/RHEL-101059 commit 382cbbe Author: Fuad Tabba <tabba@google.com> Date: Fri, 29 Aug 2025 10:51:43 +0100 The gen_sysreg.awk script processes the system register specification in the sysreg text file to generate C macro definitions. The current script will silently accept certain errors in the specification file, leading to incorrect header generation. For example, a Sysreg or SysregFields can be accidentally duplicated, causing its macros to be emitted twice. An Enum can contain duplicate values for different items, which is architecturally incorrect. Add checks to catch these errors at build time. The script now tracks all seen Sysreg and SysregFields definitions and checks for duplicates. It also tracks values within each Enum block to ensure entries are unique. Acked-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Fuad Tabba <tabba@google.com> Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Mark Salter <msalter@redhat.com>
1 parent 4e7b265 commit 2bdd592

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

arch/arm64/tools/gen-sysreg.awk

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ $1 == "SysregFields" && block_current() == "Root" {
122122
res1 = "UL(0)"
123123
unkn = "UL(0)"
124124

125+
if (reg in defined_fields)
126+
fatal("Duplicate SysregFields definition for " reg)
127+
defined_fields[reg] = 1
128+
125129
next_bit = 63
126130

127131
next
@@ -162,6 +166,10 @@ $1 == "Sysreg" && block_current() == "Root" {
162166
res1 = "UL(0)"
163167
unkn = "UL(0)"
164168

169+
if (reg in defined_regs)
170+
fatal("Duplicate Sysreg definition for " reg)
171+
defined_regs[reg] = 1
172+
165173
define("REG_" reg, "S" op0 "_" op1 "_C" crn "_C" crm "_" op2)
166174
define("SYS_" reg, "sys_reg(" op0 ", " op1 ", " crn ", " crm ", " op2 ")")
167175

@@ -284,6 +292,8 @@ $1 == "SignedEnum" && (block_current() == "Sysreg" || block_current() == "Sysreg
284292
define_field(reg, field, msb, lsb)
285293
define_field_sign(reg, field, "true")
286294

295+
delete seen_enum_vals
296+
287297
next
288298
}
289299

@@ -297,6 +307,8 @@ $1 == "UnsignedEnum" && (block_current() == "Sysreg" || block_current() == "Sysr
297307
define_field(reg, field, msb, lsb)
298308
define_field_sign(reg, field, "false")
299309

310+
delete seen_enum_vals
311+
300312
next
301313
}
302314

@@ -309,6 +321,8 @@ $1 == "Enum" && (block_current() == "Sysreg" || block_current() == "SysregFields
309321

310322
define_field(reg, field, msb, lsb)
311323

324+
delete seen_enum_vals
325+
312326
next
313327
}
314328

@@ -320,6 +334,8 @@ $1 == "EndEnum" && block_current() == "Enum" {
320334
lsb = null
321335
print ""
322336

337+
delete seen_enum_vals
338+
323339
block_pop()
324340
next
325341
}
@@ -329,6 +345,10 @@ $1 == "EndEnum" && block_current() == "Enum" {
329345
val = $1
330346
name = $2
331347

348+
if (val in seen_enum_vals)
349+
fatal("Duplicate Enum value " val " for " name)
350+
seen_enum_vals[val] = 1
351+
332352
define(reg "_" field "_" name, "UL(" val ")")
333353
next
334354
}

0 commit comments

Comments
 (0)