subtree updates: openembedded poky

poky: aa6cd06a9f..fb1853c66c:
  Adrian Freihofer (1):
        bblayers/setupwriters/oe-setup-layers: create dir if not exists

  Alexander Kanavin (48):
        bblayers/makesetup: skip git repos that are submodules
        scripts/oe-setup-layers: print a note about submodules if present
        go: update 1.19.4 -> 1.20
        go-cross-canadian: use gcc-crosssdk, not gcc-native
        vim: update 9.0.1211 -> 9.0.1293 to resolve open CVEs
        gstreamer1.0: update 1.20.5 -> 1.22.0
        mesa: update 22.3.3 -> 22.3.5
        meta/conf: move default configuration templates into meta/conf/templates/default
        scripts/oe-setup-layers: correct variable names - layers should be called repos
        scripts/oe-setup-layers: do not clobber json module with a variable named 'json'
        gcr: enable vala .vapi generation only when gobject introspection is also enabled
        gstreamer1.0-python: do not require introspection during builds
        go: update 1.20 -> 1.20.1
        rust: update 1.67.0 -> 1.67.1
        freetype: update 2.12.1 -> 2.13.0
        gnutls: update 3.7.8 -> 3.8.0
        vulkan-samples: update to latest revision
        gnu-config: update to latest revision
        puzzles: upgrade to latest revision
        python3: upgrade 3.11.1 -> 3.11.2
        nghttp2: upgrade 1.51.0 -> 1.52.0
        log4cplus: upgrade 2.0.8 -> 2.1.0
        dos2unix: upgrade 7.4.3 -> 7.4.4
        webkitgtk: upgrade 2.38.4 -> 2.38.5
        man-pages: upgrade 6.02 -> 6.03
        util-macros: upgrade 1.19.3 -> 1.20.0
        dpkg: upgrade 1.21.19 -> 1.21.20
        ruby: upgrade 3.2.0 -> 3.2.1
        libwpe: upgrade 1.14.0 -> 1.14.1
        vala: upgrade 0.56.3 -> 0.56.4
        dbus: upgrade 1.14.4 -> 1.14.6
        linux-firmware: upgrade 20230117 -> 20230210
        zstd: upgrade 1.5.2 -> 1.5.4
        python3-setuptools: upgrade 67.2.0 -> 67.3.1
        mmc-utils: upgrade to latest revision
        harfbuzz: upgrade 6.0.0 -> 7.0.0
        libhandy: upgrade 1.8.0 -> 1.8.1
        diffoscope: upgrade 234 -> 235
        wireless-regdb: upgrade 2022.08.12 -> 2023.02.13
        libcap: upgrade 2.66 -> 2.67
        e2fsprogs: upgrade 1.46.5 -> 1.47.0
        git: upgrade 2.39.1 -> 2.39.2
        piglit: upgrade to latest revision
        python3-hatchling: upgrade 1.12.2 -> 1.13.0
        devtool: ignore patch-fuzz errors when extracting source
        gcr: correctly configure vala against introspection data
        selftest: do not check for dri.pc in the headless test
        scripts/runqemu: move render nodes check to runqemu from selftest

  Alexis Lothoré (8):
        oeqa/selftest/resulttooltests: fix minor typo
        scripts/oe-selftest: append metadata to tests results
        scripts/resulttool/regression: remove unused import
        scripts/resulttool/regression: add metadata filtering for oeselftest
        scripts: add new helper for regression report generation
        oeqa/selftest: add test for yocto_testresults_query.py
        scripts/yoct_testresults_query: manage base/target revision not found
        oeqa/selftest/resulttool: add test for metadata filtering on regression

  Bruce Ashfield (11):
        linux-yocto/5.19: drop recipes
        yocto-bsps: remove 5.19 bbappend
        lttng-modules: fix for kernel 6.2+
        linux-yocto-rt/6.1: fix compilation issue with per cpu stats
        linux-yocto-dev: bump to v6.2
        linux-yocto/6.1: update to v6.1.12
        linux-yocto/5.15: update to v5.15.94
        linux-yocto/6.1: update to v6.1.14
        linux-yocto/5.15: update to v5.15.96
        linux-yocto-rt/6.1: update to -rt7
        linux-yocto-rt/5.15: update to -rt59

  Caner Altinbasak (1):
        bitbake: fetch2: Add GIT_CACHE_PATH and SSL_CERT_DIR into FETCH_EXPORT_VARS

  Chee Yang Lee (2):
        tar: Fix CVE-2022-48303
        checklayer: check for patch file upstream status

  Chen Qi (1):
        gpgme: fix python setuptools invalid version issue

  Denys Zagorui (1):
        kernel-devsrc: powerpc: add missed dependency for modules_prepare

  Dmitry Baryshkov (4):
        linux-firmware: properly set license for all Qualcomm firmware
        linux-firmware: add yamato fw files to qcom-adreno-a2xx package
        mesa: provide support for packing development and testing tools
        ffmpeg: fix build failure when vulkan is enabled

  Fawzi KHABER (1):
        ref-manual: update DEV_PKG_DEPENDENCY in variables

  Federico Pellegrin (1):
        curl: fix dependencies when building with ldap/ldaps

  Geoffrey GIRY (1):
        cve-extra-exclusions: ignore inapplicable linux-yocto CVEs

  Joe Slater (1):
        tar: Update fix for CVE-2022-48303 to upstream version

  Joel Stanley (1):
        qemu: Fix building with 6.2 kernel headers

  Jose Quaresma (2):
        bluez5: refresh patches with devtool
        icecc: enable the network only when ICECC_DISABLED is not set

  Joshua Watt (4):
        classes/populate_sdk_base: Append cleandirs
        classes/create-sdpx-2.2: Remove image SPDX and index from deploydir
        classes/create-spdx-2.2: Report downloads as separate packages
        weston: Add kiosk shell

  Kai Kang (2):
        xserver-xorg: 21.1.6 -> 21.1.7
        webkitgtk: 2.38.3 -> 2.38.4

  Khem Raj (12):
        unfs3: Add missing header files
        stress-ng: Add missing header files for clock_adjtime
        gstreamer1.0-plugins-good: Fix build with musl
        elfutils: Backport fix for DW_TAG_unspecified_type handling
        tune-riscv.inc: Add riscv64nc to available tunes list
        grub: Handle R_RISCV_CALL_PLT reloc
        gdb: Upgrade to 13.1
        musl: Update to tip of trunk
        kernel: Add kernel specific OBJDUMP
        opensbi: Do not add dependencies if RISCV_SBI_FDT is not set
        opensbi: Upgrade to 1.2 release
        vte: Fix -Wenum-constexpr-conversion warning

  Lee Chee Yang (1):
        migration-guides: add release-notes for 4.0.7

  Luca Boccassi (1):
        systemd: add user for systemd-oomd if enabled

  Marek Vasut (1):
        systemd-systemctl: Create machine-id with "uninitialized" text in it

  Mark Asselstine (1):
        bitbake: fetch/npmsw: add more short forms for git operations

  Markus Volk (3):
        graphene: add a PACKAGECONFIG for arm_neon
        libportal: allow to build without gtk4 backend
        libsdl2: add missing libdecor RDEPEND

  Martin Jansa (3):
        python3-numpy: upgrade to 1.24.2
        insane.bbclass: use 4 spaces for indentation
        insane.bbclass: move Upstream-Status logic to oe.qa

  Mateusz Marciniec (1):
        sstatesig: Improve output hash calculation

  Michael Opdenacker (17):
        migration-guides/migration-4.2.rst: fix minor issues
        ref-manual: variables.rst: fix broken hyperlink
        profile-manual: update WireShark hyperlinks
        manuals: replace unnecessary uses of 'yocto_docs' by internal references
        bsp-guide: fix broken git URLs and missing word
        ref-manual: improve "devtool check-upgrade-status" explanations
        ref-manual: document Rust classes
        manuals: update patchwork instance URL
        ref-manual: classes.rst: add python-setuptools3_rust and python_pyo3 classes
        dev-manual: new-recipe.rst: restructure examples
        ref-manual: classes.rst: improvements to cmake class documentation
        ref-manual: document meson class and variables
        dev-manual: sbom.rst: add link to FOSDEM 2023 video
        manuals: document COMMERCIAL_[AUDIO|VIDEO]_PLUGINS variables
        ref-manual: system-requirements.rst: update supported distros
        dev-manual: new-recipe.rst: add Meson example recipe
        dev-manual: new-recipe.rst: add references to subsections in Examples section

  Mike Crowe (1):
        bitbake: gitsm: Fix path construction for relative submodule URI

  Mikko Rapeli (8):
        oeqa ssh.py: move output prints to new line
        oeqa ssh.py: add connection keep alive options to ssh client
        oeqa dump.py: add error counter and stop after 5 failures
        oeqa qemurunner: read more data at a time from serial
        oeqa qemurunner.py: add timeout to QMP calls
        oeqa qemurunner.py: try to avoid reading one character at a time
        oeqa ssh.py: fix hangs in run()
        runqemu: kill qemu if it hangs

  Mingli Yu (1):
        mc: set ac_cv_path_PERL_FOR_BUILD

  Narpat Mali (1):
        libseccomp: fix for the ptest result format

  Niko Mauno (1):
        ref-manual: Fix invalid feature name

  Paulo Neves (4):
        bitbake: tests/fetch: git-lfs restore _find_git_lfs
        bitbake: tests/fetch: Add real git lfs tests and decorator
        bitbake: fetch/git: Removed unused variables in _contains_lfs
        bitbake: fetch/git: Replace mkdtemp with TemporaryDirectory and avoid exception masking

  Pavel Zhukov (4):
        wic: Fix usage of fstype=none in wic
        u-boot: Map arm64 into map for u-boot dts installation
        wic: Fix populating of IMAGE_EFI_BOOT_FILES with uefi-kernel
        oeqa/selftest/wic: Add test for uefi-kernel loader

  Pedro Baptista (3):
        bitbake: action.py: add topdir in bblayers_conf path for add-layer
        bitbake: action.py: add topdir in bblayers_conf path for remove-layer
        create.py: add command arg to add layer to bblayers.conf

  Peter Kjellerstedt (1):
        devshell: Do not add scripts/git-intercept to PATH

  Peter Marko (1):
        systemd: add group sgx to udev package

  Petr Kubizňák (1):
        graphene: remove introspection from PACKAGECONFIG

  Richard Elberger (2):
        docbook-xml: Switch from debian packages to upstream docbook sources
        bitbake: documentation: bitbake: add file-checksums to varflags section

  Richard Leitner (1):
        ref-manual: variables: FIT_KERNEL_COMP_ALG: add lzo

  Richard Purdie (20):
        bitbake: cookerdata: Remove incorrect SystemExit usage
        libssh2: Clean up ptest patch/coverage
        bitbake: data: Evaluate the value of export/unexport/network flags
        poky.conf: Update SANITY_TESTED_DISTROS to match autobuilder
        bitbake: cookerdata: Improve early exception handling
        bitbake: cookerdata: Drop dubious exception handling code
        bitbake: runqueue: Drop SystemExit usage
        bitbake: cooker: Ensure lock is held with changing notifier
        bitbake: server/process: Improve idle thread exception handling
        bitbake: event/cooker/runqueue: Add ability to interrupt longer running code
        bitbake: bitbake: Bump to version 2.3.1
        sstate: Add check_for_interrupts() call functionality added in bitbake
        binutils: Fix nativesdk ld.so search
        oeqa/selftest/prservice: Improve debug output for failure
        bitbake: cooker: Fix memory resident cache invalidation issue
        bitbake: fetch2/wget: Drop unused import
        bitbake: utils: Use internal fetcher function to avoid duplication
        resulttool/regression: Ensure LTP results are only compared against other LTP runs
        resulttool/regression: Improve matching of poor ptest test names
        build-appliance-image: Update to master head revision

  Robert Joslyn (1):
        curl: Update 7.87.0 to 7.88.0

  Ross Burton (17):
        lib/buildstats: handle tasks that never finished
        cml1: remove redundant addtask
        bitbake: fetch2/wget: clean up netrc usage
        libcgroup: clean up musl DEPENDS
        pkgconfig: use system glib for nativesdk builds
        site: remove glib site values
        less: backport the fix for CVE-2022-46663
        tiff: backport fix for CVE-2022-48281
        python3-atomicwrites: add BBCLASSEXTEND
        python3-iniconfig: add BBCLASSEXTEND
        python3-pytest: set RDEPENDS globally, not just target
        bitbake: lib/bb/siggen: fix debug() call
        ptest-runner: add non-root ptest user for tests to run as
        meta-selftest/files: add ptest to static-passwd/-group
        quilt: run tests as ptest user, and let that user write into the tests
        glibc: add ignore for CVE-2023-25139
        glibc: remove obsolete CVE ignores

  Saul Wold (2):
        busybox: Fix depmod patch
        create-spdx-2.2: Add support for custom Annotations

  Siddharth Doshi (1):
        openssl: Upgrade 3.0.7 -> 3.0.8

  Tim Orling (7):
        python3-hypothesis: upgrade 6.66.0 -> 6.68.1
        python3-typing-extensions: upgrade 4.4.0 -> 4.5.0
        python3-cryptography{-vectors}: 39.0.0 -> 39.0.1
        python3-more-itertools: upgrade 9.0.0 -> 9.1.0
        python3-zipp: upgrade 3.14.0 -> 3.15.0
        python3-hypothesis: upgrade 6.68.1 -> 6.68.2
        python3-babel: upgrade 2.11.0 -> 2.12.1

  Trevor Woerner (12):
        packagegroup-self-hosted: alphabetize
        packagegroup-self-hosted: add zstd
        build-appliance-image: set TERM
        build-appliance-image kernel: linux-yocto: qemuall: add taskstats
        build-appliance-image: add /lib64 symlink
        build-appliance-image: QB_MEM: allow user config
        QB_SMP: allow user modification
        build-appliance-image: check for xattr feature
        dtc: update DESCRIPTION
        dtc: update license checks
        build-appliance-image: fix HOMEPAGE
        VOLATILE_TMP_DIR: add

  Ulrich Ölmann (5):
        dev-manual: fix old override syntax
        kernel-yocto: fix kernel-meta data detection
        kernel-dev,ref-manual: fix old override syntax
        ref-manual: refer to MACHINE variable instead of KMACHINE
        kernel-dev: harmonize example with ref-manual

  Wang Mingyu (21):
        libdrm: upgrade 2.4.114 -> 2.4.115
        libjpeg-turbo: upgrade 2.1.5 -> 2.1.5.1
        libsdl2: upgrade 2.26.2 -> 2.26.3
        lighttpd: upgrade 1.4.68 -> 1.4.69
        openssh: upgrade 9.1p1 -> 9.2p1
        python3-sphinx-rtd-theme: upgrade 1.1.1 -> 1.2.0
        python3-zipp: upgrade 3.12.0 -> 3.13.0
        xkeyboard-config: upgrade 2.37 -> 2.38
        xwayland: upgrade 22.1.7 -> 22.1.8
        libx11: 1.8.3 -> 1.8.4
        dtc: upgrade 1.6.1 -> 1.7.0
        liburcu: upgrade 0.13.2 -> 0.14.0
        curl: upgrade 7.88.0 -> 7.88.1
        harfbuzz: upgrade 7.0.0 -> 7.0.1
        libx11-compose-data: 1.8.3 -> 1.8.4
        python3-pip: update 23.0 -> 23.0.1
        python3-poetry-core: upgrade 1.5.0 -> 1.5.1
        python3-pytest-subtests: upgrade 0.9.0 -> 0.10.0
        python3-zipp: upgrade 3.13.0 -> 3.14.0
        python3-setuptools: upgrade 67.3.1 -> 67.3.3
        diffoscope: upgrade 235 -> 236

  Xiangyu Chen (1):
        dhcpcd: fix dhcpcd start failure on qemuppc64

  Yash Shinde (1):
        glibc: stable 2.37 branch updates.

  Yi Zhao (1):
        glibc: unify wordsize.h between arm and aarch64

  leimaohui (2):
        gnutls: Updated ther patch which fixes build error for fips enabled.
        nghttp2: Deleted the entries for -client and -server, and removed a dependency on them from the main package.

  yanxk (1):
        cpio: Add ptest support

