poky: subtree update:796be0593a..10c69538c0

Alan Perry (1):
      binutils: add libopcodes package for perf

Alex Stewart (1):
      opkg: upgrade to version 0.4.4

Alexander Kanavin (73):
      selftest/reproducible: enable world reproducibility test
      selftest/reproducible: add an exclusion list for items that are not yet reproducible
      kea: upgrade 1.7.10 -> 1.8.1
      valgrind: exclude bar_bad/bar_bad_xml from ptests
      bzip2: run ptests without valgrind
      lttng-tools: disable more failing ptests
      glib-2.0: add a patch to increase a test timeout
      acpica: upgrade 20201113 -> 20201217
      bind: upgrade 9.16.9 -> 9.16.10
      diffoscope: upgrade 161 -> 163
      dnf: upgrade 4.4.0 -> 4.5.2
      enchant2: upgrade 2.2.13 -> 2.2.14
      epiphany: upgrade 3.38.1 -> 3.38.2
      ethtool: upgrade 5.9 -> 5.10
      gtk+3: upgrade 3.24.23 -> 3.24.24
      init-system-helpers: upgrade 1.58 -> 1.60
      kbd: upgrade 2.3.0 -> 2.4.0
      kea: upgrade 1.8.1 -> 1.8.2
      libmodulemd: upgrade 2.9.4 -> 2.11.1
      libpcre2: upgrade 10.35 -> 10.36
      libtirpc: upgrade 1.2.6 -> 1.3.1
      libusb1: upgrade 1.0.23 -> 1.0.24
      libva: upgrade 2.9.0 -> 2.10.0
      libx11: upgrade 1.6.12 -> 1.7.0
      lighttpd: upgrade 1.4.56 -> 1.4.57
      ninja: upgrade 1.10.1 -> 1.10.2
      puzzles: upgrade to latest revision
      python3-hypothesis: upgrade 5.41.5 -> 5.43.3
      python3-py: upgrade 1.9.0 -> 1.10.0
      python3-setuptools-scm: upgrade 4.1.2 -> 5.0.1
      sqlite3: upgrade 3.33.0 -> 3.34.0
      stress-ng: upgrade 0.11.24 -> 0.12.00
      sudo: upgrade 1.9.3p1 -> 1.9.4p1
      sysvinit: upgrade 2.97 -> 2.98
      vala: upgrade 0.50.1 -> 0.50.2
      vulkan-headers: upgrade 1.2.154.0 -> 1.2.162.0
      webkitgtk: upgrade 2.30.2 -> 2.30.4
      xprop: upgrade 1.2.4 -> 1.2.5
      xserver-xorg: upgrade 1.20.9 -> 1.20.10
      glib-2.0: update 2.66.2 -> 2.66.4
      rpm: update 4.16.0 -> 4.16.1.2
      piglit: update to latest revision
      sbc: update 1.4 -> 1.5
      libdnf: update 0.55.0 -> 0.55.2
      libva-utils: update 2.9.1 -> 2.10.0
      python3-importlib-metadata: update 3.1.1 -> 3.3.0
      python3: update 3.9.0 -> 3.9.1
      vulkan-loader: upgrade 1.2.154.1 -> 1.2.162.0
      vulkan-tools: upgrade 1.2.154.0 -> 1.2.162.0
      systemd-bootchart: update 233 -> 234
      zstd: add recipe from meta-oe
      zstd: update 1.4.5 -> 1.4.8
      devtool: gitsm:// should be handled same as git:// in upgrades
      ovmf: upgrade 202008 -> 202011
      libksba: update 1.4.0 -> 1.5.0
      libjitterentropy: update 2.2.0 -> 3.0.0
      icu: update 68.1 -> 68.2
      gnutls: update 3.6.15 -> 3.7.0
      gnupg: update 2.2.23 -> 2.2.26
      boost: update 1.74.0 -> 1.75.0
      kexec-tools: update 2.0.20 -> 2.0.21
      vulkan-samples: update to latest revision
      libpam: update 1.3.1 -> 1.5.1
      strace: update 5.9 -> 5.10
      python3-pytest: update 6.1.2 -> 6.2.1
      mtools: update 4.0.25 -> 4.0.26
      gnu-config: update to latest revision
      cmake: update 3.18.4 -> 3.19.2
      ccache: upgrade 3.7.11 -> 4.1
      ccache.bbclass: use ccache from host distribution
      gawk: add missing ptest dependency
      util-linux: upgrade 2.36 -> 2.36.1
      ell: upgrade 0.33 -> 0.35

Anatol Belski (1):
      iproute2: Make it easier to manipulate SUBDIRS list from bbappend

Anuj Mittal (2):
      mesa: add more details to elf-tls patch
      mesa: remove patch disabling asm

Bruce Ashfield (23):
      linux-yocto-rt/5.4: update to -rt44
      linux-yocto/5.4: update to v5.4.80
      lttng-modules: fix build against v5.10+
      kern-tools: non-gcc config support and option re-classification
      linux-yocto/cfg: qemuppc: set CONFIG_SCSI to '=y'
      linux-yocto/5.4: update to v5.4.82
      linux-yocto/cfg: qemuarm64-gfx.cfg: add CONFIG_INPUT_UINPUT
      linux-yocto/5.4: update to v5.4.83
      linux-yocto/5.8/cfg: fix -tiny warnings
      linux-yocto/5.4/cfg: fix -tiny warnings
      systemtap: fix on target build for 4.4 and 5.10+
      linux-yocto/5.4/cfg: fix FIRMWARE_LOADER warnings
      kernel-devsrc: fix 32bit ARM devsrc builds
      linux-yocto/5.4: update to v5.4.85
      linux-yocto-dev: bump to v5.11-rc
      libc-headers: update to v5.10
      machine/qemuarm*: add vmalloc kernel parameter
      linux-yocto: introduce v5.10 reference kernel recipes
      linux-yocto/5.10: update to v5.10.2
      conf/machine: bump qemu preferred versions to 5.10
      poky/poky-tiny: set preferred kernel to 5.10
      yocto-bsp: explicitly set preferred version for reference boards
      poky-alt: don't use conditional assignment for preferred kernel version

Changqing Li (2):
      libexif: fix CVE-2020-0198; CVE-2020-0452
      libpam: support usrmerge

Chris Laplante (1):
      contrib/git-hooks: add a sendemail-validate example hook that adds FROM: lines to outgoing patch emails

Christopher Larson (2):
      grub-efi-cfg: exclude OVERRIDES from build_efi_cfg vardeps
      uboot-extlinux-config: exclude OVERRIDES from do_create_extlinux_config vardeps

Deepak Rawat (1):
      openssl: add support for mingw64 as target

