1# Copyright (C) 2021-2022 Intel Corporation.
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5
6import os
7from collections import namedtuple
8
9E820_TYPE_RAM = 1
10E820_TYPE_RESERVED = 2
11E820_TYPE_ACPI = 3
12E820_TYPE_NVS = 4
13E820_TYPE_UNKNOWN = 0xff
14
15name_of_types = {
16    E820_TYPE_RAM: "System RAM",
17    E820_TYPE_RESERVED: "Reserved",
18    E820_TYPE_ACPI: "ACPI Tables",
19    E820_TYPE_NVS: "ACPI Non-volatile Storage",
20    E820_TYPE_UNKNOWN: "Unknown E820 type",
21}
22
23type_of_names = { v: k for (k,v) in name_of_types.items() }
24
25class E820Entry(namedtuple("E820Entry", ["start", "end", "type"])):
26    def __repr__(self):
27        return "{0}(start=0x{1:016x}, end=0x{2:016x}, type='{3}')".format(
28            self.__class__.__name__, self.start, self.end, name_of_types.get(self.type))
29
30sysfs_memmap_path = "/sys/firmware/memmap"
31
32def read_file(path):
33    with open(path, "r") as f:
34        return f.read()
35    return ""
36
37def parse_e820():
38    acc = list()
39
40    for i in os.listdir(sysfs_memmap_path):
41        start = int(read_file(os.path.join(sysfs_memmap_path, i, "start")), base=16)
42        end = int(read_file(os.path.join(sysfs_memmap_path, i, "end")), base=16)
43        type_name = read_file(os.path.join(sysfs_memmap_path, i, "type")).strip()
44        ty = type_of_names.get(type_name, E820_TYPE_UNKNOWN)
45        acc.append(E820Entry(start, end, ty))
46
47    return sorted(acc, key=lambda x: x.start)
48