meta-openembedded: cba6df61c7..a9b2d1303b:
  Alex Kiernan (1):
        ostree: Upgrade 2022.7 -> 2023.1

  Arash Partow (1):
        ExprTk: Update package to release/0.0.2

  Archana Polampalli (1):
        Nodejs: fix buildpaths warning

  Bartosz Golaszewski (5):
        libgpiod: update to v1.6.4
        libgpiod: add a recipe for libgpiod v2.0-rc2
        python3-gpiod: new package
        libgpiod: bump version to v2.0-rc3
        python3-gpiod: bump version to v2.0-rc3

  Catalin Enache (1):
        plocate: add recipe

  Changqing Li (1):
        liblockfile: fix do_install failure when ldconfig is not installed

  Chee Yang Lee (2):
        tinyproxy: fix CVE-2022-40468
        tmux: update to tmux_3.3a

  Chen Qi (1):
        nodejs: add CVE_PRODUCT

  Cook, Samuel (1):
        python-systemd: update from v234 to v235

  Craig Comstock (1):
        cfengine: upgrade to 3.21.0

  Denys Dmytriyenko (2):
        lmbench: set up /usr/bin/hello as alternative
        mbedtls: set up /usr/bin/hello as alternative

  Fabio Estevam (2):
        spice-gtk: Update to version 0.42
        glmark2: Update to 2023.01

  Jan Luebbe (5):
        add signing.bbclass as infrastructure for build artifact signing
        smemstat: add recipe
        linux-serial-test: add recipe
        atftp: upgrade from 0.7.5 to 0.8.0
        atftp: use https for git repository access

  Joe Slater (1):
        phoronix-test-suite: fix CVE-2022-40704

  Joshua Watt (2):
        libvpx: Explicitly link with pthread support
        libvpx: Enable native support

  Khem Raj (7):
        python3-cson: Make PEP440 compatible version scheme
        python3-grpcio: Add missing include for close/open APIs
        graphene: Delete recipe
        glog: Link with libatomics on mips.
        glog: Fix build with clang on 32bit platforms
        networkmanager: Fix build with musl
        liburing: Update to latest tip of tree

  Lei Maohui (1):
        libiodbc: Fix install conflict when enable multilib.

  Marek Vasut (1):
        v4l-utils: Update 1.23.0+fd544473 -> 1.23.0+9431e4b2

  Markus Volk (10):
        iwd: update 2.0 -> 2.3
        libdeflate: add recipe
        pipewire-media-session: update 0.4.1 -> 0.4.2
        gnome-software: update 43.2 -> 43.4
        fwupd: fix polkit rules.d permissions
        pipewire: update 0.3.65 -> 0.3.66
        appstream: update 0.15.5 -> 0.16.1
        flatpak: update 1.15.1 -> 1.15.3
        gparted: update 1.4.0 -> 1.5.0
        webp-pixbuf-loader: update 0.0.7 -> 0.2.0

  Martin Jansa (4):
        nodejs: fix do_install failure with 'shared' PACKAGECONFIG
        nodejs: add Upstream-Status
        openhpi, uw-imag, python3-m2crypto: replace Unknown Upstream-Status with Pending
        .patch: fix Upstream-Status formatting issues reported by patchreview tool from oe-core

  Michael Haener (1):
        usb-modeswitch: update 2.6.0 -> 2.6.1

  Michael Opdenacker (1):
        ipcalc: update to 1.0.2

  Mingli Yu (2):
        opencv: disable intel IPP
        mariadb: Upgrade to 10.11.2

  Narpat Mali (1):
        net-snmp: CVE-2022-44792 & CVE-2022-44793 Fix NULL Pointer Exception

  Pablo Saavedra (1):
        graphene: disable neon support on arm 32bits

  Petr Gotthard (5):
        libqmi: upgrade 1.30.8 -> 1.32.2
        libmbim: upgrade 1.26.4 -> 1.28.2
        modemmanager: upgrade 1.18.12 -> 1.20.4
        openvpn: upgrade 2.5.8 -> 2.6.0
        python3-scapy: upgrade 2.4.5 -> 2.5.0

  Randy MacLeod (1):
        python3-pillow: Add distutils, unixadmin for ptest

  Ross Burton (10):
        python3-simpleeval: update patch status
        nodejs: remove redundant expand=True to getVar()
        nodejs: run configure.py in verbose mode
        nodejs: use a postfunc to prune source tree
        nodejs: don't force cross-compilation in native builds
        nodejs: remove LD assignment
        nodejs: no need to stage binaries for target
        nodejs: remove redundant comment
        zchunk: upgrade to 1.2.4
        liburing: enable native/nativesdk builds

  Stefano Babic (1):
        zchunk: upgrade 1.2.4 -> 1.3.0

  Tom Hochstein (1):
        nlohmann-json: Allow empty main package for SDK

  Ulrich Ölmann (1):
        tnftp: switch to using variable flags for alternatives

  Wang Mingyu (104):
        python3-apt: upgrade 2.5.0 -> 2.5.2
        python3-aspectlib: upgrade 1.5.2 -> 2.0.0
        python3-aiohttp-jinja2: upgrade 1.5 -> 1.5.1
        python3-astroid: upgrade 2.13.2 -> 2.14.1
        python3-bitarray: upgrade 2.6.2 -> 2.7.0
        python3-cantools: upgrade 38.0.1 -> 38.0.2
        python3-coverage: upgrade 7.0.5 -> 7.1.0
        python3-cmd2: upgrade 2.4.2 -> 2.4.3
        python3-django: upgrade 4.1.3 -> 4.1.6
        python3-dateparser: upgrade 1.1.6 -> 1.1.7
        python3-elementpath: upgrade 3.0.2 -> 4.0.1
        python3-evdev: upgrade 1.6.0 -> 1.6.1
        python3-flask-wtf: upgrade 1.1.0 -> 1.1.1
        python3-fastnumbers: upgrade 3.2.1 -> 4.0.1
        python3-flask-migrate: upgrade 4.0.1 -> 4.0.4
        python3-luma-oled: upgrade 3.9.0 -> 3.11.0
        python3-google-api-python-client: upgrade 2.72.0 -> 2.77.0
        python3-ipython: upgrade 8.8.0 -> 8.9.0
        python3-icu: upgrade 2.8.1 -> 2.10.2
        python3-license-expression: upgrade 30.0.0 -> 30.1.0
        python3-meh: upgrade 0.50.1 -> 0.51
        python3-portalocker: upgrade 2.6.0 -> 2.7.0
        python3-pandas: upgrade 1.5.2 -> 1.5.3
        python3-openpyxl: upgrade 3.0.10 -> 3.1.0
        python3-paramiko: upgrade 2.12.0 -> 3.0.0
        python3-portion: Upgrade 2.3.0 -> 2.3.1
        python3-pymisp: upgrade 2.4.167 -> 2.4.168
        python3-pymodbus: upgrade 3.1.0 -> 3.1.3
        python3-pykickstart: upgrade 3.34 -> 3.43
        python3-pyscaffold: upgrade 4.3.1 -> 4.4
        python3-pywbem: upgrade 1.5.0 -> 1.6.0
        python3-sentry-sdk: upgrade 1.13.0 -> 1.15.0
        python3-qrcode: upgrade 7.3.1 -> 7.4.2
        python3-reedsolo: upgrade 1.6.1 -> 1.7.0
        python3-simplejson: upgrade 3.18.1 -> 3.18.3
        python3-traitlets: upgrade 5.8.1 -> 5.9.0
        python3-sqlalchemy: upgrade 1.4.46 -> 2.0.3
        python3-websocket-client: upgrade 1.4.2 -> 1.5.1
        python3-xlsxwriter: upgrade 3.0.7 -> 3.0.8
        python3-xmlschema: upgrade 2.1.1 -> 2.2.1
        ctags: upgrade 6.0.20230115.0 -> 6.0.20230212.0
        ddrescue: upgrade 1.26 -> 1.27
        editorconfig-core-c: upgrade 0.12.5 -> 0.12.6
        htpdate: upgrade 1.3.6 -> 1.3.7
        iscsi-initiator-utils: upgrade 2.1.7 -> 2.1.8
        geoclue: upgrade 2.6.0 -> 2.7.0
        htop: upgrade 3.2.1 -> 3.2.2
        hwdata: upgrade 0.366 -> 0.367
        glog: upgrade 0.5.0 -> 0.6.0
        libtevent: upgrade 0.13.0 -> 0.14.1
        libtdb: upgrade 1.4.7 -> 1.4.8
        libtalloc: upgrade 2.3.4 -> 2.4.0
        jack: upgrade 1.19.21 -> 1.19.22
        jsonrpc: upgrade 1.3.0 -> 1.4.1
        liburing: upgrade 2.2 -> 2.3
        libusb-compat: upgrade 0.1.7 -> 0.1.8
        networkmanager: upgrade 1.40.10 -> 1.42.0
        minicoredumper: upgrade 2.0.2 -> 2.0.3
        neon: upgrade 0.32.4 -> 0.32.5
        nano: upgrade 7.1 -> 7.2
        netplan: upgrade 0.104 -> 0.106
        rdma-core: upgrade 42.0 -> 44.0
        pcsc-tools: upgrade 1.6.1 -> 1.6.2
        poppler-data: upgrade 0.4.11 -> 0.4.12
        sshpass: upgrade 1.09 -> 1.10
        poppler: upgrade 23.01.0 -> 23.02.0
        postgresql: upgrade 14.5 -> 15.2
        sip: upgrade 6.7.5 -> 6.7.7
        uchardet: upgrade 0.0.7 -> 0.0.8
        zabbix: upgrade 6.2.6 -> 6.2.7
        uftrace: upgrade 0.13 -> 0.13.1
        krb5: Fix install conflict when enable multilib.
        libnet: Fix install conflict when enable multilib.
        imlib2: Fix install conflict when enable multilib.
        python3-aiofiles: upgrade 22.1.0 -> 23.1.0
        python3-aiohttp: upgrade 3.8.3 -> 3.8.4
        python3-alembic: upgrade 1.9.2 -> 1.9.4
        python3-antlr4-runtime: upgrade 4.11.1 -> 4.12.0
        python3-astroid: upgrade 2.14.1 -> 2.14.2
        python3-autobahn: upgrade 23.1.1 -> 23.1.2
        python3-bitstruct: upgrade 8.15.1 -> 8.17.0
        python3-bitarray: upgrade 2.7.0 -> 2.7.3
        python3-django: upgrade 4.1.6 -> 4.1.7
        python3-google-api-python-client: upgrade 2.77.0 -> 2.79.0
        python3-flask: upgrade 2.2.2 -> 2.2.3
        python3-huey: upgrade 2.4.4 -> 2.4.5
        python3-google-auth: upgrade 2.16.0 -> 2.16.1
        python3-ipython: upgrade 8.9.0 -> 8.10.0
        python3-imageio: upgrade 2.25.0 -> 2.25.1
        python3-openpyxl: upgrade 3.1.0 -> 3.1.1
        python3-pykickstart: upgrade 3.43 -> 3.44
        python3-pydantic: upgrade 1.10.4 -> 1.10.5
        python3-pytest-forked: upgrade 1.4.0 -> 1.6.0
        python3-pytest-xdist: upgrade 3.1.0 -> 3.2.0
        python3-redis: upgrade 4.4.2 -> 4.5.1
        python3-soupsieve: upgrade 2.3.2.post1 -> 2.4
        python3-simpleeval: upgrade 0.9.12 -> 0.9.13
        python3-stevedore: upgrade 4.1.1 -> 5.0.0
        python3-sqlalchemy: upgrade 2.0.3 -> 2.0.4
        python3-watchdog: upgrade 2.2.1 -> 2.3.0
        python3-werkzeug: upgrade 2.2.2 -> 2.2.3
        python3-zeroconf: upgrade 0.47.1 -> 0.47.3
        python3-coverage: upgrade 7.1.0 -> 7.2.0
        python3-eth-keyfile: upgrade 0.6.0 -> 0.6.1

  Yi Zhao (7):
        meta-python: fix Upstream-Status format
        meta-oe: fix Upstream-Status format
        meta-networking: fix Upstream-Status format
        fatresize: fix Upstream-Status format
        apache2: use /run instead of /var/run for systemd volatile config
        phpmyadmin: upgrade 5.2.0 -> 5.2.1
        ufs-utils: upgrade 1.9 -> 3.12.3

  bhargav_das@mentor.com (1):
        python3-daemon_2.3.2.bb: add python-daemon recipe for python3

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: I826d53d70744bc80ebe8b60203241dfddce7d5fe
diff --git a/poky/scripts/lib/buildstats.py b/poky/scripts/lib/buildstats.py
index 3b76286..fa94c65 100644
--- a/poky/scripts/lib/buildstats.py
+++ b/poky/scripts/lib/buildstats.py
@@ -79,8 +79,8 @@
             return self['rusage']['ru_oublock']
 
     @classmethod
