arm64/sysreg: Enforce whole word match for open/close tokens
authorJames Clark <james.clark@linaro.org>
Wed, 15 Jan 2025 16:25:56 +0000 (16:25 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 14 Mar 2025 17:54:44 +0000 (17:54 +0000)
Opening and closing tokens can also match on words with common prefixes
like "Endsysreg" vs "EndsysregFields". This could potentially make the
script go wrong in weird ways so make it fall through to the fatal
unhandled statement catcher if it doesn't fully match the current
block.

Closing ones also get expect_fields(1) to ensure nothing other than
whitespace follows.

Signed-off-by: James Clark <james.clark@linaro.org>
Acked-by: Will Deacon <will@kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Link: https://lore.kernel.org/r/20250115162600.2153226-3-james.clark@linaro.org
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/tools/gen-sysreg.awk

index 1a2afc9fdd42e8d450c97890a9040e9cc61b33a8..f2a1732cb1f638960a38729be107b804ec4b6156 100755 (executable)
@@ -111,7 +111,7 @@ END {
 /^$/ { next }
 /^[\t ]*#/ { next }
 
-/^SysregFields/ && block_current() == "Root" {
+$1 == "SysregFields" && block_current() == "Root" {
        block_push("SysregFields")
 
        expect_fields(2)
@@ -127,7 +127,8 @@ END {
        next
 }
 
-/^EndSysregFields/ && block_current() == "SysregFields" {
+$1 == "EndSysregFields" && block_current() == "SysregFields" {
+       expect_fields(1)
        if (next_bit > 0)
                fatal("Unspecified bits in " reg)
 
@@ -145,7 +146,7 @@ END {
        next
 }
 
-/^Sysreg/ && block_current() == "Root" {
+$1 == "Sysreg" && block_current() == "Root" {
        block_push("Sysreg")
 
        expect_fields(7)
@@ -177,7 +178,8 @@ END {
        next
 }
 
-/^EndSysreg/ && block_current() == "Sysreg" {
+$1 == "EndSysreg" && block_current() == "Sysreg" {
+       expect_fields(1)
        if (next_bit > 0)
                fatal("Unspecified bits in " reg)
 
@@ -206,7 +208,7 @@ END {
 
 # Currently this is effectivey a comment, in future we may want to emit
 # defines for the fields.
-(/^Fields/ || /^Mapping/) && block_current() == "Sysreg" {
+($1 == "Fields" || $1 == "Mapping") && block_current() == "Sysreg" {
        expect_fields(2)
 
        if (next_bit != 63)
@@ -224,7 +226,7 @@ END {
 }
 
 
-/^Res0/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Res0" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        expect_fields(2)
        parse_bitdef(reg, "RES0", $2)
        field = "RES0_" msb "_" lsb
@@ -234,7 +236,7 @@ END {
        next
 }
 
-/^Res1/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Res1" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        expect_fields(2)
        parse_bitdef(reg, "RES1", $2)
        field = "RES1_" msb "_" lsb
@@ -244,7 +246,7 @@ END {
        next
 }
 
-/^Unkn/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Unkn" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        expect_fields(2)
        parse_bitdef(reg, "UNKN", $2)
        field = "UNKN_" msb "_" lsb
@@ -254,7 +256,7 @@ END {
        next
 }
 
-/^Field/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Field" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        expect_fields(3)
        field = $3
        parse_bitdef(reg, field, $2)
@@ -265,14 +267,14 @@ END {
        next
 }
 
-/^Raz/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Raz" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        expect_fields(2)
        parse_bitdef(reg, field, $2)
 
        next
 }
 
-/^SignedEnum/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "SignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        block_push("Enum")
 
        expect_fields(3)
@@ -285,7 +287,7 @@ END {
        next
 }
 
-/^UnsignedEnum/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "UnsignedEnum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        block_push("Enum")
 
        expect_fields(3)
@@ -298,7 +300,7 @@ END {
        next
 }
 
-/^Enum/ && (block_current() == "Sysreg" || block_current() == "SysregFields") {
+$1 == "Enum" && (block_current() == "Sysreg" || block_current() == "SysregFields") {
        block_push("Enum")
 
        expect_fields(3)
@@ -310,7 +312,8 @@ END {
        next
 }
 
-/^EndEnum/ && block_current() == "Enum" {
+$1 == "EndEnum" && block_current() == "Enum" {
+       expect_fields(1)
 
        field = null
        msb = null