subtree updates

poky: 110ee701b3..5950c63d54:
  Alexander Kanavin (19):
        ovmf: update 202308 -> 202402
        attr: update 2.5.1 -> 2.5.2
        dpkg: update 1.22.0 -> 1.22.5
        gptfdisk: update 1.0.9 -> 1.0.10
        icu: update 74-1 -> 74-2
        go-helloworld: update to latest revision
        libpam: update 1.5.3 -> 1.6.0
        libtraceevent: update 1.7.3 -> 1.8.2
        mdadm: update 4.2 -> 4.3
        npth: update 1.6 -> 1.7
        python3-lxml: update 5.0.0 -> 5.1.0
        rpm: update 4.19.1 -> 4.19.1.1
        ruby: update 3.2.2 -> 3.3.0
        tcl: update 8.6.13 -> 8.6.14
        texinfo: update 7.0.3 -> 7.1
        waffle: update 1.7.2 -> 1.8.0
        shadow: update 4.14.2 -> 4.15.0
        meta/lib/oe/sstatesig.py: do not error out if sstate files fail on os.stat()
        scripts/oe-setup-build: write a build environment initialization one-liner into the build directory

  Bruce Ashfield (1):
        perf: make bpf asm include arch conditional

  Chen Qi (2):
        ovmf: set CVE_STATUS for CVE-2014-8271
        ovmf: set CVE_STATUS for a few CVEs

  Denys Dmytriyenko (3):
        mtd-utils: upgrade 2.1.6 -> 2.2.0
        lzip: upgrade 1.24 -> 1.24.1
        wayland-protocols: upgrade 1.33 -> 1.34

  Harish Sadineni (1):
        rust: set CVE_STATUS for CVE-2024-24576

  Joao Marcos Costa (6):
        classes: document new go-vendor class
        migration updates for 5.0
        release-notes updates for 5.0
        ref-manual/variables: add new variables for v5.0
        release-notes-5.0: add updates
        release-notes-5.0: mention cmake-qemu.bbclass

  Joe Slater (2):
        init-ifupdown: modify interfaces for busybox
        packagegroup-core-boot: recommend ifupdown

  Jon Mason (4):
        acpica: use github for SRC_URI
        acpica: update to 20240322 release
        yocto-bsp/linux-yocto-dev: add genericarm64
        yocto-bsp/genericarm64: add virtio-gpu

  Joshua Watt (1):
        bitbake: siggen: Capture SSL environment for hashserver

  Julien Stephan (1):
        devtool: standard: throws appropriate error if source is in detached HEAD

  Jörg Sommer (1):
        kernel-dev: join mkdir commands with -p

  K Sanjay Nayak (1):
        xorg-xserver-config: Disable screen blanking for qemu images

  Khem Raj (5):
        llvm: Upgrade to 18.1.3 bugfix release
        sanity: Use diff instead of meld by default
        libseccomp: Fix build when python packageconfig is enabled
        linux-yocto: Enable nft modules for ptest images
        mdadm: Fix build with new musl

  Lee Chee Yang (2):
        release-notes-4.0.17: reorder CVEs
        migration-guides: add release notes for 4.3.4

  Max Krummenacher (1):
        perf: add asm include required for v6.9+

  Michael Haener (1):
        iproute2: add bridge package

  Michael Opdenacker (19):
        manuals: fix duplicate "stylecheck" target
        manuals: add initial sphinx-lint support
        manuals: fix trailing spaces
        manuals: fix incorrect double backticks
        migration-guides: add missing opening tag colon
        release-notes-5.0: documentation highlights
        manuals: remove tab characters
        dev-manual/debugging: mention new ``taskexp_ncurses`` option
        migration-guides: release-notes-5.0: update docs highlights
        bitbake: prserv: simplify the PRServerClient() interface
        bitbake: prserv: use double quotes by default
        bitbake: bitbake-prserv: replace deprecated optparse by argparse
        bitbake: prserv: use self.logger instead of logger directly
        bitbake: asyncrpc: include parse_address from hashserv
        bitbake: prserv: capitalization and spacing improvements
        bitbake: prserv: add extra requests
        bitbake: prserv: remove redundant exception handler
        bitbake: prserv: correct error message
        bitbake: prserv: remove unnecessary code

  Mikko Rapeli (1):
        linux-yocto-dev: remove duplicate DEPENDS

  Ninette Adhikari (3):
        oe-build-perf-report: Add apache echarts to make report interactive
        oe-build-perf-report: Display more than 300 commits and date instead of commit number
        oe-build-perf-report: Improve report styling and add descriptions

  Oleh Matiusha (1):
        nativesdk-gzip: fix reproducibility issues

  Peter Hoyes (1):
        u-boot-tools: Package mkeficapsule

  Peter Marko (2):
        bitbake.conf: remove comment about oldincludedir
        systemd: make predictable name mac policy opt-out

  Quentin Schulz (2):
        docs: conf.py: properly escape backslashes for latex_elements
        manuals: refer to new yocto-patches mailing list wherever appropriate

  Richard Purdie (10):
        xwayland: Upgrade 23.2.4 -> 23.2.5
        curl: Upgrade 8.6.0 -> 8.7.1
        nghttp2: Upgrade 1.60.1 -> 1.61.0
        pseudo: Update to pull in fchmodat fix
        bitbake: doc/user-manual: Add BB_LOADFACTOR_MAX
        bitbake: BBHandler: Handle unclosed functions correctly
        testimage: Enable runtime 'login' screenshot tests
        Revert "testimage: Enable runtime 'login' screenshot tests"
        python3-websockets: Import from meta-python
        buildtools-tarball: Add python3-websockets

  Rob Woolley (1):
        bitbake: wget: Make wget --passive-ftp option conditional on ftp/ftps

  Ross Burton (2):
        eudev: update Upstream-Status on netifnames.patch
        classes/pypi: don't expose PYPI_ARCHIVE_NAME

  Simone Weiß (1):
        bitbake: doc: Add section for variable context

  Wang Mingyu (87):
        debianutils: upgrade 5.16 -> 5.17
        diffoscope: upgrade 259 -> 260
        encodings: upgrade 1.0.7 -> 1.1.0
        gcr: upgrade 4.2.0 -> 4.2.1
        ghostscript: upgrade 10.02.1 -> 10.03.0
        libassuan: upgrade 2.5.6 -> 2.5.7
        libfontenc: upgrade 1.1.7 -> 1.1.8
        libpng: upgrade 1.6.42 -> 1.6.43
        libsdl2: upgrade 2.30.0 -> 2.30.1
        libxcb: upgrade 1.16 -> 1.16.1
        libxcursor: upgrade 1.2.1 -> 1.2.2
        libxdmcp: upgrade 1.1.4 -> 1.1.5
        mkfontscale: upgrade 1.2.2 -> 1.2.3
        pango: upgrade 1.52.0 -> 1.52.1
        psmisc: upgrade 23.6 -> 23.7
        python3-cython: upgrade 3.0.8 -> 3.0.9
        python3-hypothesis: upgrade 6.98.15 -> 6.99.4
        python3-importlib-metadata: upgrade 7.0.1 -> 7.0.2
        python3-libarchive-c: upgrade 5.0 -> 5.1
        python3-pygobject: update 3.46.0 -> 3.48.1
        python3-pyopenssl: upgrade 24.0.0 -> 24.1.0
        python3-pyparsing: upgrade 3.1.1 -> 3.1.2
        python3-pytest-subtests: upgrade 0.11.0 -> 0.12.1
        python3-pytest: upgrade 8.0.2 -> 8.1.1
        python3-trove-classifiers: upgrade 2024.2.23 -> 2024.3.3
        repo: upgrade 2.42 -> 2.44
        shaderc: update 2023.8 -> 2024.0
        stress-ng: upgrade 0.17.05 -> 0.17.06
        xauth: upgrade 1.1.2 -> 1.1.3
        xev: update 1.2.5 -> 1.2.6
        gnupg: upgrade 2.4.4 -> 2.4.5
        adwaita-icon-theme: upgrade 45.0 -> 46.0
        at-spi2-core: upgrade 2.50.1 -> 2.52.0
        bind: upgrade 9.18.24 -> 9.18.25
        createrepo-c: upgrade 1.0.4 -> 1.1.0
        enchant2: upgrade 2.6.7 -> 2.6.8
        harfbuzz: upgrade 8.3.0 -> 8.3.1
        libbsd: upgrade 0.12.1 -> 0.12.2
        libcomps: upgrade 0.1.20 -> 0.1.21
        libpciaccess: upgrade 0.18 -> 0.18.1
        libwpe: upgrade 1.14.2 -> 1.16.0
        libxkbcommon: upgrade 1.6.0 -> 1.7.0
        libxml2: upgrade 2.12.5 -> 2.12.6
        lighttpd: upgrade 1.4.74 -> 1.4.75
        openssh: upgrade 9.6p1 -> 9.7p1
        python3-hatchling: upgrade 1.21.1 -> 1.22.4
        python3-importlib-metadata: upgrade 7.0.2 -> 7.1.0
        python3-license-expression: upgrade 30.2.0 -> 30.3.0
        python3-markdown: upgrade 3.5.2 -> 3.6
        python3-packaging: upgrade 23.2 -> 24.0
        python3-pyelftools: upgrade 0.30 -> 0.31
        python3-referencing: upgrade 0.33.0 -> 0.34.0
        python3-scons: upgrade 4.6.0 -> 4.7.0
        python3-setuptools: upgrade 69.1.1 -> 69.2.0
        python3-wheel: upgrade 0.42.0 -> 0.43.0
        python3-zipp: upgrade 3.17.0 -> 3.18.1
        vala: upgrade 0.56.15 -> 0.56.16
        wget: upgrade 1.21.4 -> 1.24.5
        mesa: upgrade 24.0.2 -> 24.0.3
        vulkan: upgrade 1.3.275.0 -> 1.3.280.0
        babeltrace2: upgrade 2.0.5 -> 2.0.6
        bash-completion: upgrade 2.12.0 -> 2.13.0
        btrfs-tools: upgrade 6.7.1 -> 6.8
        coreutils: upgrade 9.4 -> 9.5
        dnf: upgrade 4.19.0 -> 4.19.2
        ell: upgrade 0.63 -> 0.64
        enchant2: upgrade 2.6.8 -> 2.6.9
        libdnf: upgrade 0.73.0 -> 0.73.1
        libical: upgrade 3.0.17 -> 3.0.18
        liburi-perl: upgrade 5.27 -> 5.28
        libx11: upgrade 1.8.7 -> 1.8.9
        libxmlb: upgrade 0.3.15 -> 0.3.17
        libxmu: upgrade 1.1.4 -> 1.2.0
        lttng-tools: upgrade 2.13.11 -> 2.13.13
        man-db: upgrade 2.12.0 -> 2.12.1
        mpg123: upgrade 1.32.5 -> 1.32.6
        mtdev: upgrade 1.1.6 -> 1.1.7
        pkgconf: upgrade 2.1.1 -> 2.2.0
        python3-beartype: upgrade 0.17.2 -> 0.18.2
        python3-build: upgrade 1.1.1 -> 1.2.1
        python3-git: upgrade 3.1.42 -> 3.1.43
        python3-pyasn1: upgrade 0.5.1 -> 0.6.0
        python3-typing-extensions: upgrade 4.10.0 -> 4.11.0
        rsync: upgrade 3.2.7 -> 3.3.0
        ttyrun: upgrade 2.31.0 -> 2.32.0
        u-boot: upgrade 2024.01 -> 2024.04
        xorgproto: upgrade 2023.2 -> 2024.1

  Yoann Congal (2):
        ref-manual: variables: document CVE_DB_INCR_UPDATE_AGE_THRES variable
        release-notes-5.0: document some cve, strace and qa changes