-    def from_file(cls, buildstat_file):
-        """Read buildstat text file"""
+    def from_file(cls, buildstat_file, fallback_end=0):
+        """Read buildstat text file. fallback_end is an optional end time for tasks that are not recorded as finishing."""
         bs_task = cls()
         log.debug("Reading task buildstats from %s", buildstat_file)
         end_time = None
@@ -108,7 +108,10 @@
                     bs_task[ru_type][ru_key] = val
                 elif key == 'Status':
                     bs_task['status'] = val
-        if end_time is not None and start_time is not None:
+        # If the task didn't finish, fill in the fallback end time if specified
+        if start_time and not end_time and fallback_end:
+            end_time = fallback_end
+        if start_time and end_time:
             bs_task['elapsed_time'] = end_time - start_time
         else:
             raise BSError("{} looks like a invalid buildstats file".format(buildstat_file))
@@ -226,15 +229,33 @@
         epoch = match.group('epoch')
         return name, epoch, version, revision
 
+    @staticmethod
+    def parse_top_build_stats(path):
+        """
+        Parse the top-level build_stats file for build-wide start and duration.
+        """
+        with open(path) as fobj:
+            for line in fobj.readlines():
+                key, val = line.split(':', 1)
+                val = val.strip()
+                if key == 'Build Started':
+                    start = float(val)
+                elif key == "Elapsed time":
+                    elapsed = float(val.split()[0])
+        return start, elapsed
+
     @classmethod
     def from_dir(cls, path):
         """Load buildstats from a buildstats directory"""