Diego Sueiro (2):
      wic: Introduce empty plugin to create unformatted empty partitions
      modutils-initscripts: Use depmod -a when modules.dep is empty

Dmitry Baryshkov (3):
      perl: fix installation failure because of shell issue
      linux-firmware: upgrade 20201118 -> 20201218
      linux-firmware: package firmware for Lontium lt9611uxc bridge

Easwar Hariharan (1):
      classes/kernel-fitimage: make fitimage_emit_section_config more readable

Elvis Stansvik (1):
      ref-manual: terms: Fix poky tarball root folder

Jack Mitchell (1):
      distutils3: allow setup.py to be run from a different directory to ${S}

Joey Degges (4):
      bitbake: tests/fetch: Organize usehead tests by net requirements
      bitbake: tests/fetch: Document behavior of test_gitfetch_usehead
      bitbake: tests/fetch: Test usehead with a non-default name
      bitbake: fetch/git: Fix usehead for non-default names

Jose Quaresma (11):
      gstreamer1.0: upgrade 1.18.1 -> 1.18.2
      gstreamer1.0-plugins-bad: v4l2codecs fix typo
      gstreamer1.0-plugins-bad: add support for aom plugin
      gstreamer1.0-plugins-bad: add support for x265 plugin
      gstreamer1.0-plugins-bad: sctp plugin uses the internal usrsctp static lib
      gstreamer1.0-plugins-bad: remove unsupported plugins comment
      gstreamer1.0-plugins-bad: netsim plugin don't have external deps
      gstreamer1.0-plugins-bad: transcode plugin external deps is always present
      gstreamer1.0: use the correct meson option for the capabilities
      shaderc: upgrade 2020.3 -> 2020.4
      spirv-tools: upgrade 2020.5 -> 2020.6

Khairul Rohaizzat Jamaluddin (3):
      openssl: Update 1.1.1h -> 1.1.1i
      go: Update 1.15.5 -> 1.15.6
      curl: Update 7.73.0 -> 7.74.0

Khem Raj (21):
      musl: Update to latest master
      systemd: Fix reallocarray check
      go.bbclass: Use external linker for native packages
      qemuriscv: check serial consoles w.r.t. /proc/consoles
      busybox-inittab: Implement SYSVINIT_ENABLED_GETTYS and USE_VT
      initscripts: use quotes for shell variable comparision
      busybox: Install /etc/default/rcS when used as init system
      busybox: Run mdev as daemon
      rcS: Define identifier for init system used
      initscripts: Use initctl on sysvinit only
      busybox: Sync rcS.default with sysvinit
      ltp: Fix ltp-pan crash on 32bit arches using 64bit time_t
      pulseaudio: Fix build with clang for non-x86 target
      util-linux: Build fixes for 32bit arches with 64bit time_t
      libpam: Drop musl patches
      ccache: Build fixes for clang and riscv32
      shadow: Remove lastlog pam plugin on musl system
      rxvt-unicode: Disable lastlog on musl systems
      openssh: Disable lastlog on musl
      dropbear: Disable lastlog and wtmp on musl
      ccache: Fix build on aarch64/clang

Lee Chee Yang (2):
      gdk-pixbuf: fix CVE-2020-29385
      wic/direct/kparser: ensure fsuuid for vfat and msdos align with format

Li Wang (2):
      qemu: CVE-2020-25723
      qemu: CVE-2020-28916

Luca Boccassi (6):
      classes/kernel-fitimage: add ability to sign individual images
      systemd: update 246 -> 247
      systemd: add package config for systemd-oomd
      systemd: ship new systemd-dissect in -extra-utils
      systemd: set -Dmode=release as recommended by NEWS
      systemd: add RRECOMMENDS for weak dependencies, if enabled

Mark Jonas (1):
      parted: Make readline dependency optional

Martin Jansa (2):
      license.bbclass: Add COMMON_LICENSE_DIR and LICENSE_PATH dirs to PSEUDO_IGNORE_PATHS
      busybox.inc: install rcS, rcK and rcS.default only with busybox in VIRTUAL-RUNTIME_init_manager

Maxime Roussin-BĂ©langer (1):
      meta: add missing descriptions in some support recipes

Michael Halstead (1):
      releases: conf: add link to 3.2.1, update to include 3.2.1

Milan Shah (2):
      oe-pkgdata-util: Added a test to verify oe-pkgdata-util without parameters
      bitbake: utils: add docstrings to functions

Mingli Yu (1):
      kbd: fix transaction conflict

Nathan Rossi (7):
      gcc: Add patch to resolve i*86 tune configuration overrides
      qemu.inc: Add seccomp PACKAGECONFIG option
      ncurses: Prevent LDFLAGS being emitted in .pc files
      which: add nativesdk to BBCLASSEXTEND
      sed: add nativesdk to BBCLASSEXTEND
      grep: add nativesdk to BBCLASSEXTEND
      coreutils: enable xattrs by default for nativesdk

Ovidiu Panait (3):
      timezone: upgrade to 2020e
      timezone: upgrade to 2020f
      variables: Add documentation for KERNEL_DTC_FLAGS

Paul Barker (8):
      bitbake.conf: Prevent pyc file generation in pseudo context
      documentation: Simplify oe_wiki and oe_home links
      documentation: Simplify layerindex and layer links
      documentation: Simplify remaining yocto_home links
      profile-manual: Simplify yocto_bugs link
      ref-manual: Simplify oe_lists link
      documentation: Use https links where possible
      selftest: Add argument to keep build dir

Paul Eggleton (11):
      classes/kernel-fitimage: add variable for description
      classes/kernel-fitimage: allow substituting mkimage command
      classes/kernel-fitimage: add ability to add additional signing options
      oe-selftest: move FIT image tests to their own module
      oe-selftest: fitimage: Test for FIT_DESC
      oe-selftest: fitimage: add test for signing FIT images
      classes: minor corrections to kernel-fitimage section
      variables: clarify KERNEL_ALT_IMAGETYPE reference
      variables: explicitly state that UBOOT_MKIMAGE_DTCOPTS is optional
      variables: Add documentation for new kernel-fitimage vars
      ref-manual: use consistent capitalisation of U-Boot

Peter Kjellerstedt (7):
      lib/oe/path: Add canonicalize()
      bitbake.conf: Canonicalize paths in PSEUDO_IGNORE_PATHS
      wic: Pass canonicalized paths in PSEUDO_IGNORE_PATHS
      glibc: Make adjtime() for 32 bit support being called with delta == NULL
      bitbake: cache: Make CoreRecipeInfo include rprovides_pkg for skipped recipes
      bitbake: cooker: Include all packages a recipe provides in SkippedPackage.rprovides
      apr-util: Only specify --with-dbm=gdbm if gdbm support is enabled