meta-raspberrypi: d072cc8a48..1879cb831f:
  Max Stepanov (1):
        rpi-eeprom: Update to support raspberrypi5 machine

meta-arm: d9e18ce792..17df9c4ebc:
  Anusmita Dutta Mazumder (2):
        arm-bsp/u-boot:corstone1000: add unique guid for fvp and mps3
        arm-bsp/tf-m:corstone1000: add unique guid for fvp and mps3

  Debbie Martin (1):
        arm-systemready: Change get_json_result_dir helper

  Harsimran Singh Tungal (1):
        corstone1000:arm-bsp/tftf: upgrade tftf version to v2.10

  Jon Mason (7):
        arm-bsp: remove unused recipes
        arm-bsp: Remove tc1
        CI: update to kas 4.3.2
        arm/optee-ftpm: update to the latest SHA
        arm/trusted-firmware-a: update to 2.10.3 release
        arm/opencsd: update to 1.5.2
        arm-bsp/corstone1000: reformat u-boot patches

meta-security: 283a773f24..d1522af21d:
  Armin Kuster (1):
        README.md: update to new patches mailing list

meta-openembedded: a6bcdca5b4..4958bfe013:
  Alex Kiernan (1):
        mdns: Upgrade 2200.80.16 -> 2200.100.94.0.2

  Beniamin Sandu (5):
        mbedtls: upgrade 3.5.2 -> 3.6.0
        mbedtls: upgrade 2.28.7 -> 2.28.8
        unbound: upgrade 1.19.1 -> 1.19.3
        libtorrent: remove CVE mention
        libtorrent-rasterbar: add initial recipe for 2.0.10

  Changqing Li (1):
        nodejs: don't always disable io_uring

  Dan McGregor (2):
        dash: correct licence
        libfido2: new recipe

  Fathi Boudra (1):
        composefs: add a new recipe

  Guðni Már Gilbert (1):
        python3-ecdsa: upgrade 0.18.0 -> 0.19.0

  Khem Raj (17):
        python3-pydantic-core: Enable benchmark tests
        python3-pydbus: Fix typo in ptest package name
        python3-netaddr: Ignore failing tests on musl
        python3-pydantic: Ignore failing testcases
        python3-pydantic-core: Skip failing ptests
        python3-whoosh: Fix an intermittent ptest
        python3-pyzmq: Fix ptests
        Revert "libqmi: upgrade 1.34.0 -> 1.35.2"
        Revert "libmbim: upgrade 1.30.0 -> 1.31.2"
        nftables: Fix ptest runs
        python3-flexparser,python3-flexcache: Add recipes
        python3-pint: Switch to using github SRC_URI
        libxml++: Delete recipe for 2.42.1
        jemalloc: Update to tip of dev branch
        libteam: Add missing dependencies revealed by ptests
        oprofile: Fix failing ptests
        ptest-packagelists-meta-oe: jemalloc and oprofile are passing now

  Markus Volk (1):
        dav1d: update 1.4.0 -> 1.4.1

  Maxim Perevozchikov (1):
        nginx: Disable login for www user

  Peter Kjellerstedt (1):
        libnice: Update to 0.1.22

  Peter Marko (1):
        syslog-ng: fix build without ipv6 in distro features

  Randy MacLeod (5):
        ncftp: Upgrade to 3.2.7
        pimd: switch SRC_URI to https
        tnftp: switch the SRC_URI to https
        postfix: switch SRC_URI to http
        libmad: switch links/SRC_URI to https sites

  Rui Costa (1):
        avro: add recipe for c++

  Tom Geelen (4):
        python3-casttube: upgrade 0.2.0 -> 0.2.1
        python3-sqlalchemy: upgrade 2.0.25 --> 2.0.27
        python3-charset-normalizer: add native build option to recipe
        python3-chromecast: upgrade 13.1.0 -> 14.0.0

  Xiangyu Chen (1):
        libgpiod: fix QA error in ptest RDEPENDS

  Yi Zhao (2):
        rocksdb: fix build error for DEBUG_BUILD
        rocksdb: fix build error for multilib

  Yongchang Qiao (1):
        packagegroup-meta-filesystems: Fix utils typo

  alperak (5):
        python3-bleak: enable ptest and add missing runtime dependency
        python3-pillow: Upgrade 10.1.0 -> 10.3.0 and fix ptest
        python3-flexcache: enable ptest
        python3-flexparser: enable ptest and add missing runtime dependencies
        python3-flexcache: add missing runtime dependencies