-        if not os.path.isfile(os.path.join(path, 'build_stats')):
+        top_stats = os.path.join(path, 'build_stats')
+        if not os.path.isfile(top_stats):
             raise BSError("{} does not look like a buildstats directory".format(path))
 
         log.debug("Reading buildstats directory %s", path)
-
         buildstats = cls()
+        build_started, build_elapsed = buildstats.parse_top_build_stats(top_stats)
+        build_end = build_started + build_elapsed
+
         subdirs = os.listdir(path)
         for dirname in subdirs:
             recipe_dir = os.path.join(path, dirname)
@@ -244,7 +265,7 @@
             bsrecipe = BSRecipe(name, epoch, version, revision)
             for task in os.listdir(recipe_dir):
                 bsrecipe.tasks[task] = BSTask.from_file(
-                    os.path.join(recipe_dir, task))
+                    os.path.join(recipe_dir, task), build_end)
             if name in buildstats:
                 raise BSError("Cannot handle multiple versions of the same "
                               "package ({})".format(name))
diff --git a/poky/scripts/lib/checklayer/cases/common.py b/poky/scripts/lib/checklayer/cases/common.py
index 722d3cf..97b16f7 100644
--- a/poky/scripts/lib/checklayer/cases/common.py
+++ b/poky/scripts/lib/checklayer/cases/common.py
@@ -72,6 +72,21 @@
                 self.tc.layer['name'])
             self.fail('\n'.join(msg))
 
