You've already forked Openness-Score
mirror of
https://github.com/Dasharo/Openness-Score.git
synced 2026-03-06 14:54:49 -08:00
1495 lines
204 KiB
HTML
1495 lines
204 KiB
HTML
|
|
|
|
<!DOCTYPE html>
|
|
<html class="writer-html5" lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>coreboot — Dasharo Openness Score v0.1.0 documentation</title>
|
|
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
|
|
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=e59714d7" />
|
|
|
|
|
|
<script src="../_static/jquery.js?v=5d32c60e"></script>
|
|
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
|
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js?v=82621e7c"></script>
|
|
<script src="../_static/doctools.js?v=888ff710"></script>
|
|
<script src="../_static/sphinx_highlight.js?v=4825356b"></script>
|
|
<script src="../_static/js/theme.js"></script>
|
|
<link rel="index" title="Index" href="../genindex.html" />
|
|
<link rel="search" title="Search" href="../search.html" />
|
|
</head>
|
|
|
|
<body class="wy-body-for-nav">
|
|
<div class="wy-grid-for-nav">
|
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
<div class="wy-side-scroll">
|
|
<div class="wy-side-nav-search" >
|
|
|
|
|
|
|
|
<a href="../index.html" class="icon icon-home">
|
|
Dasharo Openness Score
|
|
</a>
|
|
<div role="search">
|
|
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
|
|
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
|
|
<input type="hidden" name="check_keywords" value="yes" />
|
|
<input type="hidden" name="area" value="default" />
|
|
</form>
|
|
</div>
|
|
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
|
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
|
<ul>
|
|
<li class="toctree-l1"><a class="reference internal" href="../methodology.html">Dasharo Openness Score methodology</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../design.html">Dasharo Openness Score design</a></li>
|
|
<li class="toctree-l1"><a class="reference internal" href="../modules.html">Dasharo Openness Score modules documentation</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
|
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
|
<a href="../index.html">Dasharo Openness Score</a>
|
|
</nav>
|
|
|
|
<div class="wy-nav-content">
|
|
<div class="rst-content">
|
|
<div role="navigation" aria-label="Page navigation">
|
|
<ul class="wy-breadcrumbs">
|
|
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
|
<li class="breadcrumb-item"><a href="index.html">Module code</a></li>
|
|
<li class="breadcrumb-item active">coreboot</li>
|
|
<li class="wy-breadcrumbs-aside">
|
|
</li>
|
|
</ul>
|
|
<hr/>
|
|
</div>
|
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
|
<div itemprop="articleBody">
|
|
|
|
<h1>Source code for coreboot</h1><div class="highlight"><pre>
|
|
<span></span><span class="c1"># SPDX-FileCopyrightText: 2023 3mdeb <contact@3mdeb.com></span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># SPDX-License-Identifier: MIT</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">matplotlib.pyplot</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">plt</span>
|
|
|
|
<span class="sd">"""This module is responsible for parsing coreboot images"""</span>
|
|
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">DasharoCorebootImage</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""DasharoCorebootImage class</span>
|
|
|
|
<span class="sd"> The main class representing a coreboot-based firmware image</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">debug</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="n">region_patterns</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="sa">r</span><span class="s2">"'(?P<region>\w+?)' "</span><span class="p">,</span>
|
|
<span class="sa">r</span><span class="s2">"\((?P<attribute>(read-only, |preserve, |CBFS, ){0,1}?)"</span><span class="p">,</span>
|
|
<span class="sa">r</span><span class="s2">"size (?P<size>\d+?), offset (?P<offset>\d+?)\)"</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""Set of regular expressions used to extract the flashmap regions"""</span>
|
|
|
|
<span class="n">region_regexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">region_patterns</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="sd">"""Regular expression variable used to extract the flashmap regions"""</span>
|
|
|
|
<span class="n">ifdtool_pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">'^FLREG(?P<id>\d+):\s+(?P<reg_val>0x[0-9a-fA-F]+)\s*?\n\s+Flash Region \d+ \((?P<name>.+?)\): (?P<start>[0-9a-fA-F]+) - (?P<end>[0-9a-fA-F]+)(?: \((?P<status>unused)\))?'</span>
|
|
<span class="n">ifdtool_regexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">ifdtool_pattern</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Regions to consider as data, they should not contain any code ever.</span>
|
|
<span class="c1"># Some of the regions are used only by certain platforms and may not be met</span>
|
|
<span class="c1"># on Dasharo builds.</span>
|
|
<span class="n">DATA_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'SI_DESC'</span><span class="p">,</span> <span class="s1">'RECOVERY_MRC_CACHE'</span><span class="p">,</span> <span class="s1">'RW_MRC_CACHE'</span><span class="p">,</span> <span class="s1">'RW_VPD'</span><span class="p">,</span>
|
|
<span class="s1">'SMMSTORE'</span><span class="p">,</span> <span class="s1">'SHARED_DATA'</span><span class="p">,</span> <span class="s1">'VBLOCK_DEV'</span><span class="p">,</span> <span class="s1">'RW_NVRAM'</span><span class="p">,</span>
|
|
<span class="s1">'CONSOLE'</span><span class="p">,</span> <span class="s1">'RW_FWID_A'</span><span class="p">,</span> <span class="s1">'RW_FWID_B'</span><span class="p">,</span> <span class="s1">'VBLOCK_A'</span><span class="p">,</span> <span class="s1">'RO_VPD'</span><span class="p">,</span>
|
|
<span class="s1">'VBLOCK_B'</span><span class="p">,</span> <span class="s1">'HSPHY_FW'</span><span class="p">,</span> <span class="s1">'RW_ELOG'</span><span class="p">,</span> <span class="s1">'FMAP'</span><span class="p">,</span> <span class="s1">'RO_FRID'</span><span class="p">,</span>
|
|
<span class="s1">'RO_FRID_PAD'</span><span class="p">,</span> <span class="s1">'SPD_CACHE'</span><span class="p">,</span> <span class="s1">'FPF_STATUS'</span><span class="p">,</span> <span class="s1">'RO_LIMITS_CFG'</span><span class="p">,</span>
|
|
<span class="s1">'RW_DDR_TRAINING'</span><span class="p">,</span> <span class="s1">'GBB'</span><span class="p">,</span> <span class="s1">'BOOTORDER'</span><span class="p">,</span> <span class="s1">'RESERVED'</span><span class="p">,</span> <span class="s1">'BPA'</span><span class="p">,</span>
|
|
<span class="s1">'ROMHOLE'</span><span class="p">,</span> <span class="s1">'SI_GBE'</span><span class="p">,</span> <span class="s1">'RO_GSCVD'</span><span class="p">,</span> <span class="s1">'RW_VAR_MRC_CACHE'</span> <span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names known to contain data"""</span>
|
|
|
|
<span class="n">IFD_DATA_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Flash Descriptor'</span><span class="p">,</span> <span class="s1">'Platform Data'</span><span class="p">,</span> <span class="s1">'GbE'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of IFD regions known to contain data"""</span>
|
|
|
|
<span class="c1"># Regions that are not CBFSes and may contain open-source code</span>
|
|
<span class="c1"># Their whole size is counted as code.</span>
|
|
<span class="n">CODE_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'BOOTBLOCK'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names known to contain open-source code"""</span>
|
|
|
|
<span class="c1"># Regions that may contain code but in closed-source binary form</span>
|
|
<span class="c1"># HSPHY_FW does not belong here, because it is part of ME which counts</span>
|
|
<span class="c1"># as closed-source binary blob as a whole.</span>
|
|
<span class="n">BLOB_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'RW_VBIOS_CACHE'</span><span class="p">,</span> <span class="s1">'ME_RW_A'</span><span class="p">,</span> <span class="s1">'ME_RW_B'</span><span class="p">,</span> <span class="s1">'IFWI'</span><span class="p">,</span> <span class="s1">'SI_ME'</span><span class="p">,</span>
|
|
<span class="s1">'SIGN_CSE'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names known to contain closed-source code"""</span>
|
|
|
|
<span class="n">IFD_BLOB_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Intel ME'</span><span class="p">,</span> <span class="s1">'IE'</span><span class="p">,</span> <span class="s1">'PTT'</span><span class="p">,</span> <span class="s1">'10GbE_0'</span><span class="p">,</span> <span class="s1">'10GbE_1'</span><span class="p">,</span> <span class="s1">'EC'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of closed-source code IFD regions"""</span>
|
|
|
|
<span class="c1"># Regions to not account for in calculations.</span>
|
|
<span class="c1"># These are containers aggregating smaller regions.</span>
|
|
<span class="n">SKIP_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'RW_MISC'</span><span class="p">,</span> <span class="s1">'UNIFIED_MRC_CACHE'</span><span class="p">,</span> <span class="s1">'RW_SHARED'</span><span class="p">,</span> <span class="s1">'SI_ALL'</span><span class="p">,</span>
|
|
<span class="s1">'RW_SECTION_A'</span><span class="p">,</span> <span class="s1">'RW_SECTION_B'</span><span class="p">,</span> <span class="s1">'WP_RO'</span><span class="p">,</span> <span class="s1">'RO_SECTION'</span><span class="p">,</span>
|
|
<span class="s1">'SI_BIOS'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names known to be containers or aliases of other</span>
|
|
<span class="sd"> regions. These regions are skipped from classification."""</span>
|
|
|
|
<span class="c1"># Regions to not account for in calculations when ifdtool is used.</span>
|
|
<span class="c1"># These regions will be classified based on their presence in IFD.</span>
|
|
<span class="n">IFD_SKIP_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'SI_DESC'</span><span class="p">,</span> <span class="s1">'SI_ME'</span><span class="p">,</span> <span class="s1">'SI_GBE'</span><span class="p">,</span> <span class="s1">'SI_PDR'</span><span class="p">,</span> <span class="s1">'SI_EC'</span><span class="p">,</span>
|
|
<span class="s1">'SI_DEVICEEXT'</span><span class="p">,</span> <span class="s1">'SI_BIOS2'</span><span class="p">,</span> <span class="s1">'SI_DEVICEEXT2'</span><span class="p">,</span>
|
|
<span class="s1">'SI_IE'</span><span class="p">,</span> <span class="s1">'SI_10GBE0'</span><span class="p">,</span> <span class="s1">'SI_10GBE1'</span><span class="p">,</span> <span class="s1">'SI_PTT'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names to be skipped when ifdtool is used.</span>
|
|
<span class="sd"> These regions willbe classified by IFD region purpose."""</span>
|
|
|
|
<span class="c1"># Regions to count as empty/unused</span>
|
|
<span class="n">EMPTY_REGIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'UNUSED'</span><span class="p">,</span> <span class="s1">'RW_UNUSED'</span><span class="p">,</span> <span class="s1">'SI_DEVICEEXT2'</span><span class="p">,</span> <span class="s1">'UNUSED_HOLE'</span><span class="p">,</span>
|
|
<span class="s1">'BIOS_UNUSABLE'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of region names known to be empty spaces, e.g. between IFD</span>
|
|
<span class="sd"> regions."""</span>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.__init__"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.__init__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image_path</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">microarch</span><span class="o">=</span><span class="s2">""</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""DasharoCorebootImage class init method</span>
|
|
|
|
<span class="sd"> Initializes the class fields for storing the firmware image components</span>
|
|
<span class="sd"> classified to specific groups. Also calls</span>
|
|
<span class="sd"> :meth:`~coreboot.DasharoCorebootImage._parse_cb_fmap_layout` and</span>
|
|
<span class="sd"> :meth:`~coreboot.DasharoCorebootImage._calculate_metrics` methods to</span>
|
|
<span class="sd"> parse the image and calculate the metrics.</span>
|
|
|
|
<span class="sd"> :param image_path: Path the the firmware image file being parsed.</span>
|
|
<span class="sd"> :type image_path: str</span>
|
|
<span class="sd"> :param verbose: Optional parameter to turn on debug information during</span>
|
|
<span class="sd"> the image parsing, defaults to False</span>
|
|
<span class="sd"> :type verbose: bool, optional</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_path</span> <span class="o">=</span> <span class="n">image_path</span>
|
|
<span class="w"> </span><span class="sd">"""Path to the image represented by DasharoCorebootImage class"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">microarch</span> <span class="o">=</span> <span class="n">microarch</span>
|
|
<span class="w"> </span><span class="sd">"""CPU michroarchitecture supported by the firmware binary to be passed to ifdtool.</span>
|
|
<span class="sd"> For a complete list of supported microarchitectures, use 'ifdtool -h'.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_size</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getsize</span><span class="p">(</span><span class="n">image_path</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="sd">"""Image size in bytes"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="w"> </span><span class="sd">"""A dictionary holding the coreboot image flashmap regions"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="w"> </span><span class="sd">"""A dictionary holding regions found by ifdtool"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding the regions with CBFS"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of flashmap regions"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of regions found by ifdtool"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_cbfses</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of flashmap regions containing CBFSes"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as open-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as closed-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as empty"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_regions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding flashmap regions filled with open-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding flashmap regions filled with closed-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_regions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding flashmap regions filled with data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_regions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding empty flashmap regions"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions_ifdtool</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding ifdtool regions filled with closed-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_regions_ifdtool</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding ifdtool regions filled with data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_regions_ifdtool</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding empty ifdtool regions"""</span>
|
|
<span class="c1"># This type of regions will be counted as closed-source at the end of</span>
|
|
<span class="c1"># metrics calculation. Keep them in separate array to export them into</span>
|
|
<span class="c1"># CSV later for review.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding flashmap regions that could not be classified.</span>
|
|
<span class="sd"> Counted as closed-source code at the end of calculation process.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions_ifdtool</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding ifdtool regions that could not be classified.</span>
|
|
<span class="sd"> Counted as closed-source code at the end of calculation process.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="n">verbose</span>
|
|
<span class="w"> </span><span class="sd">"""Used to enable verbose debug output from the parsing process"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="w"> </span><span class="sd">"""Boolean vlaue if Intel Flash Descriptor has been detected in</span>
|
|
<span class="sd"> the image by ifdtool"""</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_parse_cb_fmap_layout</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="nb">bool</span><span class="p">(</span><span class="n">microarch</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_parse_ifdtool_regions</span><span class="p">(</span><span class="n">microarch</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_calculate_metrics</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.__len__"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.__len__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns the length of the coreboot firmware image</span>
|
|
|
|
<span class="sd"> :return: Length of the firmware binary file</span>
|
|
<span class="sd"> :rtype: int</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_size</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.__repr__"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.__repr__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""DasharoCorebootImage class representation</span>
|
|
|
|
<span class="sd"> :return: class representation</span>
|
|
<span class="sd"> :rtype: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s1">'DasharoCorebootImage()'</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.__str__"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.__str__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns string representation of the firmware image</span>
|
|
|
|
<span class="sd"> Prints the firmware image statistics.</span>
|
|
|
|
<span class="sd"> :return: DasharoCorebootImage string representation</span>
|
|
<span class="sd"> :rtype: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s1">'Dasharo image </span><span class="si">%s</span><span class="s1">:</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Image size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Number of regions: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Number of CBFSes: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Total open-source code size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Total closed-source code size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Total data size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Total empty size: </span><span class="si">%d</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_cbfses</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._region_is_cbfs"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._region_is_cbfs">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_region_is_cbfs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">region</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Checks if given region has a CBFS attribute</span>
|
|
|
|
<span class="sd"> :param region: Flashmap region entry from dictionary</span>
|
|
<span class="sd"> :type region: dict</span>
|
|
<span class="sd"> :return: True if regions contains CBFS attribute, false otherwise.</span>
|
|
<span class="sd"> :rtype: bool</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">region</span><span class="p">[</span><span class="s1">'attributes'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'CBFS'</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._parse_cb_fmap_layout"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._parse_cb_fmap_layout">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_parse_cb_fmap_layout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Parses the cbfstool flashmap layout output</span>
|
|
|
|
<span class="sd"> Parses the output of 'cbfstool self.image_path layout -w' and extract</span>
|
|
<span class="sd"> the flashmap regions to a self.fmap_regions dictionary using the</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.region_regexp` regular</span>
|
|
<span class="sd"> expression.</span>
|
|
|
|
<span class="sd"> If a flashmap region has a CBFS attribute, the self.cbfs_images list</span>
|
|
<span class="sd"> is appended with a new instance of :class:`coreboot.CBFSImage`.</span>
|
|
|
|
<span class="sd"> If :attr:`coreboot.DasharoCorebootImage.debug` is True, all flashmap</span>
|
|
<span class="sd"> regions with their attributes are printed on the console at the end.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'cbfstool'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span> <span class="s1">'layout'</span><span class="p">,</span> <span class="s1">'-w'</span><span class="p">]</span>
|
|
<span class="n">layout</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">region_regexp</span><span class="p">,</span> <span class="n">layout</span><span class="o">.</span><span class="n">stdout</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'name'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'region'</span><span class="p">),</span>
|
|
<span class="s1">'offset'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'offset'</span><span class="p">)),</span>
|
|
<span class="s1">'size'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'size'</span><span class="p">)),</span>
|
|
<span class="s1">'attributes'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'attribute'</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">', '</span><span class="p">),</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_region_is_cbfs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">]):</span>
|
|
<span class="n">cbfs</span> <span class="o">=</span> <span class="n">CBFSImage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">],</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cbfs</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_cbfses</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">cbfs</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Dasharo image regions:'</span><span class="p">)</span>
|
|
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">)]</span></div>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_validate_fmap_layout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">hole_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="c1"># If the first region does not start at address zero and we use</span>
|
|
<span class="c1"># ifdtool it is likely that FMAP starts with BIOS region and</span>
|
|
<span class="c1"># ifdtool will handle it. However, if there is no descriptor</span>
|
|
<span class="c1"># found, this space will be added as closed-source later.</span>
|
|
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span>
|
|
|
|
<span class="c1"># Skip containers as they may have bigger size than offset of the</span>
|
|
<span class="c1"># next region. Exception: FMAP is always read-only but is not a</span>
|
|
<span class="c1"># container.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'attributes'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'read-only'</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'name'</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'FMAP'</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
|
|
<span class="n">offset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'size'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]:</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'ERROR: Broken FMAP layout!</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'End of </span><span class="si">%s</span><span class="s1"> region in the middle of </span><span class="si">%s</span><span class="s1"> region</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'name'</span><span class="p">],</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'name'</span><span class="p">])</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: FMAP layout is not contiguous.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'The space between region </span><span class="si">%s</span><span class="s1"> and </span><span class="si">%s</span><span class="s1"> is not described'</span>
|
|
<span class="s1">' in the FMAP layout and will be classified as '</span>
|
|
<span class="s1">'closed-source.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'name'</span><span class="p">],</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'name'</span><span class="p">]))</span>
|
|
<span class="n">hole_size</span> <span class="o">+=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span> <span class="o">-</span> <span class="n">offset</span><span class="p">)</span>
|
|
<span class="c1"># Reset the offset to detect more non-contiguous regions</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span>
|
|
|
|
<span class="n">offset</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'size'</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: The last region (</span><span class="si">%s</span><span class="s1">) offset + size is not equal '</span>
|
|
<span class="s1">'the image size and will be classified as closed-source.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="s1">'name'</span><span class="p">])</span>
|
|
|
|
<span class="k">return</span> <span class="n">hole_size</span>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._parse_ifdtool_regions"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._parse_ifdtool_regions">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_parse_ifdtool_regions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">microarch</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Parses `ifdtool --dump` output</span>
|
|
<span class="sd"> Extracts IFD regions to the `self.ifdtool_regions` dictionary</span>
|
|
<span class="sd"> using the `coreboot.DasharoCorebootImage.ifdtool_regexp` regular expression.</span>
|
|
<span class="sd"> If `coreboot.DasharoCorebootImage.debug` is True, all IFD regions with their</span>
|
|
<span class="sd"> attributes are printed on the console at the end.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Using ifdtool to detect Intel flash regions'</span><span class="p">)</span>
|
|
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'ifdtool'</span><span class="p">,</span> <span class="s1">'-p'</span><span class="p">,</span> <span class="n">microarch</span><span class="p">,</span> <span class="s1">'-d'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">]</span>
|
|
<span class="n">output</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span> <span class="p">(</span><span class="s1">'ERROR: ifdtool returned an error, assuming no flash descriptor in the image'</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="s1">'No Flash Descriptor found in this image'</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">stdout</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span> <span class="p">(</span><span class="s1">'No Flash Descriptor found in this image or ifdtool'</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regexp</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">stdout</span><span class="p">):</span>
|
|
<span class="c1"># Do not add regions marked as unused or if region value is invalid (0xffffffff)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'status'</span><span class="p">))</span> <span class="ow">and</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'reg_val'</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span> <span class="o">!=</span> <span class="mh">0xffffffff</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'id'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'id'</span><span class="p">)),</span>
|
|
<span class="s1">'reg_val'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'reg_val'</span><span class="p">),</span> <span class="mi">16</span><span class="p">),</span>
|
|
<span class="s1">'name'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'name'</span><span class="p">),</span>
|
|
<span class="s1">'start'</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"0x</span><span class="si">{</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'start'</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
|
|
<span class="s1">'end'</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"0x</span><span class="si">{</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'end'</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
<span class="n">start_int</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">][</span><span class="s1">'start'</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
|
|
<span class="n">end_int</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">][</span><span class="s1">'end'</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">][</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">=</span> <span class="n">end_int</span> <span class="o">-</span> <span class="n">start_int</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'IFD regions:'</span><span class="p">)</span>
|
|
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">)]</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._classify_ifdtool_region"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._classify_ifdtool_region">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_classify_ifdtool_region</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">region</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Classifies the IFD regions into basic categories</span>
|
|
|
|
<span class="sd"> Each region is being classified into 3 basic categories and appended</span>
|
|
<span class="sd"> to respective lists.</span>
|
|
|
|
<span class="sd"> `coreboot.DasharoCorebootImage.closed_code_regions_ifdtool` are appended</span>
|
|
<span class="sd"> with regions found in `coreboot.DasharoCorebootImage.IFD_BLOB_REGIONS`</span>
|
|
|
|
<span class="sd"> `coreboot.DasharoCorebootImage.data_regions_ifdtool` are appended</span>
|
|
<span class="sd"> with regions found in `coreboot.DasharoCorebootImage.IFD_DATA_REGIONS`</span>
|
|
|
|
<span class="sd"> `coreboot.DasharoCorebootImage.empty_regions_ifdtool` are appended</span>
|
|
<span class="sd"> with regions that are detected to be empty using</span>
|
|
<span class="sd"> `coreboot.DasharoCorebootImage._is_empty`</span>
|
|
|
|
<span class="sd"> Any other unrecognized region falls into</span>
|
|
<span class="sd"> `coreboot.DasharoCorebootImage.uncategorized_regions_ifdtool` list which</span>
|
|
<span class="sd"> will be counted as closed-source code region because we were unable to</span>
|
|
<span class="sd"> identify what can be inside.</span>
|
|
|
|
<span class="sd"> :param region: IFD region entry from dictionary</span>
|
|
<span class="sd"> :type region: dict</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_empty</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s2">"start"</span><span class="p">],</span> <span class="mi">16</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s2">"end"</span><span class="p">],</span><span class="mi">16</span><span class="p">)):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_regions_ifdtool</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="n">region</span><span class="p">[</span><span class="s2">"name"</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">IFD_BLOB_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions_ifdtool</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s2">"name"</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">IFD_DATA_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_regions_ifdtool</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s2">"name"</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"BIOS"</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions_ifdtool</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._is_empty"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._is_empty">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_is_empty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Checks if a flash region is empty, where empty is defined as filled with 0x00 or 0xFF bytes.</span>
|
|
<span class="sd"> </span>
|
|
<span class="sd"> :param: start: Start address of the region</span>
|
|
<span class="sd"> :type start: int</span>
|
|
<span class="sd"> :param end: End address of the region</span>
|
|
<span class="sd"> :type end: int</span>
|
|
|
|
<span class="sd"> :rtype: bool</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
<span class="n">f</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
|
|
<span class="n">region_data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">b</span> <span class="ow">in</span> <span class="p">(</span><span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">region_data</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._classify_region"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._classify_region">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_classify_region</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">region</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Classifies the flashmap regions into basic categories</span>
|
|
|
|
<span class="sd"> Each detected flashmap region is being classified into 4 basic</span>
|
|
<span class="sd"> categories and appended to respective lists. CBFS regions are</span>
|
|
<span class="sd"> processed separately and not included here.</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.open_code_regions` are appended</span>
|
|
<span class="sd"> with flashmap regions which name is found in</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.CODE_REGIONS`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.closed_code_regions` are appended</span>
|
|
<span class="sd"> with flashmap regions which name is found in</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.BLOB_REGIONS`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.empty_regions` are appended with</span>
|
|
<span class="sd"> flashmap regions which name is found in</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.EMPTY_REGIONS`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.data_regions` are appended with</span>
|
|
<span class="sd"> flashmap regions which name is found in</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.DATA_REGIONS`</span>
|
|
|
|
<span class="sd"> Flashmap regions which names is found in</span>
|
|
<span class="sd"> :const:`coreboot.DasharoCorebootImage.SKIP_REGIONS` are not classified</span>
|
|
<span class="sd"> due to being cotnainers or aliases to other regions. Counting them</span>
|
|
<span class="sd"> would result in duplication of the sizes when calculating metrics.</span>
|
|
|
|
<span class="sd"> Any other unrecognized flashmap region falls into</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.data_regions` list which will be</span>
|
|
<span class="sd"> counted as closed-source code region because we were unable to</span>
|
|
<span class="sd"> identify what can be inside.</span>
|
|
|
|
<span class="sd"> :param region: Flashmap region entry from dictionary</span>
|
|
<span class="sd"> :type region: dict</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_region_is_cbfs</span><span class="p">(</span><span class="n">region</span><span class="p">):</span>
|
|
<span class="c1"># Skip CBFSes because they have separate class and methods to</span>
|
|
<span class="c1"># calculate metrics</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span> <span class="ow">and</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">IFD_SKIP_REGIONS</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">SKIP_REGIONS</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">CODE_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_regions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">BLOB_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">EMPTY_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_regions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">DATA_REGIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_regions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">region</span><span class="p">[</span><span class="s1">'attributes'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'read-only'</span><span class="p">:</span>
|
|
<span class="c1"># Regions with read-only attribute are containers. Skip them. The</span>
|
|
<span class="c1"># FMAP region is an exception and there may be more, so keep this</span>
|
|
<span class="c1"># IF branch at the very end.</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: Skipped </span><span class="si">%s</span><span class="s1"> region, suspected to be a container'</span>
|
|
<span class="o">%</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">])</span>
|
|
<span class="k">return</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">region</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._calculate_metrics"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._calculate_metrics">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_metrics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Calculates the sizes of the four basic firmware components</span>
|
|
<span class="sd"> categories</span>
|
|
|
|
<span class="sd"> Calls :meth:`~coreboot.DasharoCorebootImage._classify_region` for each</span>
|
|
<span class="sd"> detected region. The sums the regions sizes from all 5 lists</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.open_code_regions` sizes sum is</span>
|
|
<span class="sd"> added to :attr:`coreboot.DasharoCorebootImage.open_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.closed_code_regions` sizes sum is</span>
|
|
<span class="sd"> added to :attr:`coreboot.DasharoCorebootImage.closed_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.data_regions` sizes sum is added</span>
|
|
<span class="sd"> to :attr:`coreboot.DasharoCorebootImage.data_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.empty_regions` sizes sum is added</span>
|
|
<span class="sd"> to :attr:`coreboot.DasharoCorebootImage.empty_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.uncategorized_regions` sizes sum</span>
|
|
<span class="sd"> is added to :attr:`coreboot.DasharoCorebootImage.closed_code_size`</span>
|
|
|
|
<span class="sd"> Additionally for each detected CBFS region their four basic</span>
|
|
<span class="sd"> component's categories are also added to the total metrics.</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.open_code_size` is added to</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.open_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.closed_code_size` is added to</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.closed_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.data_size` is added to</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.data_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.empty_size` is added to</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.empty_size`</span>
|
|
|
|
<span class="sd"> At the end the method calls</span>
|
|
<span class="sd"> :meth:`coreboot.DasharoCorebootImage._normalize_sizes`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_classify_region</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
|
|
|
<span class="n">fmap_hole</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_validate_fmap_layout</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">fmap_hole</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="n">fmap_hole</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_ifdtool_regions</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_classify_ifdtool_region</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ifdtool_regions</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_regions</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions_ifdtool</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_regions</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_regions_ifdtool</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">empty_regions</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">empty_regions_ifdtool</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions_ifdtool</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'INFO: Found </span><span class="si">%d</span><span class="s1"> uncategorized regions of total size </span><span class="si">%d</span><span class="s1"> bytes'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="p">)))</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_regions</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_cbfses</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">open_code_size</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">closed_code_size</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">data_size</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">empty_size</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_normalize_sizes</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._sum_sizes"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._sum_sizes">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">regions</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Sums the size of the regions</span>
|
|
|
|
<span class="sd"> :param regions: Dictionary of regions to sum</span>
|
|
<span class="sd"> :type regions: dict</span>
|
|
<span class="sd"> :return: Sum of the region sizes</span>
|
|
<span class="sd"> :rtype: int</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">regions</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._normalize_sizes"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._normalize_sizes">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_normalize_sizes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Checks if all firmware image components sizes sum up to whole image</span>
|
|
<span class="sd"> size</span>
|
|
|
|
<span class="sd"> This method acts as a safety check if there was no error during</span>
|
|
<span class="sd"> parsing and classification. Additionally it verifies whether the</span>
|
|
<span class="sd"> flashmap starts right at offset zero. It may happen that the flashmap</span>
|
|
<span class="sd"> does not start at offset zero, which is possible for Intel board</span>
|
|
<span class="sd"> coreboot images without IFD and ME regions specified. In such case the</span>
|
|
<span class="sd"> missing regions are counted as closed-source and added to</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.closed_code_size`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># It may happen that the FMAP does not cover whole flash size and the</span>
|
|
<span class="c1"># first region will start with non-zero offset. Check if first region</span>
|
|
<span class="c1"># offset is zero, if not count all bytes from the start of flash to the</span>
|
|
<span class="c1"># start of first region as closed source. This is only done if ifdtool</span>
|
|
<span class="c1"># is not used or IFD was not found, because ifdtool will always parse</span>
|
|
<span class="c1"># those regions correctly.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fmap_regions</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">]</span>
|
|
|
|
<span class="c1"># Final check if all sizes are summing up to whole image size</span>
|
|
<span class="n">full_size</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">])</span>
|
|
<span class="k">if</span> <span class="n">full_size</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: Something went wrong.</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'The component sizes do not sum up to the image size. '</span>
|
|
<span class="s1">'</span><span class="si">%d</span><span class="s1"> != </span><span class="si">%d</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">full_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._get_percentage"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._get_percentage">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_get_percentage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Helper function to generate code share percentage</span>
|
|
|
|
<span class="sd"> :param metric: The size of open-source or closed-source code</span>
|
|
<span class="sd"> :type metric: int</span>
|
|
<span class="sd"> :return: Percentage share of given metric compared to the sum of</span>
|
|
<span class="sd"> open-source and closed-source code size.</span>
|
|
<span class="sd"> :rtype: int</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">metric</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._export_regions_md"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._export_regions_md">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_export_regions_md</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">regions</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Write flashmap regions for given category to the markdown file</span>
|
|
|
|
<span class="sd"> :param file: Markdown file handle to write the regions's info to</span>
|
|
<span class="sd"> :type file: file</span>
|
|
<span class="sd"> :param regions: Dictionary containing regions to be written to the</span>
|
|
<span class="sd"> markdown file.</span>
|
|
<span class="sd"> :type regions: dict</span>
|
|
<span class="sd"> :param category: Category of the regions to be written to the markdown</span>
|
|
<span class="sd"> file. Should be one of: open-source, closed-source,</span>
|
|
<span class="sd"> data, empty.</span>
|
|
<span class="sd"> :type category: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">region</span> <span class="ow">in</span> <span class="n">regions</span><span class="p">:</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> |</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="nb">hex</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s1">'offset'</span><span class="p">]),</span>
|
|
<span class="nb">hex</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]),</span> <span class="n">category</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage._export_ifdtool_regions_md"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage._export_ifdtool_regions_md">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_export_ifdtool_regions_md</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">regions</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Write IFD regions for given category to the markdown file</span>
|
|
|
|
<span class="sd"> :param file: Markdown file handle to write the regions's info to</span>
|
|
<span class="sd"> :type file: file</span>
|
|
<span class="sd"> :param regions: Dictionary containing regions to be written to the</span>
|
|
<span class="sd"> markdown file.</span>
|
|
<span class="sd"> :type regions: dict</span>
|
|
<span class="sd"> :param category: Category of the regions to be written to the markdown</span>
|
|
<span class="sd"> file. Should be one of: open-source, closed-source,</span>
|
|
<span class="sd"> data, empty.</span>
|
|
<span class="sd"> :type category: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">region</span> <span class="ow">in</span> <span class="n">regions</span><span class="p">:</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> |</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">region</span><span class="p">[</span><span class="s1">'start'</span><span class="p">],</span> <span class="n">region</span><span class="p">[</span><span class="s1">'end'</span><span class="p">],</span>
|
|
<span class="nb">hex</span><span class="p">(</span><span class="n">region</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]),</span> <span class="n">category</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.export_markdown"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.export_markdown">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">export_markdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">mkdocs</span><span class="p">,</span> <span class="n">version</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Opens a file and saves the openness report in markdown format</span>
|
|
|
|
<span class="sd"> Saves the parsed information and classified image components into a</span>
|
|
<span class="sd"> markdown file. Also for each CBFS in</span>
|
|
<span class="sd"> :attr:`coreboot.DasharoCorebootImage.cbfs_images` it calls</span>
|
|
<span class="sd"> :meth:`coreboot.CBFSImage.export_markdown` to save the CBFS region</span>
|
|
<span class="sd"> statistics.</span>
|
|
|
|
<span class="sd"> :param file: Path to markdown file</span>
|
|
<span class="sd"> :type file: str</span>
|
|
<span class="sd"> :param mkdocs: Switch to export the report for mkdocs</span>
|
|
<span class="sd"> :type mkdocs: bool</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">md</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">mkdocs</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'# Dasharo Openness Score</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Report has been generated with Openness Score utility version </span><span class="si">%s</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">version</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Openness Score for </span><span class="si">%s</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Open-source code percentage: **</span><span class="si">%1.1f%%</span><span class="s1">**</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_get_percentage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">))</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Closed-source code percentage: **</span><span class="si">%1.1f%%</span><span class="s1">**</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_get_percentage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">))</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'* Image size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Number of regions: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Number of CBFSes: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Total open-source code size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Total closed-source code size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Total data size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Total empty size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_regions</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_cbfses</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">)))</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'> Numbers given above already include the calculations'</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">' from CBFS regions</span><span class="se">\n</span><span class="s1">> presented below</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Regions first</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">mkdocs</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'## FMAP regions</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'### FMAP regions</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| FMAP region | Offset | Size | Category |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| ----------- | ------ | ---- | -------- |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_code_regions</span><span class="p">,</span> <span class="s1">'open-source'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions</span><span class="p">,</span>
|
|
<span class="s1">'closed-source'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_regions</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_regions</span><span class="p">,</span> <span class="s1">'empty'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifd_found</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">mkdocs</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">## IFD regions</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">### IFD regions</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| IFD region | Start | End | Size | Category |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| -------------- | ----- | --- | ---- | -------- |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_ifdtool_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed_code_regions_ifdtool</span><span class="p">,</span>
|
|
<span class="s1">'closed-source'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_ifdtool_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_regions_ifdtool</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_ifdtool_regions_md</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_regions_ifdtool</span><span class="p">,</span> <span class="s1">'empty'</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">cbfs</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_images</span><span class="p">:</span>
|
|
<span class="n">md</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">cbfs</span><span class="o">.</span><span class="n">export_markdown</span><span class="p">(</span><span class="n">md</span><span class="p">,</span> <span class="n">mkdocs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="DasharoCorebootImage.export_charts"><a class="viewcode-back" href="../coreboot.html#coreboot.DasharoCorebootImage.export_charts">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">export_charts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">dir</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Plots the pie charts with firmware image statistics</span>
|
|
|
|
<span class="sd"> Method plots two pie charts. One containing only the closed-source to</span>
|
|
<span class="sd"> open-source code ratio. Second the share percentage of all four image</span>
|
|
<span class="sd"> components categories: closed-source, open-source, data and empty</span>
|
|
<span class="sd"> space.</span>
|
|
|
|
<span class="sd"> :param dir: Path to the directory where the charts will be saved.</span>
|
|
<span class="sd"> :type dir: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">labels</span> <span class="o">=</span> <span class="s1">'closed-source'</span><span class="p">,</span> <span class="s1">'open-source'</span>
|
|
<span class="n">sizes</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">]</span>
|
|
<span class="n">explode</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
|
|
|
|
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span>
|
|
<span class="n">ax</span><span class="o">.</span><span class="n">pie</span><span class="p">(</span><span class="n">sizes</span><span class="p">,</span> <span class="n">explode</span><span class="o">=</span><span class="n">explode</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="n">labels</span><span class="p">,</span> <span class="n">autopct</span><span class="o">=</span><span class="s1">'</span><span class="si">%1.1f%%</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">fig</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s1">'Dasharo coreboot image code openness</span><span class="se">\n</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">_openness_chart.png'</span> <span class="o">%</span>
|
|
<span class="nb">dir</span><span class="o">.</span><span class="n">joinpath</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
|
|
|
|
<span class="n">labels</span> <span class="o">=</span> <span class="s1">'closed-source'</span><span class="p">,</span> <span class="s1">'open-source'</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">,</span> <span class="s1">'empty'</span>
|
|
<span class="n">sizes</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">]</span>
|
|
<span class="n">explode</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
|
|
|
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">()</span>
|
|
<span class="n">ax</span><span class="o">.</span><span class="n">pie</span><span class="p">(</span><span class="n">sizes</span><span class="p">,</span> <span class="n">explode</span><span class="o">=</span><span class="n">explode</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="n">labels</span><span class="p">,</span> <span class="n">autopct</span><span class="o">=</span><span class="s1">'</span><span class="si">%1.1f%%</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">fig</span><span class="o">.</span><span class="n">suptitle</span><span class="p">(</span><span class="s1">'Dasharo coreboot full image component share</span><span class="se">\n</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">_openness_chart_full_image.png'</span> <span class="o">%</span>
|
|
<span class="nb">dir</span><span class="o">.</span><span class="n">joinpath</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">))</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="CBFSImage"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">CBFSImage</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">""" CBFSImage class</span>
|
|
|
|
<span class="sd"> The main class representing a coreboot's CBFS</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">debug</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="n">CBFS_FILETYPES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'bootblock'</span><span class="p">,</span> <span class="s1">'cbfs header'</span><span class="p">,</span> <span class="s1">'stage'</span><span class="p">,</span> <span class="s1">'simple elf'</span><span class="p">,</span> <span class="s1">'fit_payload'</span><span class="p">,</span>
|
|
<span class="s1">'optionrom'</span><span class="p">,</span> <span class="s1">'bootsplash'</span><span class="p">,</span> <span class="s1">'raw'</span><span class="p">,</span> <span class="s1">'vsa'</span><span class="p">,</span> <span class="s1">'mbi'</span><span class="p">,</span> <span class="s1">'microcode'</span><span class="p">,</span>
|
|
<span class="s1">'intel_fit'</span><span class="p">,</span> <span class="s1">'fsp'</span><span class="p">,</span> <span class="s1">'mrc'</span><span class="p">,</span> <span class="s1">'cmos_default'</span><span class="p">,</span> <span class="s1">'cmos_layout'</span><span class="p">,</span> <span class="s1">'spd'</span><span class="p">,</span>
|
|
<span class="s1">'mrc_cache'</span><span class="p">,</span> <span class="s1">'mma'</span><span class="p">,</span> <span class="s1">'efi'</span><span class="p">,</span> <span class="s1">'struct'</span><span class="p">,</span> <span class="s1">'deleted'</span><span class="p">,</span> <span class="s1">'null'</span><span class="p">,</span> <span class="s1">'amdfw'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of all known CBFS filetypes for regexp matching"""</span>
|
|
|
|
<span class="n">OPEN_SOURCE_FILETYPES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'bootblock'</span><span class="p">,</span> <span class="s1">'stage'</span><span class="p">,</span> <span class="s1">'simple elf'</span><span class="p">,</span> <span class="s1">'fit_payload'</span><span class="p">,</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filetypes known to be open-source code"""</span>
|
|
|
|
<span class="n">CLOSED_SOURCE_FILETYPES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'optionrom'</span><span class="p">,</span> <span class="s1">'vsa'</span><span class="p">,</span> <span class="s1">'mbi'</span><span class="p">,</span> <span class="s1">'microcode'</span><span class="p">,</span> <span class="s1">'fsp'</span><span class="p">,</span> <span class="s1">'mrc'</span><span class="p">,</span> <span class="s1">'mma'</span><span class="p">,</span> <span class="s1">'efi'</span><span class="p">,</span>
|
|
<span class="s1">'amdfw'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filetypes known to be closed-source code"""</span>
|
|
|
|
<span class="n">DATA_FILETYPES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'cbfs header'</span><span class="p">,</span> <span class="s1">'bootsplash'</span><span class="p">,</span> <span class="s1">'intel_fit'</span><span class="p">,</span> <span class="s1">'cmos_default'</span><span class="p">,</span>
|
|
<span class="s1">'cmos_layout'</span><span class="p">,</span> <span class="s1">'spd'</span><span class="p">,</span> <span class="s1">'mrc_cache'</span><span class="p">,</span> <span class="s1">'struct'</span><span class="p">,</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filetypes known to be data"""</span>
|
|
|
|
<span class="c1"># Some binary blobs containing code are not added as raw files or as fsp,</span>
|
|
<span class="c1"># etc, for example refcode blob is a stage type. We keep them here to</span>
|
|
<span class="c1"># account for such exceptions. Some non-x86 files are also here for the</span>
|
|
<span class="c1"># future. The list may not be exhaustive. Search for 'cbfs-files' pattern</span>
|
|
<span class="c1"># in coreobot Makefiles.</span>
|
|
<span class="n">CLOSED_SOURCE_EXCEPTIONS</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'fallback/refcode'</span><span class="p">,</span> <span class="s1">'fallback/secure_os'</span><span class="p">,</span> <span class="s1">'fallback/dram'</span><span class="p">,</span>
|
|
<span class="s1">'fallback/qcsdi'</span><span class="p">,</span> <span class="s1">'fallback/qclib'</span><span class="p">,</span> <span class="s1">'fallback/pmiccfg'</span><span class="p">,</span>
|
|
<span class="s1">'fallback/dcb'</span><span class="p">,</span> <span class="s1">'fallback/dcb_longsys1p8'</span><span class="p">,</span> <span class="s1">'fallback/aop'</span><span class="p">,</span>
|
|
<span class="s1">'fallback/uart_fw'</span><span class="p">,</span> <span class="s1">'fallback/spi_fw'</span><span class="p">,</span> <span class="s1">'fallback/i2c_fw'</span><span class="p">,</span>
|
|
<span class="s1">'fallback/cpucp'</span><span class="p">,</span> <span class="s1">'fallback/shrm'</span><span class="p">,</span> <span class="s1">'fallback/gsi_fw'</span><span class="p">,</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filenames exceptions known to be closed-source code"""</span>
|
|
|
|
<span class="c1"># Filetype raw can be anything and can also be named arbitrarily. We trust</span>
|
|
<span class="c1"># that Dasharo binary is unmodified and standard names used by coreboot</span>
|
|
<span class="c1"># have not been misused to hide blobs. These names are below for data and</span>
|
|
<span class="c1"># code respecitvely. We also assume VBT to be data, becasue Intel publishes</span>
|
|
<span class="c1"># VBT BSF/JSON files with the meaning of each byte in it. The lists may not</span>
|
|
<span class="c1"># be exhaustive. Search for 'cbfs-files' pattern in coreobot Makefiles.</span>
|
|
<span class="n">RAW_DATA_FILES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'config'</span><span class="p">,</span> <span class="s1">'revision'</span><span class="p">,</span> <span class="s1">'build_info'</span><span class="p">,</span> <span class="s1">'vbt.bin'</span><span class="p">,</span> <span class="s1">'payload_config'</span><span class="p">,</span>
|
|
<span class="s1">'payload_revision'</span><span class="p">,</span> <span class="s1">'etc/grub.cfg'</span><span class="p">,</span> <span class="s1">'logo.bmp'</span><span class="p">,</span> <span class="s1">'rt8168-macaddress'</span><span class="p">,</span>
|
|
<span class="s1">'atl1e-macaddress'</span><span class="p">,</span> <span class="s1">'wifi_sar_defaults.hex'</span><span class="p">,</span> <span class="s1">'ecrw.hash'</span><span class="p">,</span> <span class="s1">'pdrw.hash'</span><span class="p">,</span>
|
|
<span class="s1">'oem.bin'</span><span class="p">,</span> <span class="s1">'sbom'</span><span class="p">,</span> <span class="s1">'boot_policy_manifest.bin'</span><span class="p">,</span> <span class="s1">'key_manifest.bin'</span><span class="p">,</span>
|
|
<span class="s1">'txt_bios_policy.bin'</span><span class="p">,</span> <span class="s1">'apu/amdfw_a'</span><span class="p">,</span> <span class="s1">'apu/amdfw_b'</span><span class="p">,</span> <span class="s1">'me_rw.hash'</span><span class="p">,</span>
|
|
<span class="s1">'me_rw.version'</span><span class="p">,</span> <span class="s1">'vboot_public_key.bin'</span><span class="p">,</span>
|
|
<span class="c1"># SeaBIOS runtime config below https://www.seabios.org/Runtime_config</span>
|
|
<span class="s1">'links'</span><span class="p">,</span> <span class="s1">'bootorder'</span><span class="p">,</span> <span class="s1">'etc/show-boot-menu'</span><span class="p">,</span> <span class="s1">'etc/boot-menu-message'</span><span class="p">,</span>
|
|
<span class="s1">'etc/boot-menu-key'</span><span class="p">,</span> <span class="s1">'etc/boot-menu-wait'</span><span class="p">,</span> <span class="s1">'etc/boot-fail-wait'</span><span class="p">,</span>
|
|
<span class="s1">'etc/extra-pci-roots'</span><span class="p">,</span> <span class="s1">'etc/ps2-keyboard-spinup'</span><span class="p">,</span> <span class="s1">'etc/threads'</span><span class="p">,</span>
|
|
<span class="s1">'etc/optionroms-checksum'</span><span class="p">,</span> <span class="s1">'etc/pci-optionrom-exec'</span><span class="p">,</span>
|
|
<span class="s1">'etc/s3-resume-vga-init'</span><span class="p">,</span> <span class="s1">'etc/screen-and-debug'</span><span class="p">,</span> <span class="s1">'etc/sercon-port'</span><span class="p">,</span>
|
|
<span class="s1">'etc/advertise-serial-debug-port'</span><span class="p">,</span> <span class="s1">'etc/floppy0'</span><span class="p">,</span> <span class="s1">'etc/floppy1'</span><span class="p">,</span>
|
|
<span class="s1">'etc/usb-time-sigatt'</span><span class="p">,</span> <span class="s1">'etc/sdcard0'</span><span class="p">,</span> <span class="s1">'etc/sdcard1'</span><span class="p">,</span> <span class="s1">'etc/sdcard2'</span><span class="p">,</span>
|
|
<span class="s1">'etc/sdcard3'</span><span class="p">,</span>
|
|
<span class="c1"># PC Engines apu specific</span>
|
|
<span class="s1">'bootorder_def'</span><span class="p">,</span> <span class="s1">'bootorder_map'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filenames known to be data"""</span>
|
|
|
|
<span class="c1"># Everything derived from open-source code which is an executable code or</span>
|
|
<span class="c1"># was created from open-source code in a reproducible way</span>
|
|
<span class="n">RAW_OPEN_SOURCE_FILES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'fallback/dsdt.aml'</span><span class="p">,</span> <span class="s1">'vgaroms/seavgabios.bin'</span><span class="p">,</span> <span class="s1">'pagetables'</span><span class="p">,</span> <span class="s1">'pdpt'</span><span class="p">,</span>
|
|
<span class="s1">'pt'</span><span class="p">,</span> <span class="s1">'ecrw'</span><span class="p">,</span> <span class="s1">'pdrw'</span><span class="p">,</span> <span class="s1">'sff8104-linux.dtb'</span><span class="p">,</span> <span class="s1">'stm.bin'</span><span class="p">,</span> <span class="s1">'fallback/DTB'</span><span class="p">,</span>
|
|
<span class="s1">'oemmanifest.bin'</span><span class="p">,</span> <span class="s1">'smcbiosinfo.bin'</span><span class="p">,</span> <span class="s1">'genroms/pxe.rom'</span><span class="p">,</span> <span class="s1">'ec.rom'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filenames known to be created from open-source code"""</span>
|
|
|
|
<span class="c1"># PSE binary is treated as closed source as there is no guarantee of open</span>
|
|
<span class="c1"># code availability for given build.</span>
|
|
<span class="n">RAW_CLOSED_SOURCE_FILES</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'doom.wad'</span><span class="p">,</span> <span class="s1">'ecfw1.bin'</span><span class="p">,</span> <span class="s1">'ecfw2.bin'</span><span class="p">,</span> <span class="s1">'apu/amdfw'</span><span class="p">,</span> <span class="s1">'ec/ecfw'</span><span class="p">,</span>
|
|
<span class="s1">'sch5545_ecfw.bin'</span><span class="p">,</span> <span class="s1">'txt_bios_acm.bin'</span><span class="p">,</span> <span class="s1">'txt_sinit_acm.bin'</span><span class="p">,</span>
|
|
<span class="s1">'apu/amdfw_a_body'</span><span class="p">,</span> <span class="s1">'apu/amdfw_b_body'</span><span class="p">,</span> <span class="s1">'smu_fw'</span><span class="p">,</span> <span class="s1">'smu_fw2'</span><span class="p">,</span>
|
|
<span class="s1">'dmic-1ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'dmic-2ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'me_rw'</span><span class="p">,</span>
|
|
<span class="s1">'dmic-4ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'max98357-render-2ch-48khz-24b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'nau88l25-2ch-48khz-24b.bin'</span><span class="p">,</span> <span class="s1">'max98927-render-2ch-48khz-24b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'max98927-render-2ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'dmic-2ch-48khz-32b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'rt5514-capture-4ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'dmic-4ch-48khz-32b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'max98373-render-2ch-48khz-24b.bin'</span><span class="p">,</span> <span class="s1">'dialog-2ch-48khz-24b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'max98373-render-2ch-48khz-16b.bin'</span><span class="p">,</span> <span class="s1">'rt5682-2ch-48khz-24b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'rt5663-2ch-48khz-24b.bin'</span><span class="p">,</span> <span class="s1">'ssm4567-render-2ch-48khz-24b.bin'</span><span class="p">,</span>
|
|
<span class="s1">'ssm4567-capture-4ch-48khz-32b.bin'</span><span class="p">,</span> <span class="s1">'pcm_allinone_lp4_3200.bin'</span><span class="p">,</span>
|
|
<span class="s1">'pcm_allinone_lp4_3733.bin'</span><span class="p">,</span> <span class="s1">'sspm.bin'</span><span class="p">,</span> <span class="s1">'spm_firmware.bin'</span><span class="p">,</span> <span class="s1">'AGESA'</span><span class="p">,</span>
|
|
<span class="s1">'cse_iom'</span><span class="p">,</span> <span class="s1">'cse_nphy'</span><span class="p">,</span> <span class="s1">'pse.bin'</span><span class="p">,</span> <span class="s1">'rmu.bin'</span><span class="p">,</span> <span class="s1">'tegra_mtc.bin'</span><span class="p">,</span> <span class="s1">'tz.mbn'</span><span class="p">,</span>
|
|
<span class="s1">'cdt.mbn'</span><span class="p">,</span> <span class="s1">'ddr.mbn'</span><span class="p">,</span> <span class="s1">'rpm.mbn'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS filenames known to be closed-source"""</span>
|
|
|
|
<span class="c1"># A list of regions that are supposed to have a config file. We use this</span>
|
|
<span class="c1"># list to skip a warning and reduce confusion when a config file is not</span>
|
|
<span class="c1"># found in a region that is not listed here.</span>
|
|
<span class="n">REGIONS_WITH_CONFIG</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="s1">'COREBOOT'</span><span class="p">,</span> <span class="s1">'FW_MAIN_A'</span><span class="p">,</span> <span class="s1">'FW_MAIN_B'</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""A list of CBFS regions that should contain a config file"""</span>
|
|
|
|
<span class="n">DASHARO_LAN_ROM_GUID</span> <span class="o">=</span> <span class="s1">'DEB917C0-C56A-4860-A05B-BF2F22EBB717'</span>
|
|
<span class="w"> </span><span class="sd">"""GUID of the Dasharo UEFI Paylaod file that contains closed-source</span>
|
|
<span class="sd"> EFI driver for LAN NIC"""</span>
|
|
|
|
<span class="n">file_patterns</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="sa">r</span><span class="s2">"(?P<filename>[a-zA-Z0-9\(\)\/\.\,\_\-]*?)\s+"</span><span class="p">,</span>
|
|
<span class="sa">r</span><span class="s2">"(?P<offset>0x[0-9a-f]+?)\s+"</span><span class="p">,</span>
|
|
<span class="sa">r</span><span class="s2">"(?P<filetype>("</span> <span class="o">+</span> <span class="s2">"|"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">CBFS_FILETYPES</span><span class="p">)</span> <span class="o">+</span> <span class="sa">r</span><span class="s2">")</span><span class="si">{1}</span><span class="s2">?)\s+"</span><span class="p">,</span>
|
|
<span class="sa">r</span><span class="s2">"(?P<size>\d+?)\s+(?P<compression>\w+?)(\s+\(\d+ \w+\))?$"</span>
|
|
<span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""Set of regular expressions used to parse the cbfstool output"""</span>
|
|
|
|
<span class="n">file_regexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">file_patterns</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="sd">"""Regular expression variable used to parse the cbfstool output"""</span>
|
|
|
|
<div class="viewcode-block" id="CBFSImage.__init__"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage.__init__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">image_path</span><span class="p">,</span> <span class="n">region</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""CBFSImage class init method</span>
|
|
|
|
<span class="sd"> Initializes the class fields for storing the CBFS region components</span>
|
|
<span class="sd"> classified to specific groups. Also calls</span>
|
|
<span class="sd"> :meth:`~coreboot.DasharoCorebootImage._parse_cbfs_files`,</span>
|
|
<span class="sd"> :meth:`~coreboot.DasharoCorebootImage._parse_cb_config` and</span>
|
|
<span class="sd"> :meth:`~coreboot.DasharoCorebootImage._calculate_metrics` methods to</span>
|
|
<span class="sd"> parse the CBFS and calculate the metrics.</span>
|
|
|
|
<span class="sd"> :param region: Path the the firmware image file being parsed.</span>
|
|
<span class="sd"> :type image_path: str</span>
|
|
<span class="sd"> :param region: The flashmap region where the CBFS resides.</span>
|
|
<span class="sd"> :type image_path: dict</span>
|
|
<span class="sd"> :param verbose: Optional parameter to turn on debug information during</span>
|
|
<span class="sd"> the image parsing, defaults to False</span>
|
|
<span class="sd"> :type verbose: bool, optional</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">image_path</span> <span class="o">=</span> <span class="n">image_path</span>
|
|
<span class="w"> </span><span class="sd">"""Path to the image represented by DasharoCorebootImage class"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">region_name</span> <span class="o">=</span> <span class="n">region</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""The region name where the CBFS is located"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span> <span class="o">=</span> <span class="n">region</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span>
|
|
<span class="w"> </span><span class="sd">"""The region size where the CBFS is located"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="w"> </span><span class="sd">"""A dictionary holding the CBFS files and their attributes"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="w"> </span><span class="sd">"""A dictionary holding the coreboot config used to produce the</span>
|
|
<span class="sd"> CBFS</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_files</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Number of files in the CBFS"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_opts</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Number of options coreboot config file found in CBFS"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as open-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as closed-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Total number of bytes classified as empty"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding CBFS files classified as open-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding CBFS files classified as closed-source code"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_files</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding CBFS files classified as data"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_files</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding CBFS empty spaces"""</span>
|
|
<span class="c1"># This type of files will be counted as closed-source at the end of</span>
|
|
<span class="c1"># metrics calculation. Keep them in separate array to export them into</span>
|
|
<span class="c1"># CSV later for review.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="w"> </span><span class="sd">"""A list holding CBFS files that could not be classified. Counted</span>
|
|
<span class="sd"> as closed-source code at the end of calculation process.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">edk2_ipxe</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="w"> </span><span class="sd">"""Variable to hold the status whether iPXE was built for EDK2"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_present</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="w"> </span><span class="sd">"""Variable to hold the status of iPXE presence in the CBFS"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="w"> </span><span class="sd">"""Variable to hold the PCI ID used for iPXE build"""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="w"> </span><span class="sd">"""Variable to hold the size of optional LAN EFI driver used in</span>
|
|
<span class="sd"> Dasharo builds. If such driver is detected based on coreboot config,</span>
|
|
<span class="sd"> the driver's size is subtracted from open-source code and added to</span>
|
|
<span class="sd"> closed-source code.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="n">verbose</span>
|
|
<span class="w"> </span><span class="sd">"""Used to enable verbose debug output from the parsing process"""</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_parse_cbfs_files</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_parse_cb_config</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_calculate_metrics</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage.__len__"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage.__len__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns the length of the CBFS region</span>
|
|
|
|
<span class="sd"> :return: Length of the CBFS</span>
|
|
<span class="sd"> :rtype: int</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage.__repr__"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage.__repr__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""CBFSImage class representation</span>
|
|
|
|
<span class="sd"> :return: class representation</span>
|
|
<span class="sd"> :rtype: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s1">'CBFSImage()'</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage.__str__"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage.__str__">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns string representation of the CBFS</span>
|
|
|
|
<span class="sd"> Prints the firmware image statistics.</span>
|
|
|
|
<span class="sd"> :return: CBFSImage string representation</span>
|
|
<span class="sd"> :rtype: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="s1">'CBFS region </span><span class="si">%s</span><span class="s1">:</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">CBFS size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Number of files: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Open-source files size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Closed-source files size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Data size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span> \
|
|
<span class="s1">'</span><span class="se">\t</span><span class="s1">Empty size: </span><span class="si">%d</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._parse_cbfs_files"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._parse_cbfs_files">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_parse_cbfs_files</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Parses the CBFS contents from cbfstool output</span>
|
|
|
|
<span class="sd"> Parses the output of 'cbfstool :attr:`coreboot.CBFSImage.image_path`</span>
|
|
<span class="sd"> print -r :attr:`coreboot.CBFSImage.region_name`' and extracts the CBFS</span>
|
|
<span class="sd"> files information to the :attr:`coreboot.CBFSImage.cbfs_files`</span>
|
|
<span class="sd"> dictionary using the :const:`coreboot.CBFSImage.file_regexp` regular</span>
|
|
<span class="sd"> expression.</span>
|
|
|
|
<span class="sd"> If :attr:`coreboot.CBFSImage.debug` is True, all CBFS contents with</span>
|
|
<span class="sd"> their attributes are printed on the console at the end.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'cbfstool'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span> <span class="s1">'print'</span><span class="p">,</span> <span class="s1">'-r'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">]</span>
|
|
<span class="n">cbfs_content</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_regexp</span><span class="p">,</span> <span class="n">cbfs_content</span><span class="o">.</span><span class="n">stdout</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'filename'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'filename'</span><span class="p">),</span>
|
|
<span class="s1">'offset'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'offset'</span><span class="p">),</span> <span class="mi">16</span><span class="p">),</span>
|
|
<span class="s1">'filetype'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'filetype'</span><span class="p">),</span>
|
|
<span class="s1">'size'</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'size'</span><span class="p">)),</span>
|
|
<span class="s1">'compression'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'compression'</span><span class="p">),</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_files</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">num_files</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Region </span><span class="si">%s</span><span class="s1"> CBFS contents:'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">)</span>
|
|
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="p">)]</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._calculate_metrics"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._calculate_metrics">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_metrics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Calculates the sizes of the four basic firmware components</span>
|
|
<span class="sd"> categories</span>
|
|
|
|
<span class="sd"> Calls :meth:`~coreboot.CBFSImage._classify_file` for each detected</span>
|
|
<span class="sd"> CBFS file. Then sums the files' sizes from all 5 lists:</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.open_code_files` sizes sum is added to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.open_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.closed_code_files` sizes sum is added to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.closed_code_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.data_files` sizes sum is added to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.data_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.empty_files` sizes sum is added to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.empty_size`</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.uncategorized_files` sizes sum is added to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.closed_code_size`</span>
|
|
|
|
<span class="sd"> Additionally if a LAN EFI driver has been detected, it is subtracted</span>
|
|
<span class="sd"> from open-source code size (normally the driver is part ofthe payload</span>
|
|
<span class="sd"> considered to be open-source) and added to the closed-source size.</span>
|
|
|
|
<span class="sd"> At the end the method calls</span>
|
|
<span class="sd"> :meth:`coreboot.CBFSImage._normalize_sizes`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_classify_file</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_files</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">empty_files</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'INFO: Found </span><span class="si">%d</span><span class="s1"> uncategorized files of total size </span><span class="si">%d</span><span class="s1"> bytes'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="p">)))</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Account for an externally added LAN driver to the EDK2 payload. We</span>
|
|
<span class="c1"># subtract the compressed size of the driver from the compressed size</span>
|
|
<span class="c1"># of the paylaod counted as open-source and add the value to</span>
|
|
<span class="c1"># closed-source.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'INFO: Found external LAN driver blob of size </span><span class="si">%d</span><span class="s1"> bytes'</span>
|
|
<span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span> <span class="o">-=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_normalize_sizes</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._classify_file"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._classify_file">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_classify_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Classifies the CBFS file into basic categories.</span>
|
|
|
|
<span class="sd"> Each detected CBFS file is being classified into 4 basic categories</span>
|
|
<span class="sd"> and appended to respective lists.</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.open_code_files` are appended with CBFS</span>
|
|
<span class="sd"> files which type is found in</span>
|
|
<span class="sd"> :const:`coreboot.CBFSImage.OPEN_SOURCE_FILETYPES` and names are not</span>
|
|
<span class="sd"> found in :const:`coreboot.CBFSImage.CLOSED_SOURCE_EXCEPTIONS`. CBFS</span>
|
|
<span class="sd"> files of type 'raw' are also classified as open-source code if its</span>
|
|
<span class="sd"> name is found in :const:`coreboot.CBFSImage.RAW_OPEN_SOURCE_FILES` or</span>
|
|
<span class="sd"> if it is an iPXE legacy ROM (based on the PCI ID detected from</span>
|
|
<span class="sd"> coreboot's config).</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.closed_code_files` are appended with CBFS</span>
|
|
<span class="sd"> files which name is found in</span>
|
|
<span class="sd"> :const:`coreboot.CBFSImage.CLOSED_SOURCE_FILETYPES` or with CBFS</span>
|
|
<span class="sd"> file's type found in :const:`coreboot.CBFSImage.OPEN_SOURCE_FILETYPES`</span>
|
|
<span class="sd"> and name found in :const:`coreboot.CBFSImage.CLOSED_SOURCE_EXCEPTIONS`</span>
|
|
<span class="sd"> or with CBFS files of type 'raw' which names are found in</span>
|
|
<span class="sd"> :const:`coreboot.CBFSImage.RAW_CLOSED_SOURCE_FILES`.</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.empty_files` are appended with CBFS files</span>
|
|
<span class="sd"> with type 'null'.</span>
|
|
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.data_files` are appended with CBFS files</span>
|
|
<span class="sd"> which type is found in :const:`coreboot.CBFSImage.DATA_FILETYPES` or</span>
|
|
<span class="sd"> with CBFS file of type 'raw' and names found in</span>
|
|
<span class="sd"> :const:`coreboot.CBFSImage.RAW_DATA_FILES`.</span>
|
|
|
|
<span class="sd"> Any other unrecognized CBFS files fall into</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.uncategorized_files` list which will be</span>
|
|
<span class="sd"> counted as closed-source code because we were unable to identify what</span>
|
|
<span class="sd"> can be inside.</span>
|
|
|
|
<span class="sd"> :param file: CBFS file entry from dictionary</span>
|
|
<span class="sd"> :type region: dict</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">OPEN_SOURCE_FILETYPES</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">CLOSED_SOURCE_EXCEPTIONS</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">CLOSED_SOURCE_FILETYPES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">DATA_FILETYPES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'null'</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'raw'</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">RAW_DATA_FILES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">RAW_OPEN_SOURCE_FILES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">RAW_CLOSED_SOURCE_FILES</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="c1"># iPXE is added as a raw file</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">ipxe_present</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">edk2_ipxe</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'pci'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="o">+</span> <span class="s1">'.rom'</span> <span class="ow">or</span> \
|
|
<span class="n">file</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'pci'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="o">+</span> <span class="s1">'.rom.lzma'</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">uncategorized_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._normalize_sizes"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._normalize_sizes">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_normalize_sizes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Ensures that all CBFS components sizes sum up to whole image size</span>
|
|
|
|
<span class="sd"> This function takes into account a situation when the CBFS is</span>
|
|
<span class="sd"> truncated (e.g. vboot RW CBFS regions). In such case we calculate the</span>
|
|
<span class="sd"> byte offset of the end of last file in CBFS and calculate the</span>
|
|
<span class="sd"> truncated size by subtracting the offset from the CBFS region size.</span>
|
|
<span class="sd"> The truncated size is then added to the</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.empty_size`.</span>
|
|
|
|
<span class="sd"> cbfstool prints only the sizes of files and does not account for the</span>
|
|
<span class="sd"> metadata surrounding the file. It is necessary to calculate the</span>
|
|
<span class="sd"> metadata size by subtarcting all file's sizes from the whole CBFS</span>
|
|
<span class="sd"> region size. The metadata size is then added to the</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.data_size`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># We have to take into account truncated CBFSes like FW_MAIN_A or</span>
|
|
<span class="c1"># FW_MAIN_B, where the space after the last file is empty but not</span>
|
|
<span class="c1"># listed as such.</span>
|
|
<span class="n">last_file_end</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">+</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_files</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="s1">'offset'</span><span class="p">])</span>
|
|
<span class="n">truncated_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span> <span class="o">-</span> <span class="n">last_file_end</span>
|
|
|
|
<span class="c1"># COREBOOT region will always have the bootblock at its end, so the</span>
|
|
<span class="c1"># truncated_size will be always equal to 64 (size of metadata at the</span>
|
|
<span class="c1"># beginning of the file). If the gap is bigger than 64 bytes, then it</span>
|
|
<span class="c1"># means we have truncated CBFS and have to add the truncated_size to</span>
|
|
<span class="c1"># the sum of empty files.</span>
|
|
<span class="k">if</span> <span class="n">truncated_size</span> <span class="o">></span> <span class="mi">64</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span> <span class="o">+=</span> <span class="n">truncated_size</span>
|
|
|
|
<span class="c1"># We have to normalize the total size of files in each group to the</span>
|
|
<span class="c1"># total region size, because the cbfstool does not report the size of</span>
|
|
<span class="c1"># the file metadata, so the sum of all file sizes would not match the</span>
|
|
<span class="c1"># CBFS region size. This metadata will be counted as data bytes.</span>
|
|
<span class="n">metadata_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">])</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span> <span class="o">+=</span> <span class="n">metadata_size</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Size of metadata in </span><span class="si">%s</span><span class="s1"> CBFS: </span><span class="si">%d</span><span class="s1"> bytes'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span> <span class="n">metadata_size</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._sum_sizes"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._sum_sizes">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_sum_sizes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">files</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Sums the size of the CBFS files</span>
|
|
|
|
<span class="sd"> :param files: Dictionary of files to sum</span>
|
|
<span class="sd"> :type files: dict</span>
|
|
<span class="sd"> :return: Sum of the files' sizes</span>
|
|
<span class="sd"> :rtype: int</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">files</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._get_kconfig_value"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._get_kconfig_value">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_get_kconfig_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns a value of given coreboot's Kconfig option</span>
|
|
|
|
<span class="sd"> :param option: Name of the Kconfig option without 'CONFIG_' prefix.</span>
|
|
<span class="sd"> :type option: str</span>
|
|
<span class="sd"> :return: The value of Kconfig option</span>
|
|
<span class="sd"> :rtype: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span><span class="p">)):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'option'</span><span class="p">]</span> <span class="o">==</span> <span class="n">option</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="s1">'value'</span><span class="p">]</span>
|
|
|
|
<span class="k">return</span> <span class="kc">None</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._parse_cb_config"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._parse_cb_config">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_parse_cb_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Extracts and parses the CBFS config file</span>
|
|
|
|
<span class="sd"> The function uses the cbfstool to extract the coreboot's config and a</span>
|
|
<span class="sd"> regexp to extract the Kconfig names and values to</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.kconfig_opts`.</span>
|
|
|
|
<span class="sd"> Additionally the function calls</span>
|
|
<span class="sd"> :meth:`coreboot.CBFSImage._check_for_ipxe` and</span>
|
|
<span class="sd"> :meth:`coreboot.CBFSImage._check_for_lanrom`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">kconfig_pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">'^CONFIG_(?P<option>[A-Z0-9_]+?)=(?P<value>.*?)$'</span>
|
|
<span class="n">kconfig_pregexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">kconfig_pattern</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
|
|
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'cbfstool'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span>
|
|
<span class="s1">'extract'</span><span class="p">,</span> <span class="s1">'-n'</span><span class="p">,</span> <span class="s1">'config'</span><span class="p">,</span>
|
|
<span class="s1">'-f'</span><span class="p">,</span> <span class="s1">'/tmp/cb_config_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="s1">'-r'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">]</span>
|
|
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'/tmp/cb_config_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'r'</span><span class="p">)</span>
|
|
<span class="n">cb_config</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">REGIONS_WITH_CONFIG</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: Could not extract coreboot config'</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">for</span> <span class="n">match</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">finditer</span><span class="p">(</span><span class="n">kconfig_pregexp</span><span class="p">,</span> <span class="n">cb_config</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">num_opts</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s1">'option'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'option'</span><span class="p">),</span>
|
|
<span class="s1">'value'</span><span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="s1">'value'</span><span class="p">),</span>
|
|
<span class="p">}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">num_opts</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'Region </span><span class="si">%s</span><span class="s1"> CBFS config:'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">)</span>
|
|
<span class="p">[</span><span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">kconfig_opts</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_opts</span><span class="p">)]</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_check_for_ipxe</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_check_for_lanrom</span><span class="p">()</span>
|
|
<span class="c1"># Cleanup</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'rm'</span><span class="p">,</span> <span class="s1">'/tmp/cb_config_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">]</span>
|
|
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._check_for_ipxe"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._check_for_ipxe">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_check_for_ipxe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Checks whether iPXE was built int othe CBFS image and in what form</span>
|
|
|
|
<span class="sd"> The function checks for iPXE specific Kconfig options and sets the</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.edk2_ipxe`,</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.ipxe_present` and</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.ipxe_rom_id` based on the detected Kconfig</span>
|
|
<span class="sd"> values.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kconfig_value</span><span class="p">(</span><span class="s1">'EDK2_ENABLE_IPXE'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'y'</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">edk2_ipxe</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="c1"># If EDK2 iPXE is chosen, CONFIG_PXE is selected as well and will</span>
|
|
<span class="c1"># not be present in the config file. Worst case scenario If EDK2</span>
|
|
<span class="c1"># iPXE option is set as default in the mainboard's Kconfig file</span>
|
|
<span class="c1"># and will not be reflected in the CBFS config file.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_present</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kconfig_value</span><span class="p">(</span><span class="s1">'PXE'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'y'</span><span class="p">:</span>
|
|
<span class="c1"># Worst case scenario, PXE is set as default in the mainbaord's</span>
|
|
<span class="c1"># Kconfig file and will not be reflected in the CBFS config file.</span>
|
|
<span class="c1"># In such case the metrics will assume the pci$(pxe_rom_id).rom as</span>
|
|
<span class="c1"># closed source. Also the PXE_ROM must not be found in the config,</span>
|
|
<span class="c1"># it would mean an external binary.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kconfig_value</span><span class="p">(</span><span class="s1">'PXE_ROM'</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_present</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kconfig_value</span><span class="p">(</span><span class="s1">'PXE_ROM_ID'</span><span class="p">)</span>
|
|
<span class="c1"># If the PXE ROM ID is not found, it means it has its default value.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ipxe_rom_id</span> <span class="o">=</span> <span class="s1">'10ec,8168'</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._check_for_lanrom"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._check_for_lanrom">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_check_for_lanrom</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Checks whether external LAN EFI driver has been included in UEFI</span>
|
|
<span class="sd"> Payload and calculates its estimated compressed size</span>
|
|
|
|
<span class="sd"> The function check for the LAn driver Kcofngi option. If it is</span>
|
|
<span class="sd"> present, then the cbfstool is called to extract the payload binary.</span>
|
|
<span class="sd"> Then UEFIExtract tries to extract the LAN EFI driver by the file GUID</span>
|
|
<span class="sd"> :attr:`coreboot.CBFSImage.DASHARO_LAN_ROM_GUID` from the payload</span>
|
|
<span class="sd"> binary. At the ned the extracted LAN EFI driver is compressed with</span>
|
|
<span class="sd"> lzma to estimate the driver's size occupying the UEFI Payload. The</span>
|
|
<span class="sd"> result is saved to :attr:`coreboot.CBFSImage.lan_rom_size`.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">lan_rom_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kconfig_value</span><span class="p">(</span><span class="s1">'EDK2_LAN_ROM_DRIVER'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">lan_rom_path</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">lan_rom_path</span> <span class="o">==</span> <span class="s1">'""'</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="c1"># We determined there was an external LAN driver included. Now we</span>
|
|
<span class="c1"># have to determine it's compressed size, because we have to</span>
|
|
<span class="c1"># subtract the LAN driver size form compressed payload size.</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'cbfstool'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">image_path</span><span class="p">,</span>
|
|
<span class="s1">'extract'</span><span class="p">,</span> <span class="s1">'-n'</span><span class="p">,</span> <span class="s1">'fallback/payload'</span><span class="p">,</span>
|
|
<span class="s1">'-f'</span><span class="p">,</span> <span class="s1">'/tmp/payload_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="s1">'-r'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="s1">'-m'</span><span class="p">,</span> <span class="s1">'x86'</span><span class="p">]</span>
|
|
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="n">lan_rom_file</span> <span class="o">=</span> <span class="s1">'/tmp/lan_rom_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span> <span class="o">+</span> <span class="s1">'/body_1.bin'</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'UEFIExtract'</span><span class="p">,</span> <span class="s1">'/tmp/payload_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">DASHARO_LAN_ROM_GUID</span><span class="p">,</span>
|
|
<span class="s1">'-o'</span><span class="p">,</span> <span class="s1">'/tmp/lan_rom_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="s1">'-m'</span><span class="p">,</span> <span class="s1">'body'</span><span class="p">]</span>
|
|
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="n">lan_rom_file</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: Failed to extract LAN driver. '</span>
|
|
<span class="s1">'It will not be counted as closed-source'</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
<span class="c1"># We do not use the same LZMA as cbfstool originally does, but the</span>
|
|
<span class="c1"># resulting size different can be neglected, example: i225 EFI driver</span>
|
|
<span class="c1"># uncompressed: 154064 bytes, cbfstool LZMA compressed 63445 bytes, OS</span>
|
|
<span class="c1"># lzma (-6 default) compressed: 63320 bytes.</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'lzma'</span><span class="p">,</span> <span class="s1">'-z'</span><span class="p">,</span> <span class="s1">'-c'</span><span class="p">,</span> <span class="n">lan_rom_file</span><span class="p">]</span>
|
|
<span class="n">lan_rom_compress</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">lan_rom_compress</span><span class="o">.</span><span class="n">returncode</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lan_rom_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lan_rom_compress</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="s1">'WARNING: Failed to compress LAN driver. '</span>
|
|
<span class="s1">'It will not be counted as closed-source'</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="c1"># Cleanup</span>
|
|
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'rm'</span><span class="p">,</span> <span class="s1">'-rf'</span>
|
|
<span class="s1">'/tmp/payload_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">,</span>
|
|
<span class="s1">'/tmp/lan_rom_'</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">]</span>
|
|
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage._export_files_md"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage._export_files_md">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">_export_files_md</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">cbfs_files</span><span class="p">,</span> <span class="n">category</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Writes the CBFS files for given category to the markdown file</span>
|
|
|
|
<span class="sd"> :param file: Markdown file handle to write the CBFS files' info to</span>
|
|
<span class="sd"> :type file: file</span>
|
|
<span class="sd"> :param cbfs_files: Dictionary containing CBFS files to be written to</span>
|
|
<span class="sd"> the markdown file.</span>
|
|
<span class="sd"> :type regions: dict</span>
|
|
<span class="sd"> :param category: Category of the CBFS files to be written to the</span>
|
|
<span class="sd"> markdown file. Should be one of: open-source,</span>
|
|
<span class="sd"> closed-source, data, empty.</span>
|
|
<span class="sd"> :type category: str</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">cbfs_files</span><span class="p">:</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> | </span><span class="si">{}</span><span class="s1"> |</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">f</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">],</span> <span class="n">f</span><span class="p">[</span><span class="s1">'filetype'</span><span class="p">],</span>
|
|
<span class="n">f</span><span class="p">[</span><span class="s1">'size'</span><span class="p">],</span> <span class="n">f</span><span class="p">[</span><span class="s1">'compression'</span><span class="p">],</span> <span class="n">category</span><span class="p">))</span></div>
|
|
|
|
<div class="viewcode-block" id="CBFSImage.export_markdown"><a class="viewcode-back" href="../coreboot.html#coreboot.CBFSImage.export_markdown">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">export_markdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">mkdocs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Saves the openness report in markdown format for given CBFS region</span>
|
|
|
|
<span class="sd"> Saves the parsed information and classified CBFS components into a</span>
|
|
<span class="sd"> markdown file.</span>
|
|
|
|
<span class="sd"> :param file: Markdown file handle</span>
|
|
<span class="sd"> :type file: str</span>
|
|
<span class="sd"> :param mkdocs: Switch to export the report for mkdocs</span>
|
|
<span class="sd"> :type mkdocs: bool</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">mkdocs</span><span class="p">:</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'## CBFS </span><span class="si">%s</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'### CBFS </span><span class="si">%s</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">region_name</span><span class="p">)</span>
|
|
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'* CBFS size: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Number of files: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Open-source files size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Closed-source files size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Data size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'* Empty size: </span><span class="si">%d</span><span class="s1"> (</span><span class="si">%s</span><span class="s1">)</span><span class="se">\n\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cbfs_size</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">num_files</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">open_code_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">closed_code_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data_size</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">,</span> <span class="nb">hex</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">empty_size</span><span class="p">)))</span>
|
|
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'> Numbers given above are already normalized (i.e. they'</span>
|
|
<span class="s1">' already include size</span><span class="se">\n</span><span class="s1">> of metadata and possible'</span>
|
|
<span class="s1">' closed-source LAN drivers included in the payload</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="s1">'> which are not visible in the table below)</span><span class="se">\n\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| CBFS filename | CBFS filetype | Size | Compression |'</span>
|
|
<span class="s1">' Category |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'| ------------- | ------------- | ---- | ----------- |'</span>
|
|
<span class="s1">' -------- |</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_files_md</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_code_files</span><span class="p">,</span> <span class="s1">'open-source'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_files_md</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed_code_files</span><span class="p">,</span> <span class="s1">'closed-source'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_files_md</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_files</span><span class="p">,</span> <span class="s1">'data'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_export_files_md</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_files</span><span class="p">,</span> <span class="s1">'empty'</span><span class="p">)</span></div></div>
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<footer>
|
|
|
|
<hr/>
|
|
|
|
<div role="contentinfo">
|
|
<p>© Copyright 2023, Dasharo Team.</p>
|
|
</div>
|
|
|
|
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
|
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
|
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
|
|
|
|
|
</footer>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<script>
|
|
jQuery(function () {
|
|
SphinxRtdTheme.Navigation.enable(true);
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html> |