Change-Id: I06aa4dd845848eec6e165878d482977f48422765
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/poky/scripts/lib/build_perf/html/measurement_chart.html b/poky/scripts/lib/build_perf/html/measurement_chart.html
index 65f1a22..9acb378 100644
--- a/poky/scripts/lib/build_perf/html/measurement_chart.html
+++ b/poky/scripts/lib/build_perf/html/measurement_chart.html
@@ -1,50 +1,76 @@
-<script type="text/javascript">
-  chartsDrawing += 1;
-  google.charts.setOnLoadCallback(drawChart_{{ chart_elem_id }});
-  function drawChart_{{ chart_elem_id }}() {
-    var data = new google.visualization.DataTable();
+<script type="module">
+  // Get raw data
+  const rawData = [
+    {% for sample in measurement.samples %}
+      [{{ sample.commit_num }}, {{ sample.mean.gv_value() }}, {{ sample.start_time }}],
+    {% endfor %}
+  ];
 
-    // Chart options
-    var options = {
-      theme : 'material',
-      legend: 'none',
-      hAxis: { format: '', title: 'Commit number',
-               minValue: {{ chart_opts.haxis.min }},
-               maxValue: {{ chart_opts.haxis.max }} },
-      {% if measurement.type == 'time' %}
-      vAxis: { format: 'h:mm:ss' },
-      {% else %}
-      vAxis: { format: '' },
-      {% endif %}
-      pointSize: 5,
-      chartArea: { left: 80, right: 15 },
-    };
+  const convertToMinute = (time) => {
+    return time[0]*60 + time[1] + time[2]/60 + time[3]/3600;
+  }
 
-    // Define data columns
-    data.addColumn('number', 'Commit');
-    data.addColumn('{{ measurement.value_type.gv_data_type }}',
-                   '{{ measurement.value_type.quantity }}');
-    // Add data rows
-    data.addRows([
-      {% for sample in measurement.samples %}
-        [{{ sample.commit_num }}, {{ sample.mean.gv_value() }}],
-      {% endfor %}
-    ]);
+  // Convert raw data to the format: [time, value]
+  const data = rawData.map(([commit, value, time]) => {
+    return [
+      // The Date object takes values in milliseconds rather than seconds. So to use a Unix timestamp we have to multiply it by 1000.
+      new Date(time * 1000).getTime(),
+      // Assuming the array values are duration in the format [hours, minutes, seconds, milliseconds]
+      Array.isArray(value) ? convertToMinute(value) : value
+    ]
+  });
 
-    // Finally, draw the chart
-    chart_div = document.getElementById('{{ chart_elem_id }}');
-    var chart = new google.visualization.LineChart(chart_div);
-    google.visualization.events.addListener(chart, 'ready', function () {
-      //chart_div = document.getElementById('{{ chart_elem_id }}');
-      //chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">';
-      png_div = document.getElementById('{{ chart_elem_id }}_png');
-      png_div.outerHTML = '<a id="{{ chart_elem_id }}_png" href="' + chart.getImageURI() + '">PNG</a>';
-      console.log("CHART READY: {{ chart_elem_id }}");
-      chartsDrawing -= 1;
-      if (chartsDrawing == 0)
-        console.log("ALL CHARTS READY");
-    });
-    chart.draw(data, options);
-}
+  // Set chart options
+  const option = {
+    tooltip: {
+      trigger: 'axis',
+      valueFormatter: (value) => {
+        const hours = Math.floor(value/60)
+        const minutes = Math.floor(value % 60)
+        const seconds = Math.floor((value * 60) % 60)
+        return hours + ':' + minutes + ':' + seconds
+      }
+    },
+    xAxis: {
+      type: 'time',
+    },
+    yAxis: {
+      name: '{{ measurement.value_type.quantity }}' == 'time' ? 'Duration in minutes' : 'Disk size in MB',
+      type: 'value',
+      min: function(value) {
+        return Math.round(value.min - 0.5);
+      },
+      max: function(value) {
+        return Math.round(value.max + 0.5);
+      }
+    },
+    dataZoom: [
+      {
+        type: 'slider',
+        xAxisIndex: 0,
+        filterMode: 'none'
+      },
+    ],
+    series: [
+      {
+        name: '{{ measurement.value_type.quantity }}',
+        type: 'line',
+        smooth: true,
+        symbol: 'none',
+        data: data
+      }
+    ]
+  };
+
+  // Draw chart
+  const chart_div = document.getElementById('{{ chart_elem_id }}');
+  const measurement_chart= echarts.init(chart_div, null, {
+    height: 320
+  });
+  // Change chart size with browser resize
+  window.addEventListener('resize', function() {
+    measurement_chart.resize();
+  });
+  measurement_chart.setOption(option);
 </script>
 