Richard Purdie (22):
      pseudo: Drop patches merged into upstream branch
      bitbake: data_smart: Ensure hash reflects vardepvalue flags correctly
      linuxloader: Avoid confusing string concat errors
      systemd: Ensure uid/gid ranges are set deterministically
      grub: Fix build reproducibility issue
      u-boot-tools: Fix reproducibility issue
      grub: Add second fix for determinism issue
      oeqa/commands: Ensure sync can be found regardless of PATH
      cups: Mark CVE-2009-0032 as a non-issue
      cups: Mark CVE-2008-1033 as a non-issue
      groff: Fix reproducibility issue
      man-db: Avoid reproducibility failures after fixing groff-native
      meta-selftest/staticids: Add ids for other recipes
      selftest/reproducible: Add useradd-staticids to reproducible builds tests
      grub: Further reproducibility fix
      man-db: Fix reproducibility issue
      bitbake.conf: Add mkfifo to HOSTTOOLS
      bitbake.conf: Add /run/ to PSEUDO_IGNORE_PATHS
      ppp: Update 2.4.8 -> 2.4.9
      ppp: Fix reproducibility issue
      sanity: Bump min python version to 3.6
      pseudo: Add lchmod wrapper

Robert Yang (6):
      buildtools-tarball.bb: Fix PATH for environment setup script
      ncurses: Make ncurses-tools depend on ncurses-terminfo-base
      minicom: RDEPENDS on ncurses-terminfo-base
      archiver.bbclass: Fix --runall=deploy_archives for images
      ccache: Extend to nativesdk
      ccache.bbclass: Set CCACHE_TEMPDIR

Ross Burton (13):
      wic-image-minimal: only depend on syslinux on x86 targets
      syslinux: rewrite recipe so only target code is x86-specific
      wic-tools: don't build syslinux-native for targets without syslinux
      image-uefi.conf: add EFI arch variable
      systemd-boot: build the EFI stub
      systemd-boot: allow building for Arm targets
      wic-tools: add grub-efi and systemd-boot on arm64
      lib/oe/qa: handle the 'no specific instruction set' ELF e_machine value
      local.conf: add aarch64 to the SDKMACHINE example values
      kernel: set COMPATIBLE_HOST to *-linux
      bitbake.conf: default SDKMACHINE to the build host architecture
      diffstat: point the license checksum at the license
      ruby: remove tcl DEPENDS

Scott Murray (2):
      grub: fix "CVE:" line in one of the patches
      patch: fix CVE-2019-20633

Sinan Kaya (1):
      gcsections: add more suppressions for SDK builds

Steve Sakoman (1):
      oeqa/selftest/cases/devtool.py: fix typo in ignore_patterns call

Tanu Kaskinen (6):
      maintainers.inc: remove myself from maintainers
      pulseaudio: Remove OE_LT_RPATH_ALLOW
      pulseaudio: disable EsounD support
      pulseaudio: disable GConf support
      pulseaudio: switch build system from Autotools to Meson
      pulseaudio: fix client.conf location

Teoh Jay Shen (2):
      oeqa/terminal : improve the test case
      oeqa/suspend : add test for suspend state

Tim Orling (6):
      python3-hypothesis: upgrade 5.41.4 -> 5.41.5
      python3-importlib-metadata: upgrade 3.1.0 -> 3.1.1
      python3-pygments: upgrade v2.7.2 -> v2.7.3
      python3-setuptools: upgrade 50.3.2 -> 51.0.0
      python3-setuptools-scm: add python3-toml dep
      python3-packaging: upgrade 20.4 -> 20.8

Tomasz Dziendzielski (1):
      populate_sdk_base: Fix condition syntax if SDK_RELOCATE_AFTER_INSTALL is disabled

Trevor Woerner (7):
      mesa.inc: switch true/enabled false/disabled
      mesa: update 20.2.4 -> 20.3.1
      insane.bbclass: allow fifos
      selftest-chown: add test for fifos
      PSPLASH_FIFO_DIR: refactor
      psplash: fix working on first boot (sysvinit)
      psplash (sysvinit): add textual updates

Vivien Didelot (4):
      README.hardware: prettify headline
      README.hardware: fix the dd command
      meta-yocto-bsp: use provided variables
      meta-yocto-bsp: use mmcblk0 for root partition

Wang Mingyu (4):
      libaio: upgrade 0.3.111 -> 0.3.112
      readline: upgrade 8.0 -> 8.1
      man-pages: upgrade 5.09 ->5.10
      mobile-broadband-provider-info: upgrade 20190618 ->20201225

Yi Zhao (6):
      dhcpcd: upgrade 9.3.2 -> 9.3.4
      dhcpcd: fix SECCOMP for i386
      inetutils: add dnsdomainname to ALTERNATIVE
      libcap: update 2.45 -> 2.46
      libcap-ng: upgrade 0.8.1 -> 0.8.2
      dhcpcd: upgrade 9.3.4 -> 9.4.0

Zhixiong Chi (1):
      glibc: CVE-2020-29562 and CVE-2020-29573

zangrc (3):
      bash: Rename patch name
      systemtap: upgrade 4.3 -> 4.4
      msmtp: upgrade 1.8.13 -> 1.8.14

zhengruoqin (2):
      cantarell-fonts: upgrade 0.201 -> 0.301
      gdbm: upgrade 1.18.1 -> 1.19

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: I9000a711651a4e884e8bfccc438c95fce184b35e
diff --git a/poky/meta/lib/oeqa/runtime/cases/suspend.py b/poky/meta/lib/oeqa/runtime/cases/suspend.py
new file mode 100644
index 0000000..67b6f7e
--- /dev/null
+++ b/poky/meta/lib/oeqa/runtime/cases/suspend.py
@@ -0,0 +1,33 @@
+from oeqa.runtime.case import OERuntimeTestCase
+from oeqa.core.decorator.depends import OETestDepends
+from oeqa.core.decorator.data import skipIfQemu
+import threading
+import time
+
+class Suspend_Test(OERuntimeTestCase):
+
+    def test_date(self): 
+        (status, output) = self.target.run('date')
+        self.assertEqual(status, 0,  msg = 'Failed to run date command, output : %s' % output)
+        
+    def test_ping(self):
+        t_thread = threading.Thread(target=self.target.run, args=("ping 8.8.8.8",))
+        t_thread.start()
+        time.sleep(2)
+        
+        status, output = self.target.run('pidof ping')
+        self.target.run('kill -9 %s' % output)
+        self.assertEqual(status, 0, msg = 'Not able to find process that runs ping, output : %s' % output)  
+        
+    def set_suspend(self): 
+        (status, output) = self.target.run('sudo rtcwake -m mem -s 10')
+        self.assertEqual(status, 0,  msg = 'Failed to suspends your system to RAM, output : %s' % output)
+    
+    @skipIfQemu('qemuall', 'Test only runs on real hardware')
+    @OETestDepends(['ssh.SSHTest.test_ssh'])
+    def test_suspend(self):
+        self.test_date()
+        self.test_ping()
+        self.set_suspend()
+        self.test_date()
+        self.test_ping()
diff --git a/poky/meta/lib/oeqa/runtime/cases/terminal.py b/poky/meta/lib/oeqa/runtime/cases/terminal.py
index a268f26..8fcca99 100644
--- a/poky/meta/lib/oeqa/runtime/cases/terminal.py
+++ b/poky/meta/lib/oeqa/runtime/cases/terminal.py
@@ -10,9 +10,12 @@
     @OEHasPackage(['matchbox-terminal'])
     @OETestDepends(['ssh.SSHTest.test_ssh'])
     def test_terminal_running(self):
