Skip to content

Commit 17be718

Browse files
committed
Fix function
Signed-off-by: Nathaniel Mitchell <nathaniel.p.mitchell@intel.com>
1 parent 5dff25f commit 17be718

File tree

2 files changed

+41
-116
lines changed

2 files changed

+41
-116
lines changed

chipsec/cfg/parsers/ip/platform.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ def _get_next_level(self, bar_id: str) -> 'Bar':
608608
raise PlatformConfigError(f'Next Level: {bar_id} not found in IP: {self.name}')
609609

610610

611-
class Bar(Recursable, RegisterList):
611+
class Bar(RegisterList):
612612
"""
613613
BAR (Base Address Register) configuration container.
614614
@@ -629,24 +629,24 @@ def __init__(self, name: str, barobj: Any) -> None:
629629
self.name = name
630630
self.obj = barobj
631631

632-
def _get_next_level_list(self) -> List[str]:
633-
"""Get list of register names."""
634-
return list(self.register_list.keys())
632+
# def _get_next_level_list(self) -> List[str]:
633+
# """Get list of register names."""
634+
# return list(self.register_list.keys())
635635

636-
def _get_next_level(self, register_id: str) -> ObjList:
637-
"""
638-
Get next level object (register) by ID.
636+
# def _get_next_level(self, register_id: str) -> ObjList:
637+
# """
638+
# Get next level object (register) by ID.
639639

640-
Args:
641-
register_id: Register identifier
640+
# Args:
641+
# register_id: Register identifier
642642

643-
Returns:
644-
Register object list
643+
# Returns:
644+
# Register object list
645645

646-
Raises:
647-
PlatformConfigError: If register not found
648-
"""
649-
if register_id in self.register_list.keys():
650-
return self.get_register(register_id)
651-
else:
652-
raise PlatformConfigError(f'Register: {register_id} not found in BAR: {self.name}')
646+
# Raises:
647+
# PlatformConfigError: If register not found
648+
# """
649+
# if register_id in self.register_list.keys():
650+
# return self.get_register(register_id)
651+
# else:
652+
# raise PlatformConfigError(f'Register: {register_id} not found in BAR: {self.name}')

chipsec/library/register.py

Lines changed: 23 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,26 @@ def get_list_by_name(self, reg_name: str) -> 'ObjList':
190190
logger().log_verbose(f" Got reg list: {', '.join([reg.name for reg in reglist])}")
191191
return reglist
192192

