config: Change parsing of Addr so hex values work from scripts
authorMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:20 +0000 (07:42 -0400)
committerMitch Hayenga <mitch.hayenga@arm.com>
Wed, 3 Sep 2014 11:42:20 +0000 (07:42 -0400)
When passed from a configuration script with a hexadecimal value (like
"0x80000000"), gem5 would error out. This is because it would call
"toMemorySize" which requires the argument to end with a size specifier (like
1MB, etc).

This modification makes it so raw hex values can be passed through Addr
parameters from the configuration scripts.

src/arch/arm/ArmSystem.py
src/python/m5/params.py

index 39b7ec8fff6c7593146b376ce8d2c397820db33a..a803a251b226ca3d655d8339cc7ff0253977886b 100644 (file)
@@ -65,7 +65,7 @@ class ArmSystem(System):
     highest_el_is_64 = Param.Bool(False,
         "True if the register width of the highest implemented exception level "
         "is 64 bits (ARMv8)")
-    reset_addr_64 = Param.UInt64(0x0,
+    reset_addr_64 = Param.Addr(0x0,
         "Reset address if the highest implemented exception level is 64 bits "
         "(ARMv8)")
     phys_addr_range_64 = Param.UInt8(40,
index 88d38f87ab4e170811fc2d8bb675c1c9f3bdea00..dfc3ede3bd59cdc2e57c46bffeac1e1495e3cc72 100644 (file)
@@ -626,9 +626,17 @@ class Addr(CheckedInt):
             self.value = value.value
         else:
             try:
+                # Often addresses are referred to with sizes. Ex: A device
+                # base address is at "512MB".  Use toMemorySize() to convert
+                # these into addresses. If the address is not specified with a
+                # "size", an exception will occur and numeric translation will
+                # proceed below.
                 self.value = convert.toMemorySize(value)
-            except TypeError:
-                self.value = long(value)
+            except (TypeError, ValueError):
+                # Convert number to string and use long() to do automatic
+                # base conversion (requires base=0 for auto-conversion)
+                self.value = long(str(value), base=0)
+
         self._check()
     def __add__(self, other):
         if isinstance(other, Addr):