1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# 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", {}),
)
|