-        t_thread = threading.Thread(target=self.target.run, args=('export DISPLAY=:0 && matchbox-terminal',))
+        t_thread = threading.Thread(target=self.target.run, args=("export DISPLAY=:0 && matchbox-terminal -e 'sh -c \"uname -a && exec sh\"'",))
         t_thread.start()
         time.sleep(2)
+        
         status, output = self.target.run('pidof matchbox-terminal')
+        number_of_terminal = len(output.split())
+        self.assertEqual(number_of_terminal, 1, msg='There should be only one terminal being launched. Number of terminal launched : %s' % number_of_terminal)
         self.target.run('kill -9 %s' % output)
-        self.assertEqual(status, 0, msg='Not able to find process that runs terminal.')   
+        self.assertEqual(status, 0, msg='Not able to find process that runs terminal.')     
diff --git a/poky/meta/lib/oeqa/selftest/cases/buildoptions.py b/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
index e91f0bd..d0f6477 100644
--- a/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
+++ b/poky/meta/lib/oeqa/selftest/cases/buildoptions.py
@@ -33,10 +33,10 @@
         self.assertTrue(incremental_removed, msg = "Match failed in:\n%s" % log_data_removed)
 
     def test_ccache_tool(self):
-        bitbake("ccache-native")
-        bb_vars = get_bb_vars(['SYSROOT_DESTDIR', 'bindir'], 'ccache-native')
-        p = bb_vars['SYSROOT_DESTDIR'] + bb_vars['bindir'] + "/" + "ccache"
-        self.assertTrue(os.path.isfile(p), msg = "No ccache found (%s)" % p)
+        bb_vars = get_bb_vars(['HOSTTOOLS_DIR'], 'm4-native')
+        p = bb_vars['HOSTTOOLS_DIR'] + "/" + "ccache"
+        if not os.path.isfile(p):
+            self.skipTest("No ccache binary found in %s" % bb_vars['HOSTTOOLS_DIR'])
         self.write_config('INHERIT += "ccache"')
         self.add_command_to_tearDown('bitbake -c clean m4-native')
         bitbake("m4-native -c clean")
diff --git a/poky/meta/lib/oeqa/selftest/cases/devtool.py b/poky/meta/lib/oeqa/selftest/cases/devtool.py
index b8edc89..4eba238 100644
--- a/poky/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/poky/meta/lib/oeqa/selftest/cases/devtool.py
@@ -57,7 +57,7 @@
                         if relpth.endswith('/'):
                             destdir = os.path.join(corecopydir, relpth)
                             # avoid race condition by not copying .pyc files YPBZ#13421,13803
-                            shutil.copytree(pth, destdir, ignore=ignore_patterns('*.pyc', '__pycache__'))
+                            shutil.copytree(pth, destdir, ignore=shutil.ignore_patterns('*.pyc', '__pycache__'))
                         else:
                             destdir = os.path.join(corecopydir, os.path.dirname(relpth))
                             bb.utils.mkdirhier(destdir)