+    @unittest.expectedFailure
+    def test_patches_upstream_status(self):
+        import sys
+        sys.path.append(os.path.join(sys.path[0], '../../../../meta/lib/'))
+        import oe.qa
+        patches = []
+        for dirpath, dirs, files in os.walk(self.tc.layer['path']):
+            for filename in files:
+                if filename.endswith(".patch"):
+                    ppath = os.path.join(dirpath, filename)
+                    if oe.qa.check_upstream_status(ppath):
+                        patches.append(ppath)
+        self.assertEqual(len(patches), 0 , \
+                msg="Found following patches with malformed or missing upstream status:\n%s" % '\n'.join([str(patch) for patch in patches]))
+
     def test_signatures(self):
         if self.tc.layer['type'] == LayerType.SOFTWARE and \
            not self.tc.test_software_layer_signatures:
diff --git a/poky/scripts/lib/devtool/standard.py b/poky/scripts/lib/devtool/standard.py
index d64e18e..0339d12 100644
--- a/poky/scripts/lib/devtool/standard.py
+++ b/poky/scripts/lib/devtool/standard.py
@@ -567,6 +567,7 @@
         logger.debug('writing append file %s' % appendfile)
         with open(appendfile, 'a') as f:
             f.write('###--- _extract_source\n')
+            f.write('ERROR_QA:remove = "patch-fuzz"\n')
             f.write('DEVTOOL_TEMPDIR = "%s"\n' % tempdir)
             f.write('DEVTOOL_DEVBRANCH = "%s"\n' % devbranch)
             if not is_kernel_yocto:
diff --git a/poky/scripts/lib/resulttool/regression.py b/poky/scripts/lib/resulttool/regression.py
index 9f95295..74fd5f3 100644
--- a/poky/scripts/lib/resulttool/regression.py
+++ b/poky/scripts/lib/resulttool/regression.py
@@ -7,11 +7,173 @@
 #
 
 import resulttool.resultutils as resultutils
-import json
 
 from oeqa.utils.git import GitRepo
 import oeqa.utils.gitarchive as gitarchive
 
+METADATA_MATCH_TABLE = {
+    "oeselftest": "OESELFTEST_METADATA"
+}
+
+OESELFTEST_METADATA_GUESS_TABLE={
+    "trigger-build-posttrigger": {
+        "run_all_tests": False,
+        "run_tests":["buildoptions.SourceMirroring.test_yocto_source_mirror"],
+        "skips": None,
+        "machine": None,
+        "select_tags":None,
+        "exclude_tags": None
+    },
+    "reproducible": {
+        "run_all_tests": False,
+        "run_tests":["reproducible"],
+        "skips": None,
+        "machine": None,
+        "select_tags":None,
+        "exclude_tags": None
+    },
+    "arch-qemu-quick": {
+        "run_all_tests": True,
+        "run_tests":None,
+        "skips": None,
+        "machine": None,
+        "select_tags":["machine"],
+        "exclude_tags": None
+    },
+    "arch-qemu-full-x86-or-x86_64": {
+        "run_all_tests": True,
+        "run_tests":None,
+        "skips": None,
+        "machine": None,
+        "select_tags":["machine", "toolchain-system"],
+        "exclude_tags": None
+    },
+    "arch-qemu-full-others": {
+        "run_all_tests": True,
+        "run_tests":None,
+        "skips": None,
+        "machine": None,
+        "select_tags":["machine", "toolchain-user"],
+        "exclude_tags": None
+    },
+    "selftest": {
+        "run_all_tests": True,
+        "run_tests":None,
+        "skips": ["distrodata.Distrodata.test_checkpkg", "buildoptions.SourceMirroring.test_yocto_source_mirror", "reproducible"],
+        "machine": None,
+        "select_tags":None,
+        "exclude_tags": ["machine", "toolchain-system", "toolchain-user"]
+    },
+    "bringup": {
+        "run_all_tests": True,
+        "run_tests":None,
+        "skips": ["distrodata.Distrodata.test_checkpkg", "buildoptions.SourceMirroring.test_yocto_source_mirror"],
+        "machine": None,
+        "select_tags":None,
+        "exclude_tags": ["machine", "toolchain-system", "toolchain-user"]
+    }
+}
+
+def test_has_at_least_one_matching_tag(test, tag_list):
+    return "oetags" in test and any(oetag in tag_list for oetag in test["oetags"])
+
+def all_tests_have_at_least_one_matching_tag(results, tag_list):
+    return all(test_has_at_least_one_matching_tag(test_result, tag_list) or test_name.startswith("ptestresult") for (test_name, test_result) in results.items())
+
+def any_test_have_any_matching_tag(results, tag_list):
+    return any(test_has_at_least_one_matching_tag(test, tag_list) for test in results.values())
+
+def have_skipped_test(result, test_prefix):
+    return all( result[test]['status'] == "SKIPPED" for test in result if test.startswith(test_prefix))
+
+def have_all_tests_skipped(result, test_prefixes_list):
+    return all(have_skipped_test(result, test_prefix) for test_prefix in test_prefixes_list)
+
+def guess_oeselftest_metadata(results):
+    """
+    When an oeselftest test result is lacking OESELFTEST_METADATA, we can try to guess it based on results content.
+    Check results for specific values (absence/presence of oetags, number and name of executed tests...),
+    and if it matches one of known configuration from autobuilder configuration, apply guessed OSELFTEST_METADATA
+    to it to allow proper test filtering.
+    This guessing process is tightly coupled to config.json in autobuilder. It should trigger less and less,
+    as new tests will have OESELFTEST_METADATA properly appended at test reporting time
+    """
+
+    if len(results) == 1 and "buildoptions.SourceMirroring.test_yocto_source_mirror" in results:
+        return OESELFTEST_METADATA_GUESS_TABLE['trigger-build-posttrigger']
+    elif all(result.startswith("reproducible") for result in results):
+        return OESELFTEST_METADATA_GUESS_TABLE['reproducible']
+    elif all_tests_have_at_least_one_matching_tag(results, ["machine"]):
+        return OESELFTEST_METADATA_GUESS_TABLE['arch-qemu-quick']
+    elif all_tests_have_at_least_one_matching_tag(results, ["machine", "toolchain-system"]):
+        return OESELFTEST_METADATA_GUESS_TABLE['arch-qemu-full-x86-or-x86_64']
+    elif all_tests_have_at_least_one_matching_tag(results, ["machine", "toolchain-user"]):
+        return OESELFTEST_METADATA_GUESS_TABLE['arch-qemu-full-others']
+    elif not any_test_have_any_matching_tag(results, ["machine", "toolchain-user", "toolchain-system"]):
+        if have_all_tests_skipped(results, ["distrodata.Distrodata.test_checkpkg", "buildoptions.SourceMirroring.test_yocto_source_mirror", "reproducible"]):
+            return OESELFTEST_METADATA_GUESS_TABLE['selftest']
+        elif have_all_tests_skipped(results, ["distrodata.Distrodata.test_checkpkg", "buildoptions.SourceMirroring.test_yocto_source_mirror"]):
+            return OESELFTEST_METADATA_GUESS_TABLE['bringup']
+
+    return None
+
+
+def metadata_matches(base_configuration, target_configuration):
+    """
+    For passed base and target, check test type. If test type matches one of
+    properties described in METADATA_MATCH_TABLE, compare metadata if it is
+    present in base. Return true if metadata matches, or if base lacks some
+    data (either TEST_TYPE or the corresponding metadata)
+    """
+    test_type = base_configuration.get('TEST_TYPE')
+    if test_type not in METADATA_MATCH_TABLE:
+        return True
+
+    metadata_key = METADATA_MATCH_TABLE.get(test_type)
+    if target_configuration.get(metadata_key) != base_configuration.get(metadata_key):
+        return False
+
+    return True
+
+
+def machine_matches(base_configuration, target_configuration):
+    return base_configuration.get('MACHINE') == target_configuration.get('MACHINE')
+
+
+def can_be_compared(logger, base, target):
+    """
+    Some tests are not relevant to be compared, for example some oeselftest
+    run with different tests sets or parameters. Return true if tests can be
+    compared
+    """
+    ret = True
+    base_configuration = base['configuration']
+    target_configuration = target['configuration']
+
+    # Older test results lack proper OESELFTEST_METADATA: if not present, try to guess it based on tests results.
+    if base_configuration.get('TEST_TYPE') == 'oeselftest' and 'OESELFTEST_METADATA' not in base_configuration:
+        guess = guess_oeselftest_metadata(base['result'])
+        if guess is None:
+            logger.error(f"ERROR: did not manage to guess oeselftest metadata for {base_configuration['STARTTIME']}")
+        else:
+            logger.debug(f"Enriching {base_configuration['STARTTIME']} with {guess}")
+            base_configuration['OESELFTEST_METADATA'] = guess
+    if target_configuration.get('TEST_TYPE') == 'oeselftest' and 'OESELFTEST_METADATA' not in target_configuration:
+        guess = guess_oeselftest_metadata(target['result'])
+        if guess is None:
+            logger.error(f"ERROR: did not manage to guess oeselftest metadata for {target_configuration['STARTTIME']}")
+        else:
+            logger.debug(f"Enriching {target_configuration['STARTTIME']} with {guess}")
+            target_configuration['OESELFTEST_METADATA'] = guess
+
+    # Test runs with LTP results in should only be compared with other runs with LTP tests in them
+    if base_configuration.get('TEST_TYPE') == 'runtime' and any(result.startswith("ltpresult") for result in base['result']):
+        ret = target_configuration.get('TEST_TYPE') == 'runtime' and any(result.startswith("ltpresult") for result in target['result'])
+
+    return ret and metadata_matches(base_configuration, target_configuration) \
+        and machine_matches(base_configuration, target_configuration)
+
+
 def compare_result(logger, base_name, target_name, base_result, target_result):
     base_result = base_result.get('result')
     target_result = target_result.get('result')
