board_inspector: a workaround to an incorrect interpretation

The current design of AML parsing, objects are first defined in the
namespace and later dropped if they are in a False branch. This leads to
incorrect interpretation of the AML code where:

  1. A name T is defined in the root scope as an integer.

  2. A method M in an inner scope S references T.

  3. The name T is defined as a device, power resource or other named
     objects in scope S under conditions where M will not be called.

As a workaround, check if both the left and right hand sides are integers
first. If either is not the case,

Tracked-On: #6287
Signed-off-by: Junjie Mao <junjie.mao@intel.com>
This commit is contained in:
Junjie Mao 2021-08-06 15:08:15 +08:00 committed by wenlingz
parent d2543720a5
commit e5ba06cbe8
2 changed files with 20 additions and 2 deletions

View File

@ -399,7 +399,9 @@ class Package(Object):
def to_string(self): def to_string(self):
return "Package" return "Package"
# PowerResource class PowerResource(Object):
def __init__(self, name):
self.name = name
# Processor # Processor

View File

@ -336,6 +336,9 @@ class ConcreteInterpreter(Interpreter):
self.context.register_operation_region(sym.name, op_region) self.context.register_operation_region(sym.name, op_region)
return op_region return op_region
def DefPowerRes(self, tree):
return PowerResource(tree.NameString.value)
# 20.2.5.3 Statement Opcodes Encoding # 20.2.5.3 Statement Opcodes Encoding
def DefBreak(self, tree): def DefBreak(self, tree):
self.to_break = True self.to_break = True
@ -385,7 +388,20 @@ class ConcreteInterpreter(Interpreter):
def __eval_binary_op(self, tree, op): def __eval_binary_op(self, tree, op):
lhs = self.interpret(tree.children[0]) lhs = self.interpret(tree.children[0])
rhs = self.interpret(tree.children[1]) rhs = self.interpret(tree.children[1])
res = Integer(op(lhs.get(), rhs.get())) # FIXME: The current design of AML parsing, objects are first defined in the namespace and later dropped if they
# are in a False branch. This leads to incorrect interpretation of the AML code where:
#
# 1. A name T is defined in the root scope as an integer.
# 2. A method M in an inner scope S references T.
# 3. The name T is defined as a device, power resource or other named objects in scope S under conditions
# where M will not be called.
#
# As a workaround, check if both the left and right hand sides are integers first. If either is not the case,
# the condition is evaluated to False.
if isinstance(lhs, Integer) and isinstance(rhs, Integer):
res = Integer(op(lhs.get(), rhs.get()))
else:
res = Integer(0)
if len(tree.children) >= 3: if len(tree.children) >= 3:
target = self.interpret(tree.children[2]) target = self.interpret(tree.children[2])
if target: if target: