# Copyright 2020 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Architecture-specific information.""" import collections import json class Arch( collections.namedtuple( "Arch", [ "arch_nr", "arch_name", "bits", "syscalls", "constants", "syscall_groups", ], ) ): """Holds architecture-specific information.""" def truncate_word(self, value): """Return the value truncated to fit in a word.""" return value & self.max_unsigned @property def min_signed(self): """The smallest signed value that can be represented in a word.""" return -(1 << (self.bits - 1)) @property def max_unsigned(self): """The largest unsigned value that can be represented in a word.""" return (1 << self.bits) - 1 @staticmethod def load_from_json(json_path): """Return an Arch from a .json file.""" with open(json_path, "rb") as json_file: return Arch.load_from_json_bytes(json_file.read()) @staticmethod def load_from_json_bytes(json_bytes): """Return an Arch from a json string.""" constants = json.loads(json_bytes) return Arch( arch_nr=constants["arch_nr"], arch_name=constants["arch_name"], bits=constants["bits"], syscalls=constants["syscalls"], constants=constants["constants"], syscall_groups=constants.get("syscall_groups", {}), )