@@ -62,6 +224,8 @@
             # removing any pairs which match
             for c in base.copy():
                 for b in target.copy():
+                    if not can_be_compared(logger, base_results[a][c], target_results[a][b]):
+                        continue
                     res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b])
                     if not res:
                         matches.append(resstr)
@@ -71,6 +235,8 @@
             # Should only now see regressions, we may not be able to match multiple pairs directly
             for c in base:
                 for b in target:
+                    if not can_be_compared(logger, base_results[a][c], target_results[a][b]):
+                        continue
                     res, resstr = compare_result(logger, c, b, base_results[a][c], target_results[a][b])
                     if res:
                         regressions.append(resstr)
@@ -82,6 +248,24 @@
 
     return 0
 
+# Some test case naming is poor and contains random strings, particularly lttng/babeltrace.
+# Truncating the test names works since they contain file and line number identifiers
+# which allows us to match them without the random components.
+def fixup_ptest_names(results, logger):
+    for r in results:
+        for i in results[r]:
+            tests = list(results[r][i]['result'].keys())
+            for test in tests:
+                new = None
+                if test.startswith(("ptestresult.lttng-tools.", "ptestresult.babeltrace.", "ptestresult.babeltrace2")) and "_-_" in test:
+                    new = test.split("_-_")[0]
+                elif test.startswith(("ptestresult.curl.")) and "__" in test:
+                    new = test.split("__")[0]
+                if new:
+                    results[r][i]['result'][new] = results[r][i]['result'][test]
+                    del results[r][i]['result'][test]
+
+
 def regression_git(args, logger):
     base_results = {}
     target_results = {}
@@ -143,6 +327,9 @@
     base_results = resultutils.git_get_result(repo, revs[index1][2])
     target_results = resultutils.git_get_result(repo, revs[index2][2])
 
+    fixup_ptest_names(base_results, logger)
+    fixup_ptest_names(target_results, logger)
+
     regression_common(args, logger, base_results, target_results)
 
     return 0
diff --git a/poky/scripts/lib/wic/partition.py b/poky/scripts/lib/wic/partition.py
index 2a916e0..382afa4 100644
--- a/poky/scripts/lib/wic/partition.py
+++ b/poky/scripts/lib/wic/partition.py
@@ -133,6 +133,8 @@
             self.update_fstab_in_rootfs = True
 
         if not self.source:
+            if self.fstype == "none":
+                return
             if not self.size and not self.fixed_size:
                 raise WicError("The %s partition has a size of zero. Please "
                                "specify a non-zero --size/--fixed-size for that "
@@ -405,6 +407,9 @@
                        (extraopts, self.fsuuid, rootfs, rootfs_dir)
         exec_native_cmd(erofs_cmd, native_sysroot, pseudo=pseudo)
 
+    def prepare_empty_partition_none(self, rootfs, oe_builddir, native_sysroot):
+        pass
+
     def prepare_empty_partition_ext(self, rootfs, oe_builddir,
                                     native_sysroot):
         """
diff --git a/poky/scripts/lib/wic/plugins/source/bootimg-efi.py b/poky/scripts/lib/wic/plugins/source/bootimg-efi.py
index 4b00913..d6aeab2 100644
--- a/poky/scripts/lib/wic/plugins/source/bootimg-efi.py
+++ b/poky/scripts/lib/wic/plugins/source/bootimg-efi.py
@@ -221,7 +221,7 @@
             elif source_params['loader'] == 'systemd-boot':
                 cls.do_configure_systemdboot(hdddir, creator, cr_workdir, source_params)
             elif source_params['loader'] == 'uefi-kernel':
-                return
+                pass
             else:
                 raise WicError("unrecognized bootimg-efi loader: %s" % source_params['loader'])
         except KeyError:
diff --git a/poky/scripts/oe-setup-builddir b/poky/scripts/oe-setup-builddir
index a13860c..89ae30f 100755
--- a/poky/scripts/oe-setup-builddir
+++ b/poky/scripts/oe-setup-builddir
@@ -62,7 +62,7 @@
 
 unset SHOWYPDOC
 if [ -z "$OECORELOCALCONF" ]; then
-    OECORELOCALCONF="$OEROOT/meta/conf/local.conf.sample"
+    OECORELOCALCONF="$OEROOT/meta/conf/templates/default/local.conf.sample"
 fi
 if [ ! -r "$BUILDDIR/conf/local.conf" ]; then
     cat <<EOM
@@ -77,7 +77,7 @@
 fi
 
 if [ -z "$OECORELAYERCONF" ]; then
-    OECORELAYERCONF="$OEROOT/meta/conf/bblayers.conf.sample"
+    OECORELAYERCONF="$OEROOT/meta/conf/templates/default/bblayers.conf.sample"
 fi
 if [ ! -r "$BUILDDIR/conf/bblayers.conf" ]; then
     cat <<EOM
@@ -117,7 +117,7 @@
 fi
 
 if [ -z "$OECORENOTESCONF" ]; then
-    OECORENOTESCONF="$OEROOT/meta/conf/conf-notes.txt"
+    OECORENOTESCONF="$OEROOT/meta/conf/templates/default/conf-notes.txt"
 fi
 [ ! -r "$OECORENOTESCONF" ] || cat "$OECORENOTESCONF"
 unset OECORENOTESCONF
diff --git a/poky/scripts/oe-setup-layers b/poky/scripts/oe-setup-layers
index d0bc9f1..c8012fa 100755
--- a/poky/scripts/oe-setup-layers
+++ b/poky/scripts/oe-setup-layers
@@ -19,8 +19,8 @@
 import os
 import subprocess
 
-def _is_layer_git_repo(layerdir):
-    git_dir = os.path.join(layerdir, ".git")
+def _is_repo_git_repo(repodir):
+    git_dir = os.path.join(repodir, ".git")
     if not os.access(git_dir, os.R_OK):
         return False
     try:
@@ -28,67 +28,73 @@
     except subprocess.CalledProcessError:
         return False
 
-def _is_layer_at_rev(layerdir, rev):
+def _is_repo_at_rev(repodir, rev):
     try:
-        curr_rev = subprocess.check_output("git -C %s rev-parse HEAD" % layerdir, shell=True, stderr=subprocess.DEVNULL)
+        curr_rev = subprocess.check_output("git -C %s rev-parse HEAD" % repodir, shell=True, stderr=subprocess.DEVNULL)
         if curr_rev.strip().decode("utf-8") == rev:
             return True
     except subprocess.CalledProcessError:
         pass
     return False
 
-def _is_layer_at_remote_uri(layerdir, remote, uri):
+def _is_repo_at_remote_uri(repodir, remote, uri):
     try:
-        curr_uri = subprocess.check_output("git -C %s remote get-url %s" % (layerdir, remote), shell=True, stderr=subprocess.DEVNULL)
+        curr_uri = subprocess.check_output("git -C %s remote get-url %s" % (repodir, remote), shell=True, stderr=subprocess.DEVNULL)
         if curr_uri.strip().decode("utf-8") == uri:
             return True
     except subprocess.CalledProcessError:
         pass
     return False
 
-def _do_checkout(args, json):
-    layers = json['sources']
-    for l_name in layers:
-        l_data = layers[l_name]
-        layerdir = os.path.abspath(os.path.join(args['destdir'], l_data['path']))
+def _contains_submodules(repodir):
+    return os.path.exists(os.path.join(repodir,".gitmodules"))
 
-        if 'contains_this_file' in l_data.keys():
+def _do_checkout(args, json):
+    repos = json['sources']
+    for r_name in repos:
+        r_data = repos[r_name]
+        repodir = os.path.abspath(os.path.join(args['destdir'], r_data['path']))
+
+        if 'contains_this_file' in r_data.keys():
             force_arg = 'force_bootstraplayer_checkout'
             if not args[force_arg]:
-                print('Note: not checking out source {layer}, use {layerflag} to override.'.format(layer=l_name, layerflag='--force-bootstraplayer-checkout'))
+                print('Note: not checking out source {repo}, use {repoflag} to override.'.format(repo=r_name, repoflag='--force-bootstraplayer-checkout'))
                 continue
-        l_remote = l_data['git-remote']
-        rev = l_remote['rev']
-        desc = l_remote['describe']
+        r_remote = r_data['git-remote']
+        rev = r_remote['rev']
+        desc = r_remote['describe']
         if not desc:
             desc = rev[:10]
-        branch = l_remote['branch']
-        remotes = l_remote['remotes']
+        branch = r_remote['branch']
+        remotes = r_remote['remotes']
 
-        print('\nSetting up source {}, revision {}, branch {}'.format(l_name, desc, branch))
-        if not _is_layer_git_repo(layerdir):
-            cmd = 'git init -q {}'.format(layerdir)
+        print('\nSetting up source {}, revision {}, branch {}'.format(r_name, desc, branch))
+        if not _is_repo_git_repo(repodir):
+            cmd = 'git init -q {}'.format(repodir)
             print("Running '{}'".format(cmd))
             subprocess.check_output(cmd, shell=True)
 
         for remote in remotes:
-            if not _is_layer_at_remote_uri(layerdir, remote, remotes[remote]['uri']):
+            if not _is_repo_at_remote_uri(repodir, remote, remotes[remote]['uri']):
                 cmd = "git remote remove {} > /dev/null 2>&1; git remote add {} {}".format(remote, remote, remotes[remote]['uri'])
-                print("Running '{}' in {}".format(cmd, layerdir))
-                subprocess.check_output(cmd, shell=True, cwd=layerdir)
+                print("Running '{}' in {}".format(cmd, repodir))
+                subprocess.check_output(cmd, shell=True, cwd=repodir)
 
                 cmd = "git fetch -q {} || true".format(remote)
-                print("Running '{}' in {}".format(cmd, layerdir))
-                subprocess.check_output(cmd, shell=True, cwd=layerdir)
+                print("Running '{}' in {}".format(cmd, repodir))
+                subprocess.check_output(cmd, shell=True, cwd=repodir)
 
-        if not _is_layer_at_rev(layerdir, rev):
+        if not _is_repo_at_rev(repodir, rev):
             cmd = "git fetch -q --all || true"
-            print("Running '{}' in {}".format(cmd, layerdir))
-            subprocess.check_output(cmd, shell=True, cwd=layerdir)
+            print("Running '{}' in {}".format(cmd, repodir))
+            subprocess.check_output(cmd, shell=True, cwd=repodir)
 
             cmd = 'git checkout -q {}'.format(rev)
-            print("Running '{}' in {}".format(cmd, layerdir))
-            subprocess.check_output(cmd, shell=True, cwd=layerdir)
+            print("Running '{}' in {}".format(cmd, repodir))
+            subprocess.check_output(cmd, shell=True, cwd=repodir)
+
+            if _contains_submodules(repodir):
+                print("Repo {} contains submodules, use 'git submodule update' to ensure they are up to date".format(repodir))
 
 parser = argparse.ArgumentParser(description="A self contained python script that fetches all the needed layers and sets them to correct revisions using data in a json format from a separate file. The json data can be created from an active build directory with 'bitbake-layers create-layers-setup destdir' and there's a sample file and a schema in meta/files/")
 
@@ -106,10 +112,10 @@
 args = parser.parse_args()
 
 with open(args.jsondata) as f:
-    json = json.load(f)
+    json_f = json.load(f)
 
 supported_versions = ["1.0"]
-if json["version"] not in supported_versions:
-    raise Exception("File {} has version {}, which is not in supported versions: {}".format(args.jsondata, json["version"], supported_versions))
+if json_f["version"] not in supported_versions:
+    raise Exception("File {} has version {}, which is not in supported versions: {}".format(args.jsondata, json_f["version"], supported_versions))
 
-_do_checkout(vars(args), json)
+_do_checkout(vars(args), json_f)
diff --git a/poky/scripts/runqemu b/poky/scripts/runqemu
index def11ea..58b0c19 100755
--- a/poky/scripts/runqemu
+++ b/poky/scripts/runqemu
@@ -211,7 +211,7 @@
         self.mac_slirp = "52:54:00:12:35:"
         # pid of the actual qemu process
         self.qemu_environ = os.environ.copy()
-        self.qemupid = None
+        self.qemuprocess = None
         # avoid cleanup twice
         self.cleaned = False
         # Files to cleanup after run
@@ -1366,6 +1366,15 @@
             raise RunQemuError("Failed to boot, QB_SYSTEM_NAME is NULL!")
         self.qemu_system = qemu_system
 
+    def check_render_nodes(self):
+        render_hint = """If /dev/dri/renderD* is absent due to lack of suitable GPU, 'modprobe vgem' will create one suitable for mesa llvmpipe software renderer."""
+        try:
+            content = os.listdir("/dev/dri")
+            if len([i for i in content if i.startswith('render')]) == 0:
+                raise RunQemuError("No render nodes found in /dev/dri: %s. %s" %(content, render_hint))
+        except FileNotFoundError:
+            raise RunQemuError("/dev/dri directory does not exist; no render nodes available on this machine. %s" %(render_hint))
+
     def setup_vga(self):
         if self.nographic == True:
             if self.sdl == True:
@@ -1403,6 +1412,7 @@
 
             self.qemu_opt += ' -display '
             if self.egl_headless == True:
+                self.check_render_nodes()
                 self.set_dri_path()
                 self.qemu_opt += 'egl-headless,'
             else:
@@ -1531,7 +1541,7 @@
             for descriptor in self.portlocks.values():
                 pass_fds.append(descriptor.fileno())
         process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds, env=self.qemu_environ)
-        self.qemupid = process.pid
+        self.qemuprocess = process
         retcode = process.wait()
         if retcode:
             if retcode == -signal.SIGTERM:
@@ -1554,6 +1564,15 @@
         signal.signal(signal.SIGTERM, signal.SIG_IGN)
 
         logger.info("Cleaning up")
+
+        if self.qemuprocess:
+            try:
+                # give it some time to shut down, ignore return values and output
+                self.qemuprocess.send_signal(signal.SIGTERM)
+                self.qemuprocess.communicate(timeout=5)
+            except subprocess.TimeoutExpired:
+                self.qemuprocess.kill()
+
         with open('/proc/uptime', 'r') as f:
             uptime_seconds = f.readline().split()[0]
         logger.info('Host uptime: %s\n' % uptime_seconds)
@@ -1581,6 +1600,9 @@
                 else:
                     shutil.rmtree(ent)
 
+        # Deliberately ignore the return code of 'tput smam'.
+        subprocess.call(["tput", "smam"])
+
         self.cleaned = True
 
     def run_bitbake_env(self, mach=None):
@@ -1657,12 +1679,8 @@
             subprocess.check_call([renice, str(os.getpid())])
 
         def sigterm_handler(signum, frame):
-            logger.info("SIGTERM received")
-            if config.qemupid:
-                os.kill(config.qemupid, signal.SIGTERM)
+            logger.info("Received signal: %s" % (signum))
             config.cleanup()
-            # Deliberately ignore the return code of 'tput smam'.
-            subprocess.call(["tput", "smam"])
         signal.signal(signal.SIGTERM, sigterm_handler)
 
         config.check_args()
@@ -1686,8 +1704,6 @@
     finally:
         config.cleanup_cmd()
         config.cleanup()
-        # Deliberately ignore the return code of 'tput smam'.
-        subprocess.call(["tput", "smam"])
 
 if __name__ == "__main__":
     sys.exit(main())
diff --git a/poky/scripts/yocto_testresults_query.py b/poky/scripts/yocto_testresults_query.py
new file mode 100755
index 0000000..3df9d60
--- /dev/null
+++ b/poky/scripts/yocto_testresults_query.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python3
+
+# Yocto Project test results management tool
+# This script is an thin layer over resulttool to manage tes results and regression reports.
+# Its main feature is to translate tags or branch names to revisions SHA1, and then to run resulttool
+# with those computed revisions
+#
+# Copyright (C) 2023 OpenEmbedded Contributors
+#
+# SPDX-License-Identifier: MIT
+#
+
+import sys
+import os
+import argparse
+import subprocess
+import tempfile
+import lib.scriptutils as scriptutils
+
+script_path = os.path.dirname(os.path.realpath(__file__))
+poky_path = os.path.abspath(os.path.join(script_path, ".."))
+resulttool = os.path.abspath(os.path.join(script_path, "resulttool"))
+logger = scriptutils.logger_create(sys.argv[0])
+testresults_default_url="git://git.yoctoproject.org/yocto-testresults"
+
+def create_workdir():
+    workdir = tempfile.mkdtemp(prefix='yocto-testresults-query.')
+    logger.info(f"Shallow-cloning testresults in {workdir}")
+    subprocess.check_call(["git", "clone", testresults_default_url, workdir, "--depth", "1"])
+    return workdir
+
+def get_sha1(pokydir, revision):
+    try:
+        rev = subprocess.check_output(["git", "rev-list", "-n", "1", revision], cwd=pokydir).decode('utf-8').strip()
+        logger.info(f"SHA-1 revision for {revision} in {pokydir} is {rev}")
+        return rev
+    except subprocess.CalledProcessError:
+        logger.error(f"Can not find SHA-1 for {revision} in {pokydir}")
+        return None
+
+def fetch_testresults(workdir, sha1):
+    logger.info(f"Fetching test results for {sha1} in {workdir}")
+    rawtags = subprocess.check_output(["git", "ls-remote", "--refs", "--tags", "origin", f"*{sha1}*"], cwd=workdir).decode('utf-8').strip()
+    if not rawtags:
+        raise Exception(f"No reference found for commit {sha1} in {workdir}")
+    for rev in [rawtag.split()[1] for rawtag in rawtags.splitlines()]:
+        logger.info(f"Fetching matching revisions: {rev}")
+        subprocess.check_call(["git", "fetch", "--depth", "1", "origin", f"{rev}:{rev}"], cwd=workdir)
+
+def compute_regression_report(workdir, baserevision, targetrevision):
+    logger.info(f"Running resulttool regression between SHA1 {baserevision} and {targetrevision}")
+    report = subprocess.check_output([resulttool, "regression-git", "--commit", baserevision, "--commit2", targetrevision, workdir]).decode("utf-8")
+    return report
+
+def print_report_with_header(report, baseversion, baserevision, targetversion, targetrevision):
+    print("========================== Regression report ==============================")
+    print(f'{"=> Target:": <16}{targetversion: <16}({targetrevision})')
+    print(f'{"=> Base:": <16}{baseversion: <16}({baserevision})')
+    print("===========================================================================\n")
+    print(report, end='')
+
+def regression(args):
+    logger.info(f"Compute regression report between {args.base} and {args.target}")
+    if args.testresultsdir:
+        workdir = args.testresultsdir
+    else:
+        workdir = create_workdir()
+
+    try:
+        baserevision = get_sha1(poky_path, args.base)
+        targetrevision = get_sha1(poky_path, args.target)
+        if not baserevision or not targetrevision:
+            logger.error("One or more revision(s) missing. You might be targeting nonexistant tags/branches, or are in wrong repository (you must use Poky and not oe-core)")
+            if not args.testresultsdir:
+                subprocess.check_call(["rm", "-rf",  workdir])
+            sys.exit(1)
+        fetch_testresults(workdir, baserevision)
+        fetch_testresults(workdir, targetrevision)
+        report = compute_regression_report(workdir, baserevision, targetrevision)
+        print_report_with_header(report, args.base, baserevision, args.target, targetrevision)
+    finally:
+        if not args.testresultsdir:
+            subprocess.check_call(["rm", "-rf",  workdir])
+
+def main():
+    parser = argparse.ArgumentParser(description="Yocto Project test results helper")
+    subparsers = parser.add_subparsers(
+        help="Supported commands for test results helper",
+        required=True)
+    parser_regression_report = subparsers.add_parser(
+        "regression-report",
+        help="Generate regression report between two fixed revisions. Revisions can be branch name or tag")
+    parser_regression_report.add_argument(
+        'base',
+        help="Revision or tag against which to compare results (i.e: the older)")
+    parser_regression_report.add_argument(
+        'target',
+        help="Revision or tag to compare against the base (i.e: the newer)")
+    parser_regression_report.add_argument(
+        '-t',
+        '--testresultsdir',
+        help=f"An existing test results directory. {sys.argv[0]} will automatically clone it and use default branch if not provided")
+    parser_regression_report.set_defaults(func=regression)
+
+    args = parser.parse_args()
+    args.func(args)
+
+if __name__ == '__main__':
+    try:
+        ret =  main()
+    except Exception:
+        ret = 1
+        import traceback
+        traceback.print_exc()
+    sys.exit(ret)