diff --git a/poky/meta/lib/oeqa/selftest/cases/fitimage.py b/poky/meta/lib/oeqa/selftest/cases/fitimage.py
new file mode 100644
index 0000000..19b9f53
--- /dev/null
+++ b/poky/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -0,0 +1,233 @@
+#
+# SPDX-License-Identifier: MIT
+#
+
+from oeqa.selftest.case import OESelftestTestCase
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
+import os
+import json
+import re
+
+class FitImageTests(OESelftestTestCase):
+
+    def test_fit_image(self):
+        """
+        Summary:     Check if FIT image and Image Tree Source (its) are built
+                     and the Image Tree Source has the correct fields.
+        Expected:    1. fitImage and fitImage-its can be built
+                     2. The type, load address, entrypoint address and
+                     default values of kernel and ramdisk are as expected
+                     in the Image Tree Source. Not all the fields are tested,
+                     only the key fields that wont vary between different
+                     architectures.
+        Product:     oe-core
+        Author:      Usama Arif <usama.arif@arm.com>
+        """
+        config = """
+# Enable creation of fitImage
+KERNEL_IMAGETYPE = "Image"
+KERNEL_IMAGETYPES += " fitImage "
+KERNEL_CLASSES = " kernel-fitimage "
+
+# RAM disk variables including load address and entrypoint for kernel and RAM disk
+IMAGE_FSTYPES += "cpio.gz"
+INITRAMFS_IMAGE = "core-image-minimal"
+UBOOT_RD_LOADADDRESS = "0x88000000"
+UBOOT_RD_ENTRYPOINT = "0x88000000"
+UBOOT_LOADADDRESS = "0x80080000"
+UBOOT_ENTRYPOINT = "0x80080000"
+FIT_DESC = "A model description"
+"""
+        self.write_config(config)
+
+        # fitImage is created as part of linux recipe
+        bitbake("virtual/kernel")
+
+        image_type = "core-image-minimal"
+        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+        machine = get_bb_var('MACHINE')
+        fitimage_its_path = os.path.join(deploy_dir_image,
+            "fitImage-its-%s-%s-%s" % (image_type, machine, machine))
+        fitimage_path = os.path.join(deploy_dir_image,
+            "fitImage-%s-%s-%s" % (image_type, machine, machine))
+
+        self.assertTrue(os.path.exists(fitimage_its_path),
+            "%s image tree source doesn't exist" % (fitimage_its_path))
+        self.assertTrue(os.path.exists(fitimage_path),
+            "%s FIT image doesn't exist" % (fitimage_path))
+
+        # Check that the type, load address, entrypoint address and default
+        # values for kernel and ramdisk in Image Tree Source are as expected.
+        # The order of fields in the below array is important. Not all the
+        # fields are tested, only the key fields that wont vary between
+        # different architectures.
+        its_field_check = [
+            'description = "A model description";',
+            'type = "kernel";',
+            'load = <0x80080000>;',
+            'entry = <0x80080000>;',
+            'type = "ramdisk";',
+            'load = <0x88000000>;',
+            'entry = <0x88000000>;',
+            'default = "conf@1";',
+            'kernel = "kernel@1";',
+            'ramdisk = "ramdisk@1";'
+            ]
+
+        with open(fitimage_its_path) as its_file:
+            field_index = 0
+            for line in its_file:
+                if field_index == len(its_field_check):
+                    break
+                if its_field_check[field_index] in line:
+                    field_index +=1
+
+        if field_index != len(its_field_check): # if its equal, the test passed
+            self.assertTrue(field_index == len(its_field_check),
+                "Fields in Image Tree Source File %s did not match, error in finding %s"
+                % (fitimage_its_path, its_field_check[field_index]))
+
+
+    def test_sign_fit_image(self):
+        """
+        Summary:     Check if FIT image and Image Tree Source (its) are created
+                     and signed correctly.
+        Expected:    1) its and FIT image are built successfully
+                     2) Scanning the its file indicates signing is enabled
+                        as requested by UBOOT_SIGN_ENABLE (using keys generated
+                        via FIT_GENERATE_KEYS)
+                     3) Dumping the FIT image indicates signature values
+                        are present (including for images as enabled via
+                        FIT_SIGN_INDIVIDUAL)
+                     4) Examination of the do_assemble_fitimage runfile/logfile
+                        indicate that UBOOT_MKIMAGE, UBOOT_MKIMAGE_SIGN and
+                        UBOOT_MKIMAGE_SIGN_ARGS are working as expected.
+        Product:     oe-core
+        Author:      Paul Eggleton <paul.eggleton@microsoft.com> based upon
+                     work by Usama Arif <usama.arif@arm.com>
+        """
+        config = """
+# Enable creation of fitImage
+MACHINE = "beaglebone-yocto"
+KERNEL_IMAGETYPES += " fitImage "
+KERNEL_CLASSES = " kernel-fitimage test-mkimage-wrapper "
+UBOOT_SIGN_ENABLE = "1"
+FIT_GENERATE_KEYS = "1"
+UBOOT_SIGN_KEYDIR = "${TOPDIR}/signing-keys"
+UBOOT_SIGN_KEYNAME = "oe-selftest"
+FIT_SIGN_INDIVIDUAL = "1"
+UBOOT_MKIMAGE_SIGN_ARGS = "-c 'a smart comment'"
+"""
+        self.write_config(config)
+
+        # fitImage is created as part of linux recipe
+        bitbake("virtual/kernel")
+
+        image_type = "core-image-minimal"
+        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+        machine = get_bb_var('MACHINE')
+        fitimage_its_path = os.path.join(deploy_dir_image,
+            "fitImage-its-%s" % (machine,))
+        fitimage_path = os.path.join(deploy_dir_image,
+            "fitImage-%s.bin" % (machine,))
+
+        self.assertTrue(os.path.exists(fitimage_its_path),
+            "%s image tree source doesn't exist" % (fitimage_its_path))
+        self.assertTrue(os.path.exists(fitimage_path),
+            "%s FIT image doesn't exist" % (fitimage_path))
+
+        req_itspaths = [
+            ['/', 'images', 'kernel@1'],
+            ['/', 'images', 'kernel@1', 'signature@1'],
+            ['/', 'images', 'fdt@am335x-boneblack.dtb'],
+            ['/', 'images', 'fdt@am335x-boneblack.dtb', 'signature@1'],
+            ['/', 'configurations', 'conf@am335x-boneblack.dtb'],
+            ['/', 'configurations', 'conf@am335x-boneblack.dtb', 'signature@1'],
+        ]
+
+        itspath = []
+        itspaths = []
+        linect = 0
+        sigs = {}
+        with open(fitimage_its_path) as its_file:
+            linect += 1
+            for line in its_file:
+                line = line.strip()
+                if line.endswith('};'):
+                    itspath.pop()
+                elif line.endswith('{'):
+                    itspath.append(line[:-1].strip())
+                    itspaths.append(itspath[:])
+                elif itspath and itspath[-1] == 'signature@1':
+                    itsdotpath = '.'.join(itspath)
+                    if not itsdotpath in sigs:
+                        sigs[itsdotpath] = {}
+                    if not '=' in line or not line.endswith(';'):
+                        self.fail('Unexpected formatting in %s sigs section line %d:%s' % (fitimage_its_path, linect, line))
+                    key, value = line.split('=', 1)
+                    sigs[itsdotpath][key.rstrip()] = value.lstrip().rstrip(';')
+
+        for reqpath in req_itspaths:
+            if not reqpath in itspaths:
+                self.fail('Missing section in its file: %s' % reqpath)
+
+        reqsigvalues_image = {
+            'algo': '"sha256,rsa2048"',
+            'key-name-hint': '"oe-selftest"',
+        }
+        reqsigvalues_config = {
+            'algo': '"sha256,rsa2048"',
+            'key-name-hint': '"oe-selftest"',
+            'sign-images': '"kernel", "fdt"',
+        }
+
+        for itspath, values in sigs.items():
+            if 'conf@' in itspath:
+                reqsigvalues = reqsigvalues_config
+            else:
+                reqsigvalues = reqsigvalues_image
+            for reqkey, reqvalue in reqsigvalues.items():
+                value = values.get(reqkey, None)
+                if value is None:
+                    self.fail('Missing key "%s" in its file signature section %s' % (reqkey, itspath))
+                self.assertEqual(value, reqvalue)
+
+        # Dump the image to see if it really got signed
+        bitbake("u-boot-tools-native -c addto_recipe_sysroot")
+        result = runCmd('bitbake -e u-boot-tools-native | grep ^RECIPE_SYSROOT_NATIVE=')
+        recipe_sysroot_native = result.output.split('=')[1].strip('"')
+        dumpimage_path = os.path.join(recipe_sysroot_native, 'usr', 'bin', 'dumpimage')
+        result = runCmd('%s -l %s' % (dumpimage_path, fitimage_path))
+        in_signed = None
+        signed_sections = {}
+        for line in result.output.splitlines():
+            if line.startswith((' Configuration', ' Image')):
+                in_signed = re.search('\((.*)\)', line).groups()[0]
+            elif re.match('^ *', line) in (' ', ''):
+                in_signed = None
+            elif in_signed:
+                if not in_signed in signed_sections:
+                    signed_sections[in_signed] = {}
+                key, value = line.split(':', 1)
+                signed_sections[in_signed][key.strip()] = value.strip()
+        self.assertIn('kernel@1', signed_sections)
+        self.assertIn('fdt@am335x-boneblack.dtb', signed_sections)
+        self.assertIn('conf@am335x-boneblack.dtb', signed_sections)
+        for signed_section, values in signed_sections.items():
+            value = values.get('Sign algo', None)
+            self.assertEqual(value, 'sha256,rsa2048:oe-selftest', 'Signature algorithm for %s not expected value' % signed_section)
+            value = values.get('Sign value', None)
+            self.assertEqual(len(value), 512, 'Signature value for section %s not expected length' % signed_section)
+
+        # Check for UBOOT_MKIMAGE_SIGN_ARGS
+        result = runCmd('bitbake -e virtual/kernel | grep ^T=')
+        tempdir = result.output.split('=', 1)[1].strip().strip('')
+        result = runCmd('grep "a smart comment" %s/run.do_assemble_fitimage' % tempdir, ignore_status=True)
+        self.assertEqual(result.status, 0, 'UBOOT_MKIMAGE_SIGN_ARGS value did not get used')
+
+        # Check for evidence of test-mkimage-wrapper class
+        result = runCmd('grep "### uboot-mkimage wrapper message" %s/log.do_assemble_fitimage' % tempdir, ignore_status=True)
+        self.assertEqual(result.status, 0, 'UBOOT_MKIMAGE did not work')
+        result = runCmd('grep "### uboot-mkimage signing wrapper message" %s/log.do_assemble_fitimage' % tempdir, ignore_status=True)
+        self.assertEqual(result.status, 0, 'UBOOT_MKIMAGE_SIGN did not work')
+
diff --git a/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py b/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
index 415e031..6723a81 100644
--- a/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
+++ b/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -264,80 +264,6 @@
 
         bitbake("--graphviz core-image-sato")
 