193+
def _get_matching_registers(self, current_obj: 'Recursable', reg_name: str) -> 'ObjList':
194+
"""
195+
Recursively get all register objects from the current object
196+
197+
Args:
198+
current_obj: The current object to search for registers
199+
reg_name: Name of the register
200+
201+
Returns:
202+
List of register objects matching the name found in the current object and its children
203+
"""
204+
matched_regs = ObjList()
205+
if hasattr(current_obj, 'get_next_levels'):
206+
next_obj_list = current_obj.get_next_levels('*')
207+
for next_obj in next_obj_list:
208+
matched_regs.extend(self._get_matching_registers(next_obj, reg_name))
209+
if hasattr(current_obj, 'get_register_matches'):
210+
matched_regs.extend(current_obj.get_register_matches(reg_name))
211+
return matched_regs
212+
193213
def get_list_by_name_without_scope(self, reg_name: str) -> 'ObjList':
194214
"""
195215
Get register list without scope prefix.
@@ -212,109 +232,14 @@ def get_list_by_name_without_scope(self, reg_name: str) -> 'ObjList':
212232
logger().log_warning("Configuration not initialized")
213233
return result_list
214234

215-
# Use the platform structure to search across all vendors and devices
235+
# Use the platform structure to search across all vendors, IPs and BARs
216236
if hasattr(self.cs.Cfg, 'platform') and self.cs.Cfg.platform:
217237
# Log diagnostic info at debug level
218-
platform = self.cs.Cfg.platform
219-
if hasattr(platform, 'vendor_list') and platform.vendor_list:
220-
vendor_count = len(platform.vendor_list)
221-
logger().log_debug(f"Searching {vendor_count} vendors in platform structure")
222-
223-
# Search through all vendor/device combinations
224-
for vendor_id in platform.vendor_list:
225-
vendor = platform.get_vendor(vendor_id)
226-
227-
# Check if vendor.devices exists
228-
if hasattr(vendor, 'ip_list') and vendor.ip_list:
229-
for ip_id in vendor.ip_list:
230-
ip = vendor.get_ip(ip_id)
231-
232-
if hasattr(ip, 'bar_list') and ip.bar_list:
233-
for bar_id in ip.bar_list:
234-
# Check for registers
235-
bar = ip.get_bar(bar_id)
236-
has_registers = (hasattr(bar, 'register_list') and
237-
bar.register_list)
238-
239-
if has_registers and reg_name in bar.register_list:
240-
# Found the register, add all instances
241-
reg_objects = bar.register_list[reg_name]
242-
logger().log_debug(
243-
f"Found register {reg_name} in {vendor_id}.{ip_id}.{bar_id}")
244-
if isinstance(reg_objects, list):
245-
result_list.extend(reg_objects)
246-
else:
247-
result_list.append(reg_objects)
248-
# Check for registers
249-
has_registers = (hasattr(ip, 'register_list') and
250-
ip.register_list)
251-
252-
if has_registers and reg_name in ip.register_list:
253-
# Found the register, add all instances
254-
reg_objects = ip.register_list[reg_name]
255-
logger().log_debug(
256-
f"Found register {reg_name} in {vendor_id}.{ip_id}")
257-
258-
if isinstance(reg_objects, list):
259-
result_list.extend(reg_objects)
260-
else:
261-
result_list.append(reg_objects)
262-
else:
263-
logger().log_debug("No vendors in platform structure")
238+
plat_obj = self.cs.Cfg.platform
239+
result_list = self._get_matching_registers(plat_obj, reg_name)
264240
else:
265241
logger().log_debug("Platform structure not available")
266242

267-
# If no results found in platform structure, try fallback methods
268-
if not result_list:
269-
logger().log_debug(
270-
f"No results found for {reg_name} in platform structure, trying fallbacks")
271-
272-
# Try different fallback approaches
273-
try:
274-
# First try direct wildcard approach
275-
fallback_result = self.cs.Cfg.get_reglist('*.*.' + reg_name)
276-
if fallback_result:
277-
logger().log_debug(
278-
f"Found {len(fallback_result)} results with '*.*.' fallback")
279-
result_list.extend(fallback_result)
280-
except Exception as e:
281-
logger().log_debug(f"First fallback failed: {str(e)}")
282-
283-
try:
284-
# Second approach: more flexible wildcard pattern
285-
fallback_result = self.cs.Cfg.get_reglist('*.' + reg_name)
286-
if fallback_result:
287-
logger().log_debug(
288-
f"Found {len(fallback_result)} results with '*.' fallback")
289-
result_list.extend(fallback_result)
290-
except Exception as e2:
291-
logger().log_debug(f"Second fallback failed: {str(e2)}")
292-
293-
try:
294-
# Legacy approach: check REGISTERS structure directly
295-
if hasattr(self.cs.Cfg, 'REGISTERS'):
296-
possible_regs = []
297-
298-
# Search through legacy REGISTERS structure
299-
for vid in self.cs.Cfg.REGISTERS.keys():
300-
for dev in self.cs.Cfg.REGISTERS[vid].keys():
301-
if reg_name in self.cs.Cfg.REGISTERS[vid][dev]:
302-
reg_path = f"{vid}.{dev}.{reg_name}"
303-
possible_regs.append(reg_path)
304-
305-
# Get register objects for each path found
306-
for reg_path in possible_regs:
307-
try:
308-
reg_objs = self.cs.Cfg.get_reglist(reg_path)
309-
logger().log_debug(
310-
f"Found register via legacy lookup: {reg_path}")
311-
result_list.extend(reg_objs)
312-
except Exception:
313-
# Ignore errors for individual registers
314-
pass
315-
except Exception as e3:
316-
logger().log_debug(f"All fallbacks failed: {str(e3)}")
317-
318243
# Log summary
319244
if result_list:
320245
logger().log_debug(

0 commit comments

Comments
 (0)