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