common/recipes-utils/vboot-utils/files/vboot_common.py (79 lines of code) (raw):

#!/usr/bin/env python # Copyright 2020-present Facebook. All Rights Reserved. # # This program file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with this program in a file named COPYING; if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301 USA import mmap import os import sys from pyfdt import pyfdt if sys.version_info[0] == 3: import io else: import StringIO # Define the exit code EC_SUCCESS = 0 EC_SPLROM_BAD = 1 EC_UBOOT_BAD = 2 EC_KERNEL_BAD = 3 EC_ROOTFS_BAD = 4 EC_TPM_EVENT_LOG_BAD = 5 EC_MEASURE_FAIL_BASE = 10 EC_EXCEPTION = 255 VBS_SIZE = 56 VBS_LOCATION = { # VBS SRAM mapping: (addr , size, vbs_offset, vbs_size) "SOC_MODEL_ASPEED_G5": (0x1E720000, 4 * 1024, 0x200, VBS_SIZE), "SOC_MODEL_ASPEED_G6": (0x10015000, 4 * 1024, 0x800, VBS_SIZE), } VBS_ERROR_TYPE_OFFSET = 0x19 VBS_ERROR_CODE_OFFSET = 0x1A def get_fdt(content): # Represent the FIT as an IO resource. if sys.version_info[0] == 3: fit_io = io.BytesIO(content) else: fit_io = StringIO.StringIO(content) dtb = pyfdt.FdtBlobParse(fit_io) fdt = dtb.to_fdt() return fdt def get_fdt_from_file(infile): dtb = pyfdt.FdtBlobParse(infile, blob_limit=0x2000) fdt = dtb.to_fdt() return fdt def get_soc_model(): soc_model = "SOC_MODEL_UNKNOWN" with open("/etc/soc_model", "r") as fn: soc_model = fn.readline() return soc_model.strip() def read_vbs() -> bytearray: memfn = None try: SRAM_OFFSET, SRAM_SIZE, VBS_OFFSET, vbs_data_size = VBS_LOCATION[ get_soc_model() ] memfn = os.open("/dev/mem", os.O_RDWR | os.O_SYNC) with mmap.mmap( memfn, SRAM_SIZE, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=SRAM_OFFSET, ) as sram: sram.seek(VBS_OFFSET) return sram.read(vbs_data_size) finally: if memfn is not None: os.close(memfn) def write_vbs(vbs_data: bytearray): memfn = None SRAM_OFFSET, SRAM_SIZE, VBS_OFFSET, vbs_data_size = VBS_LOCATION[get_soc_model()] assert ( len(vbs_data) == vbs_data_size ), f"vbs_data length {len(vbs_data)} is not {vbs_data_size}" try: memfn = os.open("/dev/mem", os.O_RDWR | os.O_SYNC) with mmap.mmap( memfn, SRAM_SIZE, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=SRAM_OFFSET, ) as sram: sram.seek(VBS_OFFSET) sram.write(vbs_data) finally: if memfn is not None: os.close(memfn)