diff --git a/poky/scripts/lib/build_perf/html/report.html b/poky/scripts/lib/build_perf/html/report.html
index d1ba6f2..4cd2407 100644
--- a/poky/scripts/lib/build_perf/html/report.html
+++ b/poky/scripts/lib/build_perf/html/report.html
@@ -3,11 +3,7 @@
 <head>
 {# Scripts, for visualization#}
 <!--START-OF-SCRIPTS-->
-<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
-<script type="text/javascript">
-google.charts.load('current', {'packages':['corechart']});
-var chartsDrawing = 0;
-</script>
+<script src=" https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js "></script>
 
 {# Render measurement result charts #}
 {% for test in test_data %}
@@ -28,23 +24,15 @@
   text-align: left;
   border-collapse: collapse;
 }
-.meta-table tr:nth-child(even){background-color: #f2f2f2}
-meta-table th, .meta-table td {
-  padding: 4px;
-}
 .summary {
-  margin: 0;
   font-size: 14px;
   text-align: left;
   border-collapse: collapse;
 }
-summary th, .meta-table td {
-  padding: 4px;
-}
 .measurement {
   padding: 8px 0px 8px 8px;
   border: 2px solid #f0f0f0;
-  margin-bottom: 10px;
+  margin: 1.5rem 0;
 }
 .details {
   margin: 0;
@@ -64,18 +52,58 @@
   background-color: #f0f0f0;
   margin-left: 10px;
 }
-hr {
-  color: #f0f0f0;
+.card-container {
+  border-bottom-width: 1px;
+  padding: 1.25rem 3rem;
+  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+  border-radius: 0.25rem;
+}
+body {
+  font-family: 'Helvetica', sans-serif;
+  margin: 3rem 8rem;
+}
+h1 {
+  text-align: center;
 }
 h2 {
-  font-size: 20px;
+  font-size: 1.5rem;
   margin-bottom: 0px;
   color: #707070;
+  padding-top: 1.5rem;
 }
 h3 {
-  font-size: 16px;
+  font-size: 1.3rem;
   margin: 0px;
   color: #707070;
+  padding: 1.5rem 0;
+}
+h4 {
+  font-size: 14px;
+  font-weight: lighter;
+  line-height: 1.2rem;
+  margin: auto;
+  padding-top: 1rem;
+}
+table {
+  margin-top: 1.5rem;
+  line-height: 2rem;
+}
+tr {
+  border-bottom: 1px solid #e5e7eb;
+}
+tr:first-child {
+  border-bottom: 1px solid #9ca3af;
+}
+tr:last-child {
+  border-bottom: none;
+}
+a {
+  text-decoration: none;
+  font-weight: bold;
+  color: #0000EE;
+}
+a:hover {
+  color: #8080ff;
 }
 </style>
 
@@ -83,13 +111,14 @@
 </head>
 
 {% macro poky_link(commit) -%}
-    <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?id={{ commit }}">{{ commit[0:11] }}</a>
+  <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?id={{ commit }}">{{ commit[0:11] }}</a>
 {%- endmacro %}
 
-<body><div style="width: 700px">
+<body><div>
+  <h1 style="text-align: center;">Performance Test Report</h1>
   {# Test metadata #}
   <h2>General</h2>
-  <hr>
+  <h4>The table provides an overview of the comparison between two selected commits from the same branch.</h4>
   <table class="meta-table" style="width: 100%">
     <tr>
       <th></th>
@@ -112,19 +141,21 @@
 
   {# Test result summary #}
   <h2>Test result summary</h2>
-  <hr>
+  <h4>The test summary presents a thorough breakdown of each test conducted on the branch, including details such as build time and disk space consumption. Additionally, it gives insights into the average time taken for test execution, along with absolute and relative values for a better understanding.</h4>
   <table class="summary" style="width: 100%">
+    <tr>
+      <th>Test name</th>
+      <th>Measurement description</th>
+      <th>Mean value</th>
+      <th>Absolute difference</th>
+      <th>Relative difference</th>
+    </tr>
     {% for test in test_data %}
-      {% if loop.index is even %}
-        {% set row_style = 'style="background-color: #f2f2f2"' %}
-      {% else %}
-        {% set row_style = 'style="background-color: #ffffff"' %}
-      {% endif %}
       {% if test.status == 'SUCCESS' %}
         {% for measurement in test.measurements %}
           <tr {{ row_style }}>
             {% if loop.index == 1 %}
-              <td>{{ test.name }}: {{ test.description }}</td>
+              <td><a href=#{{test.name}}>{{ test.name }}: {{ test.description }}</a></td>
             {% else %}
               {# add empty cell in place of the test name#}
               <td></td>
@@ -153,10 +184,12 @@
   </table>
 
   {# Detailed test results #}
+  <h2>Test details</h2>
+  <h4>The following section provides details of each test, accompanied by charts representing build time and disk usage over time or by commit number.</h4>
   {% for test in test_data %}
-  <h2>{{ test.name }}: {{ test.description }}</h2>
-  <hr>
+  <h3 style="color: #000;" id={{test.name}}>{{ test.name }}: {{ test.description }}</h3>
     {% if test.status == 'SUCCESS' %}
+    <div class="card-container">
       {% for measurement in test.measurements %}
         <div class="measurement">
           <h3>{{ measurement.description }}</h3>
@@ -275,7 +308,8 @@
             {% endif %}
           {% endif %}
         </div>
-      {% endfor %}
+        {% endfor %}
+      </div>
     {# Unsuccessful test #}
     {% else %}
       <span style="font-size: 150%; font-weight: bold; color: red;">{{ test.status }}
diff --git a/poky/scripts/lib/build_perf/report.py b/poky/scripts/lib/build_perf/report.py
index ab77424..82c5683 100644
--- a/poky/scripts/lib/build_perf/report.py
+++ b/poky/scripts/lib/build_perf/report.py
@@ -294,7 +294,7 @@
             return "null"
         return self / 1024
 
-def measurement_stats(meas, prefix=''):
+def measurement_stats(meas, prefix='', time=0):
     """Get statistics of a measurement"""
     if not meas:
         return {prefix + 'sample_cnt': 0,
@@ -319,6 +319,7 @@
     stats['quantity'] = val_cls.quantity
     stats[prefix + 'sample_cnt'] = len(values)
 
+    start_time = time # Add start time for both type sysres and disk usage
     mean_val = val_cls(mean(values))
     min_val = val_cls(min(values))
     max_val = val_cls(max(values))
@@ -334,6 +335,7 @@
     stats[prefix + 'max'] = max_val
     stats[prefix + 'minus'] = val_cls(mean_val - min_val)
     stats[prefix + 'plus'] = val_cls(max_val - mean_val)
+    stats[prefix + 'start_time'] = start_time
 
     return stats
 
diff --git a/poky/scripts/lib/devtool/standard.py b/poky/scripts/lib/devtool/standard.py
index 7972b4f..6674e67 100644
--- a/poky/scripts/lib/devtool/standard.py
+++ b/poky/scripts/lib/devtool/standard.py
@@ -1885,6 +1885,8 @@
         for line in stdout.splitlines():
             branchname = line[2:]
             if line.startswith('* '):
+                if 'HEAD' in line:
+                    raise DevtoolError('Detached HEAD - please check out a branch, e.g., "devtool"')
                 startbranch = branchname
             if branchname.startswith(override_branch_prefix):
                 override_branches.append(branchname)