-    def test_fit_image(self):
-        """
-        Summary:     Check if FIT image and Image Tree Source (its) are built
-                     and the Image Tree Source has the correct fields.
-        Expected:    1. fitImage and fitImage-its can be built
-                     2. The type, load address, entrypoint address and
-                     default values of kernel and ramdisk are as expected
-                     in the Image Tree Source. Not all the fields are tested,
-                     only the key fields that wont vary between different
-                     architectures.
-        Product:     oe-core
-        Author:      Usama Arif <usama.arif@arm.com>
-        """
-        config = """
-# Enable creation of fitImage
-KERNEL_IMAGETYPE = "Image"
-KERNEL_IMAGETYPES += " fitImage "
-KERNEL_CLASSES = " kernel-fitimage "
-
-# RAM disk variables including load address and entrypoint for kernel and RAM disk
-IMAGE_FSTYPES += "cpio.gz"
-INITRAMFS_IMAGE = "core-image-minimal"
-UBOOT_RD_LOADADDRESS = "0x88000000"
-UBOOT_RD_ENTRYPOINT = "0x88000000"
-UBOOT_LOADADDRESS = "0x80080000"
-UBOOT_ENTRYPOINT = "0x80080000"
-"""
-        self.write_config(config)
-
-        # fitImage is created as part of linux recipe
-        bitbake("virtual/kernel")
-
-        image_type = "core-image-minimal"
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = get_bb_var('MACHINE')
-        fitimage_its_path = os.path.join(deploy_dir_image,
-            "fitImage-its-%s-%s-%s" % (image_type, machine, machine))
-        fitimage_path = os.path.join(deploy_dir_image,
-            "fitImage-%s-%s-%s" % (image_type, machine, machine))
-
-        self.assertTrue(os.path.exists(fitimage_its_path),
-            "%s image tree source doesn't exist" % (fitimage_its_path))
-        self.assertTrue(os.path.exists(fitimage_path),
-            "%s FIT image doesn't exist" % (fitimage_path))
-
-        # Check that the type, load address, entrypoint address and default
-        # values for kernel and ramdisk in Image Tree Source are as expected.
-        # The order of fields in the below array is important. Not all the
-        # fields are tested, only the key fields that wont vary between
-        # different architectures.
-        its_field_check = ['type = "kernel";',
-            'load = <0x80080000>;',
-            'entry = <0x80080000>;',
-            'type = "ramdisk";',
-            'load = <0x88000000>;',
-            'entry = <0x88000000>;',
-            'default = "conf@1";',
-            'kernel = "kernel@1";',
-            'ramdisk = "ramdisk@1";'
-            ]
-
-        with open(fitimage_its_path) as its_file:
-            field_index = 0
-            for line in its_file:
-                if field_index == len(its_field_check):
-                    break
-                if its_field_check[field_index] in line:
-                    field_index +=1
-
-        if field_index != len(its_field_check): # if its equal, the test passed
-            self.assertTrue(field_index == len(its_field_check),
-                "Fields in Image Tree Source File %s did not match, error in finding %s"
-                % (fitimage_its_path, its_field_check[field_index]))
-
     def test_image_gen_debugfs(self):
         """
         Summary:     Check debugfs generation
diff --git a/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py b/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py
index d0a2809..5a5f9b4 100644
--- a/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py
+++ b/poky/meta/lib/oeqa/selftest/cases/oelib/elf.py
@@ -21,6 +21,6 @@
         self.assertEqual(oe.qa.elf_machine_to_string(0xB7), "AArch64")
         self.assertEqual(oe.qa.elf_machine_to_string(0xF7), "BPF")
 
-        self.assertEqual(oe.qa.elf_machine_to_string(0x00), "Unknown (0)")
+        self.assertEqual(oe.qa.elf_machine_to_string(0x00), "Unset")
         self.assertEqual(oe.qa.elf_machine_to_string(0xDEADBEEF), "Unknown (3735928559)")
         self.assertEqual(oe.qa.elf_machine_to_string("foobar"), "Unknown ('foobar')")
diff --git a/poky/meta/lib/oeqa/selftest/cases/package.py b/poky/meta/lib/oeqa/selftest/cases/package.py
index 3010b1a..7166c39 100644
--- a/poky/meta/lib/oeqa/selftest/cases/package.py
+++ b/poky/meta/lib/oeqa/selftest/cases/package.py
@@ -168,6 +168,7 @@
         with runqemu('core-image-minimal') as qemu:
             for path in [ sysconfdir + "/selftest-chown/file",
                           sysconfdir + "/selftest-chown/dir",
-                          sysconfdir + "/selftest-chown/symlink"]:
+                          sysconfdir + "/selftest-chown/symlink",
+                          sysconfdir + "/selftest-chown/fifotest/fifo"]:
                 if not check_ownership(qemu, "test", "test", path):
                     self.fail('Test ownership %s failed' % path)
diff --git a/poky/meta/lib/oeqa/selftest/cases/pkgdata.py b/poky/meta/lib/oeqa/selftest/cases/pkgdata.py
index 833a180..254abc4 100644
--- a/poky/meta/lib/oeqa/selftest/cases/pkgdata.py
+++ b/poky/meta/lib/oeqa/selftest/cases/pkgdata.py
@@ -218,3 +218,9 @@
     def test_specify_pkgdatadir(self):
         result = runCmd('oe-pkgdata-util -p %s lookup-pkg zlib' % get_bb_var('PKGDATA_DIR'))
         self.assertEqual(result.output, 'libz1')
+
+    def test_no_param(self):
+        result = runCmd('oe-pkgdata-util', ignore_status=True)
+        self.assertEqual(result.status, 2, "Status different than 2. output: %s" % result.output)
+        currpos = result.output.find('usage: oe-pkgdata-util')
+        self.assertTrue(currpos != -1, msg = "Test is Failed. Help is not Displayed in %s" % result.output)
diff --git a/poky/meta/lib/oeqa/selftest/cases/pseudo.py b/poky/meta/lib/oeqa/selftest/cases/pseudo.py
new file mode 100644
index 0000000..33593d5
--- /dev/null
+++ b/poky/meta/lib/oeqa/selftest/cases/pseudo.py
@@ -0,0 +1,27 @@
+#
+# SPDX-License-Identifier: MIT
+#
+
+import glob
+import os
+import shutil
+from oeqa.utils.commands import bitbake, get_test_layer
+from oeqa.selftest.case import OESelftestTestCase
+
+class Pseudo(OESelftestTestCase):
+
+    def test_pseudo_pyc_creation(self):
+        self.write_config("")
+
+        metaselftestpath = get_test_layer()
+        pycache_path = os.path.join(metaselftestpath, 'lib/__pycache__')
+        if os.path.exists(pycache_path):
+            shutil.rmtree(pycache_path)
+
+        bitbake('pseudo-pyc-test -c install')
+
+        test1_pyc_present = len(glob.glob(os.path.join(pycache_path, 'pseudo_pyc_test1.*.pyc')))
+        self.assertTrue(test1_pyc_present, 'test1 pyc file missing, should be created outside of pseudo context.')
+
+        test2_pyc_present = len(glob.glob(os.path.join(pycache_path, 'pseudo_pyc_test2.*.pyc')))
+        self.assertFalse(test2_pyc_present, 'test2 pyc file present, should not be created in pseudo context.')
diff --git a/poky/meta/lib/oeqa/selftest/cases/reproducible.py b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
index a7ef336..eee494e 100644
--- a/poky/meta/lib/oeqa/selftest/cases/reproducible.py
+++ b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
@@ -17,6 +17,72 @@
 import os
 import datetime
 
+# For sample packages, see:
+# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20201127-0t7wr_oo/
+# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20201127-4s9ejwyp/
+# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20201127-haiwdlbr/
+# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20201127-hwds3mcl/
+# https://autobuilder.yocto.io/pub/repro-fail/oe-reproducible-20201203-sua0pzvc/
+# (both packages/ and packages-excluded/)
+exclude_packages = [
+	'acpica-src',
+	'babeltrace2-ptest',
+	'bootchart2-doc',
+	'cups',
+	'cwautomacros',
+	'dtc',
+	'efivar',
+	'epiphany',
+	'gcr',
+	'git',
+	'glide',
+	'go-dep',
+	'go-helloworld',
+	'go-runtime',
+	'go_',
+	'groff',
+	'gst-devtools',
+	'gstreamer1.0-python',
+	'gtk-doc',
+	'igt-gpu-tools',
+        'kernel-devsrc',
+	'libaprutil',
+	'libcap-ng',
+	'libhandy-1-src',
+	'libid3tag',
+	'libproxy',
+	'libsecret-dev',
+	'libsecret-src',
+	'lttng-tools-dbg',
+	'lttng-tools-ptest',
+	'ltp',
+	'meson',
+	'ovmf-shell-efi',
+	'parted-ptest',
+	'perf',
+	'python3-cython',
+	'qemu',
+	'quilt-ptest',
+	'rsync',
+	'ruby',
+	'spirv-tools-dev',
+	'swig',
+	'syslinux-misc',
+	'systemd-bootchart',
+	'valgrind-ptest',
+	'vim',
+	'watchdog',
+	'xmlto',
+	'xorg-minimal-fonts'
+	]
+
+def is_excluded(package):
+    package_name = os.path.basename(package)
+    for i in exclude_packages:
+        if package_name.startswith(i):
+            return True
+    return False
+
 MISSING = 'MISSING'
 DIFFERENT = 'DIFFERENT'
 SAME = 'SAME'
@@ -39,6 +105,7 @@
         self.total = []
         self.missing = []
         self.different = []
+        self.different_excluded = []
         self.same = []
 
     def add_result(self, r):
@@ -46,7 +113,10 @@
         if r.status == MISSING:
             self.missing.append(r)
         elif r.status == DIFFERENT:
-            self.different.append(r)
+            if is_excluded(r.reference):
+                self.different_excluded.append(r)
+            else:
+                self.different.append(r)
         else:
             self.same.append(r)
 
@@ -54,10 +124,11 @@
         self.total.sort()
         self.missing.sort()
         self.different.sort()
+        self.different_excluded.sort()
         self.same.sort()
 
     def __str__(self):
-        return 'same=%i different=%i missing=%i total=%i' % (len(self.same), len(self.different), len(self.missing), len(self.total))
+        return 'same=%i different=%i different_excluded=%i missing=%i total=%i' % (len(self.same), len(self.different), len(self.different_excluded), len(self.missing), len(self.total))
 
 def compare_file(reference, test, diffutils_sysroot):
     result = CompareResult()
@@ -105,7 +176,7 @@
 
 class ReproducibleTests(OESelftestTestCase):
     package_classes = ['deb', 'ipk']
-    images = ['core-image-minimal', 'core-image-sato', 'core-image-full-cmdline']
+    images = ['core-image-minimal', 'core-image-sato', 'core-image-full-cmdline', 'world']
     save_results = False
     if 'OEQA_DEBUGGING_SAVED_OUTPUT' in os.environ:
         save_results = os.environ['OEQA_DEBUGGING_SAVED_OUTPUT']
@@ -176,6 +247,12 @@
             PACKAGE_CLASSES = "{package_classes}"
             INHIBIT_PACKAGE_STRIP = "1"
             TMPDIR = "{tmpdir}"
+            LICENSE_FLAGS_WHITELIST = "commercial"
+            DISTRO_FEATURES_append = ' systemd pam'
+            USERADDEXTENSION = "useradd-staticids"
+            USERADD_ERROR_DYNAMIC = "skip"
+            USERADD_UID_TABLES += "files/static-passwd"
+            USERADD_GID_TABLES += "files/static-group"
             ''').format(package_classes=' '.join('package_%s' % c for c in self.package_classes),
                         tmpdir=tmpdir)
 
@@ -235,6 +312,7 @@
 
                 self.write_package_list(package_class, 'missing', result.missing)
                 self.write_package_list(package_class, 'different', result.different)
+                self.write_package_list(package_class, 'different_excluded', result.different_excluded)
                 self.write_package_list(package_class, 'same', result.same)
 
                 if self.save_results:
@@ -242,8 +320,12 @@
                         self.copy_file(d.reference, '/'.join([save_dir, 'packages', strip_topdir(d.reference)]))
                         self.copy_file(d.test, '/'.join([save_dir, 'packages', strip_topdir(d.test)]))
 
+                    for d in result.different_excluded:
+                        self.copy_file(d.reference, '/'.join([save_dir, 'packages-excluded', strip_topdir(d.reference)]))
+                        self.copy_file(d.test, '/'.join([save_dir, 'packages-excluded', strip_topdir(d.test)]))
+
                 if result.missing or result.different:
-                    fails.append("The following %s packages are missing or different: %s" %
+                    fails.append("The following %s packages are missing or different and not in exclusion list: %s" %
                             (c, '\n'.join(r.test for r in (result.missing + result.different))))
 
         # Clean up empty directories
diff --git a/poky/meta/lib/oeqa/selftest/cases/wic.py b/poky/meta/lib/oeqa/selftest/cases/wic.py
index 714637e..091f0ab 100644
--- a/poky/meta/lib/oeqa/selftest/cases/wic.py
+++ b/poky/meta/lib/oeqa/selftest/cases/wic.py
@@ -990,6 +990,26 @@
             out = glob(self.resultdir + "%s-*direct" % wksname)
             self.assertEqual(1, len(out))
 
+    def test_empty_plugin(self):
+        """Test empty plugin"""
+        config = 'IMAGE_FSTYPES = "wic"\nWKS_FILE = "test_empty_plugin.wks"\n'
+        self.append_config(config)
+        self.assertEqual(0, bitbake('core-image-minimal').status)
+        self.remove_config(config)
+
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'MACHINE'])
+        deploy_dir = bb_vars['DEPLOY_DIR_IMAGE']
+        machine = bb_vars['MACHINE']
+        image_path = os.path.join(deploy_dir, 'core-image-minimal-%s.wic' % machine)
+        self.assertEqual(True, os.path.exists(image_path))
+
+        sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
+
+        # Fstype column from 'wic ls' should be empty for the second partition
+        # as listed in test_empty_plugin.wks
+        result = runCmd("wic ls %s -n %s | awk -F ' ' '{print $1 \" \" $5}' | grep '^2' | wc -w" % (image_path, sysroot))
+        self.assertEqual('1', result.output)
+
     @only_for_arch(['i586', 'i686', 'x86_64'])
     def test_biosplusefi_plugin_qemu(self):
         """Test biosplusefi plugin in qemu"""
diff --git a/poky/meta/lib/oeqa/selftest/context.py b/poky/meta/lib/oeqa/selftest/context.py
index dd3609c..1659926 100644
--- a/poky/meta/lib/oeqa/selftest/context.py
+++ b/poky/meta/lib/oeqa/selftest/context.py
@@ -34,7 +34,7 @@
         (builddir, newbuilddir) = self.setupfunc("-st", None, self.suite)
         ret = super().run(result)
         os.chdir(builddir)
-        if newbuilddir and ret.wasSuccessful():
+        if newbuilddir and ret.wasSuccessful() and self.removefunc:
             self.removefunc(newbuilddir)
 
 def removebuilddir(d):
@@ -54,7 +54,7 @@
     bb.utils.prunedir(d, ionice=True)
 
 class OESelftestTestContext(OETestContext):
-    def __init__(self, td=None, logger=None, machines=None, config_paths=None, newbuilddir=None):
+    def __init__(self, td=None, logger=None, machines=None, config_paths=None, newbuilddir=None, keep_builddir=None):
         super(OESelftestTestContext, self).__init__(td, logger)
 
         self.machines = machines
@@ -62,6 +62,11 @@
         self.config_paths = config_paths
         self.newbuilddir = newbuilddir
 
+        if keep_builddir:
+            self.removebuilddir = None
+        else:
+            self.removebuilddir = removebuilddir
+
     def setup_builddir(self, suffix, selftestdir, suite):
         builddir = os.environ['BUILDDIR']
         if not selftestdir:
@@ -119,9 +124,9 @@
         if processes:
             from oeqa.core.utils.concurrencytest import ConcurrentTestSuite
 
-            return ConcurrentTestSuite(suites, processes, self.setup_builddir, removebuilddir)
+            return ConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir)
         else:
-            return NonConcurrentTestSuite(suites, processes, self.setup_builddir, removebuilddir)
+            return NonConcurrentTestSuite(suites, processes, self.setup_builddir, self.removebuilddir)
 
     def runTests(self, processes=None, machine=None, skips=[]):
         if machine:
@@ -179,6 +184,9 @@
                 action='append', default=None,
                 help='Exclude all (unhidden) tests that match any of the specified tag(s). (exclude applies before select)')
 
+        parser.add_argument('-K', '--keep-builddir', action='store_true',
+                help='Keep the test build directory even if all tests pass')
+
         parser.add_argument('-B', '--newbuilddir', help='New build directory to use for tests.')
         parser.add_argument('-v', '--verbose', action='store_true')
         parser.set_defaults(func=self.run)
@@ -236,6 +244,7 @@
         self.tc_kwargs['init']['config_paths']['localconf'] = os.path.join(builddir, "conf/local.conf")
         self.tc_kwargs['init']['config_paths']['bblayers'] = os.path.join(builddir, "conf/bblayers.conf")
         self.tc_kwargs['init']['newbuilddir'] = args.newbuilddir
+        self.tc_kwargs['init']['keep_builddir'] = args.keep_builddir
 
         def tag_filter(tags):
             if args.exclude_tags:
diff --git a/poky/meta/lib/oeqa/utils/commands.py b/poky/meta/lib/oeqa/utils/commands.py
index 6c1535d..a71c16a 100644
--- a/poky/meta/lib/oeqa/utils/commands.py
+++ b/poky/meta/lib/oeqa/utils/commands.py
@@ -188,7 +188,10 @@
     # call sync around the tests to ensure the IO queue doesn't get too large, taking any IO
     # hit here rather than in bitbake shutdown.
     if sync:
+        p = os.environ['PATH']
+        os.environ['PATH'] = "/usr/bin:/bin:/usr/sbin:/sbin:" + p
         os.system("sync")
+        os.environ['PATH'] = p
 
     result.command = command
     result.status = cmd.status