blob: 48782d02e26808cf712b47a08f609a13a617ff24 [file] [log] [blame]
# 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", {}),
)