Skip to content

Commit 52313d7

Browse files
committed
[security,check_regwen] Add regwen countermeasure check
Signed-off-by: Guillermo Maturana <[email protected]>
1 parent 83fd4eb commit 52313d7

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

util/reggen/ip_block.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44
'''Code representing an IP block for reggen'''
55

6+
import logging as log
67
from typing import Dict, List, Optional, Sequence, Set, Tuple
78

89
import hjson # type: ignore
@@ -622,3 +623,40 @@ def check_cm_annotations(self, rtl_names: Dict[str, List[Tuple[str, int]]],
622623
return CounterMeasure.check_annotation_list(self.name, hjson_path,
623624
rtl_names,
624625
self.countermeasures)
626+
627+
def check_regwens(self) -> bool:
628+
"""Checks all regwens are used in at least one other CSR
629+
630+
This relies on the regwen having the string "REGWEN" in its name.
631+
The uses should be in the "regwen" field of a CSR.
632+
"""
633+
log.debug(f"Checking regwens for IP {self.name}")
634+
status: bool = True
635+
for rb in self.reg_blocks.values():
636+
rb_name = rb.name if rb.name else "default"
637+
log.debug(f"Register block: {rb_name}")
638+
regwen_names: List[str] = [reg.name for reg in rb.registers
639+
if "REGWEN" in reg.name]
640+
unused_regwens: List[str] = []
641+
for regwen in regwen_names:
642+
regwen_users = []
643+
for reg in rb.registers:
644+
if reg.regwen == regwen:
645+
regwen_users.append(reg)
646+
for multi_reg in rb.multiregs:
647+
for reg in multi_reg.regs:
648+
if reg.regwen == regwen:
649+
regwen_users.append(reg)
650+
if not regwen_users:
651+
unused_regwens.append(regwen)
652+
else:
653+
log.debug(
654+
f"Regwen {regwen} in {self.name}'s {rb_name} register "
655+
"block controls the following registers:")
656+
for r in regwen_users:
657+
log.debug(f" {r.name}")
658+
if unused_regwens:
659+
log.error(f"Unused regwen(s) in {self.name} {rb_name} "
660+
f"register block: {', '.join(unused_regwens)}")
661+
status = False
662+
return status

util/topgen.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,7 @@ def _check_countermeasures(completecfg: Dict[str, object],
12631263
log.debug("Checking countermeasures for %s.", name)
12641264
success &= name_to_block[name].check_cm_annotations(
12651265
rtl_names, hjson_path.name)
1266+
success &= name_to_block[name].check_regwens()
12661267
if success:
12671268
log.info("All Hjson declared countermeasures are implemented in RTL.")
12681269
else:
@@ -1614,8 +1615,9 @@ def main():
16141615
# Change verbosity to log.INFO to see an okay confirmation message:
16151616
# the log level is set to log.ERROR upon start to avoid the chatter
16161617
# of the regular topgen elaboration.
1618+
log_level = log.DEBUG if args.verbose else log.INFO
16171619
log.basicConfig(format="%(levelname)s: %(message)s",
1618-
level=log.INFO,
1620+
level=log_level,
16191621
force=True)
16201622

16211623
okay = _check_countermeasures(completecfg, name_to_block,

0 commit comments

Comments
 (0)