Complete Yocto mirror with license table for TQMa6UL (2038-compliance)

- 264 license table entries with exact download URLs (224/264 resolved)
- Complete sources/ directory with all BitBake recipes
- Build configuration: tqma6ul-multi-mba6ulx, spaetzle (musl)
- Full traceability for Softwarefreigabeantrag
- GCC 13.4.0, Linux 6.6.102, U-Boot 2023.04, musl 1.2.4
- License distribution: GPL-2.0 (24), MIT (23), GPL-2.0+ (18), BSD-3 (16)
This commit is contained in:
Siggi (OpenClaw Agent)
2026-03-01 20:58:18 +00:00
commit 16accb6b24
15086 changed files with 1292356 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
SUMMARY = "Qemu helper scripts"
LICENSE = "GPL-2.0-only"
RDEPENDS:${PN} = "nativesdk-qemu nativesdk-unfs3 nativesdk-pseudo \
nativesdk-python3-shell nativesdk-python3-fcntl nativesdk-python3-logging \
"
LIC_FILES_CHKSUM = "file://${COREBASE}/scripts/runqemu;beginline=5;endline=10;md5=ac2b489a58739c7628a2604698db5e7f"
SRC_URI = "file://${COREBASE}/scripts/runqemu \
file://${COREBASE}/scripts/runqemu-addptable2image \
file://${COREBASE}/scripts/runqemu-gen-tapdevs \
file://${COREBASE}/scripts/runqemu-ifup \
file://${COREBASE}/scripts/runqemu-ifdown \
file://${COREBASE}/scripts/oe-find-native-sysroot \
file://${COREBASE}/scripts/runqemu-extract-sdk \
file://${COREBASE}/scripts/runqemu-export-rootfs \
"
S = "${WORKDIR}"
inherit nativesdk
do_compile() {
:
}
do_install() {
install -d ${D}${bindir}
install -m 0755 ${WORKDIR}${COREBASE}/scripts/oe-* ${D}${bindir}/
install -m 0755 ${WORKDIR}${COREBASE}/scripts/runqemu* ${D}${bindir}/
}

View File

@@ -0,0 +1,23 @@
SUMMARY = "Helper utilities needed by the runqemu script"
LICENSE = "GPL-2.0-only"
RDEPENDS:${PN} = "qemu-system-native"
LIC_FILES_CHKSUM = "file://${WORKDIR}/qemu-oe-bridge-helper.c;endline=4;md5=ae00a3bab86f2caaa8462eacda77f4d7"
SRC_URI = "file://qemu-oe-bridge-helper.c"
S = "${WORKDIR}"
inherit native
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} -Wall qemu-oe-bridge-helper.c -o qemu-oe-bridge-helper
}
do_install() {
install -d ${D}${bindir}
install qemu-oe-bridge-helper ${D}${bindir}/
}
DEPENDS += "qemu-system-native unfs3-native pseudo-native"
addtask addto_recipe_sysroot after do_populate_sysroot before do_build

View File

@@ -0,0 +1,40 @@
/*
* Copyright 2022 Garmin Ltd. or its subsidiaries
*
* SPDX-License-Identifier: GPL-2.0
*
* Attempts to find and exec the host qemu-bridge-helper program
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
void try_program(char const* path, char** args) {
if (access(path, X_OK) == 0) {
execv(path, args);
}
}
int main(int argc, char** argv) {
char* var;
var = getenv("QEMU_BRIDGE_HELPER");
if (var && var[0] != '\0') {
execvp(var, argv);
return 1;
}
if (argc == 2 && strcmp(argv[1], "--help") == 0) {
fprintf(stderr, "Helper function to find and exec qemu-bridge-helper. Set QEMU_BRIDGE_HELPER to override default search path\n");
return 0;
}
try_program("/usr/libexec/qemu-bridge-helper", argv);
try_program("/usr/lib/qemu/qemu-bridge-helper", argv);
fprintf(stderr, "No bridge helper found\n");
return 1;
}

View File

@@ -0,0 +1,7 @@
require qemu.inc
inherit_defer native
EXTRA_OEMAKE:append = " LD='${LD}' AR='${AR}' OBJCOPY='${OBJCOPY}' LDFLAGS='${LDFLAGS}'"
LDFLAGS:append = " -fuse-ld=bfd"

View File

@@ -0,0 +1,9 @@
BPN = "qemu"
DEPENDS += "glib-2.0-native zlib-native"
require qemu-native.inc
EXTRA_OECONF:append = " --target-list=${@get_qemu_usermode_target_list(d)} --disable-tools --disable-install-blobs --disable-guest-agent"
PACKAGECONFIG ??= "pie"

View File

@@ -0,0 +1,31 @@
BPN = "qemu"
require qemu-native.inc
# As some of the files installed by qemu-native and qemu-system-native
# are the same, we depend on qemu-native to get the full installation set
# and avoid file clashes
DEPENDS += "glib-2.0-native zlib-native pixman-native qemu-native"
EXTRA_OECONF:append = " --target-list=${@get_qemu_system_target_list(d)}"
PACKAGECONFIG ??= "fdt alsa kvm pie slirp png \
${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virglrenderer epoxy', '', d)} \
"
# Handle distros such as CentOS 5 32-bit that do not have kvm support
PACKAGECONFIG:remove = "${@'kvm' if not os.path.exists('/usr/include/linux/kvm.h') else ''}"
do_install:append() {
install -Dm 0755 ${WORKDIR}/powerpc_rom.bin ${D}${datadir}/qemu
# The following is also installed by qemu-native
rm -f ${D}${datadir}/qemu/trace-events-all
rm -rf ${D}${datadir}/qemu/keymaps
rm -rf ${D}${datadir}/icons/
rm -rf ${D}${includedir}/qemu-plugin.h
# Install qmp.py to be used with testimage
install -d ${D}${libdir}/qemu-python/qmp/
install -D ${S}/python/qemu/qmp/* ${D}${libdir}/qemu-python/qmp/
}

View File

@@ -0,0 +1,28 @@
# possible arch values are:
# aarch64 arm armeb alpha cris i386 x86_64 m68k microblaze
# mips mipsel mips64 mips64el ppc ppc64 ppc64abi32 ppcemb
# riscv32 riscv64 sparc sparc32 sparc32plus
def get_qemu_target_list(d):
import bb
archs = d.getVar('QEMU_TARGETS').split()
tos = d.getVar('HOST_OS')
softmmuonly = ""
for arch in ['ppcemb', 'lm32']:
if arch in archs:
softmmuonly += arch + "-softmmu,"
archs.remove(arch)
linuxuseronly = ""
for arch in ['armeb', 'alpha', 'ppc64abi32', 'ppc64le', 'sparc32plus', 'aarch64_be']:
if arch in archs:
linuxuseronly += arch + "-linux-user,"
archs.remove(arch)
if 'linux' not in tos:
return softmmuonly + ''.join([arch + "-softmmu" + "," for arch in archs]).rstrip(',')
return softmmuonly + linuxuseronly + ''.join([arch + "-linux-user" + "," + arch + "-softmmu" + "," for arch in archs]).rstrip(',')
def get_qemu_usermode_target_list(d):
return ",".join(filter(lambda i: "-linux-user" in i, get_qemu_target_list(d).split(',')))
def get_qemu_system_target_list(d):
return ",".join(filter(lambda i: "-linux-user" not in i, get_qemu_target_list(d).split(',')))

View File

@@ -0,0 +1,316 @@
SUMMARY = "Fast open source processor emulator"
DESCRIPTION = "QEMU is a hosted virtual machine monitor: it emulates the \
machine's processor through dynamic binary translation and provides a set \
of different hardware and device models for the machine, enabling it to run \
a variety of guest operating systems"
HOMEPAGE = "http://qemu.org"
LICENSE = "GPL-2.0-only & LGPL-2.1-only"
DEPENDS += "bison-native meson-native ninja-native"
RDEPENDS:${PN}-ptest = "bash"
require qemu-targets.inc
# https://gitlab.com/qemu-project/qemu/-/commit/81e2b198a8cb4ee5fdf108bd438f44b193ee3a36 means
# we need a full python3-native setup
inherit pkgconfig ptest update-rc.d systemd python3native
LIC_FILES_CHKSUM = "file://COPYING;md5=441c28d2cf86e15a37fa47e15a72fbac \
file://COPYING.LIB;endline=24;md5=8c5efda6cf1e1b03dcfd0e6c0d271c7f"
SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
file://powerpc_rom.bin \
file://run-ptest \
file://0001-qemu-Add-addition-environment-space-to-boot-loader-q.patch \
file://0003-apic-fixup-fallthrough-to-PIC.patch \
file://0004-configure-Add-pkg-config-handling-for-libgcrypt.patch \
file://0005-qemu-Do-not-include-file-if-not-exists.patch \
file://0006-qemu-Add-some-user-space-mmap-tweaks-to-address-musl.patch \
file://0007-qemu-Determinism-fixes.patch \
file://0008-tests-meson.build-use-relative-path-to-refer-to-file.patch \
file://0009-Define-MAP_SYNC-and-MAP_SHARED_VALIDATE-on-needed-li.patch \
file://0010-hw-pvrdma-Protect-against-buggy-or-malicious-guest-d.patch \
file://0002-linux-user-Replace-use-of-lfs64-related-functions-an.patch \
file://fixedmeson.patch \
file://no-pip.patch \
file://4a8579ad8629b57a43daa62e46cc7af6e1078116.patch \
file://0002-linux-user-loongarch64-Remove-TARGET_FORCE_SHMLBA.patch \
file://0003-linux-user-Add-strace-for-shmat.patch \
file://0004-linux-user-Rewrite-target_shmat.patch \
file://0005-tests-tcg-Check-that-shmat-does-not-break-proc-self-.patch \
file://0001-sched_attr-Do-not-define-for-glibc-2.41.patch \
file://qemu-guest-agent.init \
file://qemu-guest-agent.udev \
"
UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar"
# SDK_OLDEST_KERNEL is set below 4.17, which is the minimum version required by QEMU >= 8.1
# This is due to two MMAP flags being used at certain points
SRC_URI:append:class-nativesdk = " \
file://0011-linux-user-workaround-for-missing-MAP_FIXED_NOREPLAC.patch \
file://0012-linux-user-workaround-for-missing-MAP_SHARED_VALIDAT.patch \
"
# Support building and using native version on pre 4.17 kernels
SRC_URI:append:class-native = " \
file://0011-linux-user-workaround-for-missing-MAP_FIXED_NOREPLAC.patch \
file://0012-linux-user-workaround-for-missing-MAP_SHARED_VALIDAT.patch \
"
SRC_URI[sha256sum] = "1f0604f296ab9acb4854c054764a1ba408643fc299bd54a6500cccfaaca65b55"
CVE_STATUS[CVE-2007-0998] = "not-applicable-config: The VNC server can expose host files uder some circumstances. We don't enable it by default."
# https://bugzilla.redhat.com/show_bug.cgi?id=1609015#c11
CVE_STATUS[CVE-2018-18438] = "disputed: The issues identified by this CVE were determined to not constitute a vulnerability."
# As per https://nvd.nist.gov/vuln/detail/CVE-2023-0664
# https://bugzilla.redhat.com/show_bug.cgi?id=2167423
CVE_STATUS[CVE-2023-0664] = "not-applicable-platform: Issue only applies on Windows"
# As per https://bugzilla.redhat.com/show_bug.cgi?id=2203387
CVE_STATUS[CVE-2023-2680] = "not-applicable-platform: RHEL specific issue."
CVE_STATUS[CVE-2023-3019] = "cpe-incorrect: Applies only against versions before 8.2.0"
CVE_STATUS[CVE-2023-5088] = "cpe-incorrect: Applies only against version 8.2.0 and earlier"
CVE_STATUS[CVE-2023-6683] = "cpe-incorrect: Applies only against version 8.2.1 and earlier"
CVE_STATUS[CVE-2023-6693] = "cpe-incorrect: Applies only against version 8.2.0 and earlier"
# NVD DB has this CVE as version-less (with "-")
CVE_STATUS[CVE-2024-6505] = "fixed-version: this CVE is fixed since 9.1.0"
CVE_STATUS[CVE-2023-1386] = "disputed: not an issue as per https://bugzilla.redhat.com/show_bug.cgi?id=2223985"
COMPATIBLE_HOST:mipsarchn32 = "null"
COMPATIBLE_HOST:mipsarchn64 = "null"
COMPATIBLE_HOST:riscv32 = "null"
# Per https://lists.nongnu.org/archive/html/qemu-devel/2020-09/msg03873.html
# upstream states qemu doesn't work without optimization
DEBUG_BUILD = "0"
do_install:append() {
# Prevent QA warnings about installed ${localstatedir}/run
if [ -d ${D}${localstatedir}/run ]; then rmdir ${D}${localstatedir}/run; fi
}
do_install_ptest() {
cp -rL ${B}/tests ${D}${PTEST_PATH}
find ${D}${PTEST_PATH}/tests -type f -name "*.[Sshcodp]" | xargs -i rm -rf {}
# Don't check the file genreated by configure
sed -i -e "1s,#!/usr/bin/bash,#!${base_bindir}/bash," ${D}${PTEST_PATH}/tests/data/acpi/disassemle-aml.sh
# Strip the paths from the QEMU variable, we can use PATH
makfiles=$(find ${D}${PTEST_PATH} -name "*.mak")
sed -i -e "s#^QEMU=.*/qemu-#QEMU=qemu-#g" $makfiles
# Strip compiler flags as they break reproducibility
sed -i -e "s,^CC=.*,CC=gcc," \
-e "s,^CCAS=.*,CCAS=gcc," \
-e "s,^LD=.*,LD=ld," $makfiles
# Update SRC_PATH variable to the right place on target
sed -i -e "s#^SRC_PATH=.*#SRC_PATH=${PTEST_PATH}#g" $makfiles
# https://gitlab.com/qemu-project/qemu/-/issues/1403
rm ${D}${PTEST_PATH}/tests/unit/test-io-channel-command
}
# QEMU_TARGETS is overridable variable
QEMU_TARGETS ?= "arm aarch64 i386 loongarch64 mips mipsel mips64 mips64el ppc ppc64 ppc64le riscv32 riscv64 sh4 x86_64"
EXTRA_OECONF = " \
--prefix=${prefix} \
--bindir=${bindir} \
--includedir=${includedir} \
--libdir=${libdir} \
--mandir=${mandir} \
--datadir=${datadir} \
--docdir=${docdir}/${BPN} \
--sysconfdir=${sysconfdir} \
--libexecdir=${libexecdir} \
--localstatedir=${localstatedir} \
--with-suffix=${BPN} \
--disable-strip \
--disable-werror \
--extra-cflags='${CFLAGS}' \
--extra-ldflags='${LDFLAGS}' \
--disable-download \
--disable-docs \
--host-cc='${BUILD_CC}' \
--disable-af-xdp \
${PACKAGECONFIG_CONFARGS} \
"
EXTRA_OECONF:append:class-target = " --cross-prefix=${HOST_PREFIX}"
EXTRA_OECONF:append:class-nativesdk = " --cross-prefix=${HOST_PREFIX}"
B = "${WORKDIR}/build"
#EXTRA_OECONF:append = " --python=${HOSTTOOLS_DIR}/python3"
do_configure:prepend:class-native() {
# Append build host pkg-config paths for native target since the host may provide sdl
BHOST_PKGCONFIG_PATH=$(PATH=/usr/bin:/bin pkg-config --variable pc_path pkg-config || echo "")
if [ ! -z "$BHOST_PKGCONFIG_PATH" ]; then
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$BHOST_PKGCONFIG_PATH
fi
}
do_configure() {
export PKG_CONFIG=pkg-config
${S}/configure ${EXTRA_OECONF}
}
do_configure[cleandirs] += "${B}"
do_install () {
export STRIP=""
oe_runmake 'DESTDIR=${D}' install
# If we built the guest agent, also install startup/udev rules
if [ -e "${D}${bindir}/qemu-ga" ]; then
install -d ${D}${sysconfdir}/init.d/
install -m 0755 ${WORKDIR}/qemu-guest-agent.init ${D}${sysconfdir}/init.d/qemu-guest-agent
sed -i 's:@bindir@:${bindir}:' ${D}${sysconfdir}/init.d/qemu-guest-agent
install -d ${D}${sysconfdir}/udev/rules.d/
install -m 0644 ${WORKDIR}/qemu-guest-agent.udev ${D}${sysconfdir}/udev/rules.d/60-qemu-guest-agent.rules
install -d ${D}${systemd_unitdir}/system/
install -m 0644 ${S}/contrib/systemd/qemu-guest-agent.service ${D}${systemd_unitdir}/system
sed -i -e 's,-/usr/bin/,-${bindir}/,g' ${D}${systemd_unitdir}/system/qemu-guest-agent.service
fi
# ELF binary /usr/share/qemu/s390-netboot.img has relocations in .text
rm ${D}${datadir}/qemu/s390-netboot.img -f
# ELF binary /usr/share/qemu/s390-ccw.img has relocations in .text [textrel]
rm ${D}${datadir}/qemu/s390-ccw.img -f
}
# The following fragment will create a wrapper for qemu-mips user emulation
# binary in order to work around a segmentation fault issue. Basically, by
# default, the reserved virtual address space for 32-on-64 bit is set to 4GB.
# This will trigger a MMU access fault in the virtual CPU. With this change,
# the qemu-mips works fine.
# IMPORTANT: This piece needs to be removed once the root cause is fixed!
do_install:append() {
if [ -e "${D}/${bindir}/qemu-mips" ]; then
create_wrapper ${D}/${bindir}/qemu-mips \
QEMU_RESERVED_VA=0x0
fi
}
# END of qemu-mips workaround
# Disable kvm/virgl/mesa on targets that do not support it
PACKAGECONFIG:remove:darwin = "kvm virglrenderer epoxy gtk+"
PACKAGECONFIG:remove:mingw32 = "kvm virglrenderer epoxy gtk+ pie"
PACKAGECONFIG[sdl] = "--enable-sdl,--disable-sdl,libsdl2"
PACKAGECONFIG[png] = "--enable-png,--disable-png,libpng"
PACKAGECONFIG[virtfs] = "--enable-virtfs --enable-attr --enable-cap-ng,--disable-virtfs,libcap-ng attr,"
PACKAGECONFIG[aio] = "--enable-linux-aio,--disable-linux-aio,libaio,"
PACKAGECONFIG[uring] = "--enable-linux-io-uring,--disable-linux-io-uring,liburing"
PACKAGECONFIG[xen] = "--enable-xen,--disable-xen,xen-tools,xen-tools-libxenstore xen-tools-libxenctrl xen-tools-libxenguest"
PACKAGECONFIG[vnc-sasl] = "--enable-vnc --enable-vnc-sasl,--disable-vnc-sasl,cyrus-sasl,"
PACKAGECONFIG[vnc-jpeg] = "--enable-vnc --enable-vnc-jpeg,--disable-vnc-jpeg,jpeg,"
PACKAGECONFIG[libcurl] = "--enable-curl,--disable-curl,curl,"
PACKAGECONFIG[nss] = "--enable-smartcard,--disable-smartcard,nss,"
PACKAGECONFIG[curses] = "--enable-curses,--disable-curses,ncurses,"
PACKAGECONFIG[gtk+] = "--enable-gtk,--disable-gtk,gtk+3 gettext-native"
PACKAGECONFIG[vte] = "--enable-vte,--disable-vte,vte gettext-native"
PACKAGECONFIG[libcap-ng] = "--enable-cap-ng,--disable-cap-ng,libcap-ng,"
PACKAGECONFIG[ssh] = "--enable-libssh,--disable-libssh,libssh,"
PACKAGECONFIG[gcrypt] = "--enable-gcrypt,--disable-gcrypt,libgcrypt,"
PACKAGECONFIG[nettle] = "--enable-nettle,--disable-nettle,nettle"
PACKAGECONFIG[libusb] = "--enable-libusb,--disable-libusb,libusb1"
PACKAGECONFIG[fdt] = "--enable-fdt,--disable-fdt,dtc"
PACKAGECONFIG[alsa] = "--audio-drv-list=default,,alsa-lib"
PACKAGECONFIG[epoxy] = "--enable-opengl,--disable-opengl,libepoxy"
PACKAGECONFIG[lzo] = "--enable-lzo,--disable-lzo,lzo"
PACKAGECONFIG[dax] = "--enable-libdaxctl,--disable-libdaxctl,ndctl"
PACKAGECONFIG[numa] = "--enable-numa,--disable-numa,numactl"
PACKAGECONFIG[gnutls] = "--enable-gnutls,--disable-gnutls,gnutls"
PACKAGECONFIG[bzip2] = "--enable-bzip2,--disable-bzip2,bzip2"
PACKAGECONFIG[libiscsi] = "--enable-libiscsi,--disable-libiscsi"
PACKAGECONFIG[kvm] = "--enable-kvm,--disable-kvm"
PACKAGECONFIG[virglrenderer] = "--enable-virglrenderer,--disable-virglrenderer,virglrenderer"
# spice will be in meta-networking layer
PACKAGECONFIG[spice] = "--enable-spice,--disable-spice,spice"
# usbredir will be in meta-networking layer
PACKAGECONFIG[dbus-display] = "--enable-dbus-display,--disable-dbus-display,glib-2.0-native,dbus"
PACKAGECONFIG[usb-redir] = "--enable-usb-redir,--disable-usb-redir,usbredir"
PACKAGECONFIG[snappy] = "--enable-snappy,--disable-snappy,snappy"
PACKAGECONFIG[glusterfs] = "--enable-glusterfs,--disable-glusterfs,glusterfs"
PACKAGECONFIG[xkbcommon] = "--enable-xkbcommon,--disable-xkbcommon,libxkbcommon"
PACKAGECONFIG[libudev] = "--enable-libudev,--disable-libudev,udev"
PACKAGECONFIG[attr] = "--enable-attr,--disable-attr,attr,"
PACKAGECONFIG[rbd] = "--enable-rbd,--disable-rbd,ceph,ceph"
PACKAGECONFIG[vhost] = "--enable-vhost-net,--disable-vhost-net,,"
PACKAGECONFIG[ust] = "--enable-trace-backends=ust,,lttng-ust,"
PACKAGECONFIG[pie] = "--enable-pie,--disable-pie,,"
PACKAGECONFIG[seccomp] = "--enable-seccomp,--disable-seccomp,libseccomp"
# libnfs is currently provided by meta-kodi
PACKAGECONFIG[libnfs] = "--enable-libnfs,--disable-libnfs,libnfs"
PACKAGECONFIG[pmem] = "--enable-libpmem,--disable-libpmem,pmdk"
PACKAGECONFIG[pulseaudio] = "--enable-pa,--disable-pa,pulseaudio"
PACKAGECONFIG[selinux] = "--enable-selinux,--disable-selinux"
PACKAGECONFIG[bpf] = "--enable-bpf,--disable-bpf,libbpf"
PACKAGECONFIG[capstone] = "--enable-capstone,--disable-capstone"
PACKAGECONFIG[rdma] = "--enable-rdma,--disable-rdma"
PACKAGECONFIG[vde] = "--enable-vde,--disable-vde"
PACKAGECONFIG[fuse] = "--enable-fuse --enable-fuse-lseek,--disable-fuse --disable-fuse-lseek,fuse3"
PACKAGECONFIG[slirp] = "--enable-slirp,--disable-slirp,libslirp"
PACKAGECONFIG[brlapi] = "--enable-brlapi,--disable-brlapi"
PACKAGECONFIG[jack] = "--enable-jack,--disable-jack,jack,"
PACKAGECONFIG[debuginfo] = "--enable-libdw,--disable-libdw,elfutils"
PACKAGECONFIG[pipewire] = "--enable-pipewire,--disable-pipewire,pipewire"
PACKAGECONFIG[sndio] = "--enable-sndio,--disable-sndio,sndio"
INSANE_SKIP:${PN}-common = "arch"
FILES:${PN} += "${datadir}/icons"
# For user who want to install all arch packages
PACKAGES =+ "${PN}-common"
RDEPENDS:${PN} += "${PN}-common"
ALLOW_EMPTY:${PN} = "1"
FILES:${PN} = ""
FILES:${PN}-common = "${bindir}/* ${includedir}/* ${libexecdir}/* ${datadir}/* ${localstatedir}"
PACKAGES_DYNAMIC += "^${PN}-user-.* ^${PN}-system-.*"
PACKAGESPLITFUNCS =+ "split_qemu_packages"
python split_qemu_packages () {
archdir = d.expand('${bindir}/')
subpackages = do_split_packages(d, archdir, r'^qemu-system-(.*)$', '${PN}-system-%s', 'QEMU full system emulation binaries(%s)' , prepend=True, extra_depends='${PN}-common')
subpackages += do_split_packages(d, archdir, r'^qemu-((?!system|edid|ga|img|io|nbd|pr-helper|storage-daemon).*)$', '${PN}-user-%s', 'QEMU full user emulation binaries(%s)' , prepend=True, extra_depends='${PN}-common')
if subpackages:
d.appendVar('RDEPENDS:' + d.getVar('PN'), ' ' + ' '.join(subpackages))
mipspackage = d.getVar('PN') + "-user-mips"
if mipspackage in ' '.join(subpackages):
d.appendVar('RDEPENDS:' + mipspackage, ' ' + d.getVar("MLPREFIX") + 'bash')
}
# Put the guest agent in a separate package
PACKAGES =+ "${PN}-guest-agent"
SUMMARY:${PN}-guest-agent = "QEMU guest agent"
FILES:${PN}-guest-agent += " \
${bindir}/qemu-ga \
${sysconfdir}/udev/rules.d/60-qemu-guest-agent.rules \
${sysconfdir}/init.d/qemu-guest-agent \
${systemd_unitdir}/system/qemu-guest-agent.service \
"
INITSCRIPT_PACKAGES = "${PN}-guest-agent"
INITSCRIPT_NAME:${PN}-guest-agent = "qemu-guest-agent"
INITSCRIPT_PARAMS:${PN}-guest-agent = "defaults"
SYSTEMD_PACKAGES = "${PN}-guest-agent"
SYSTEMD_SERVICE:${PN}-guest-agent = "qemu-guest-agent.service"

View File

@@ -0,0 +1,33 @@
From de64af82950a6908f9407dfc92b83c17e2af3eab Mon Sep 17 00:00:00 2001
From: Jason Wessel <jason.wessel@windriver.com>
Date: Fri, 28 Mar 2014 17:42:43 +0800
Subject: [PATCH 01/12] qemu: Add addition environment space to boot loader
qemu-system-mips
Upstream-Status: Inappropriate - OE uses deep paths
If you create a project with very long directory names like 128 characters
deep and use NFS, the kernel arguments will be truncated. The kernel will
accept longer strings such as 1024 bytes, but the qemu boot loader defaulted
to only 256 bytes. This patch expands the limit.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Roy Li <rongqing.li@windriver.com>
---
hw/mips/malta.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: qemu-8.0.0/hw/mips/malta.c
===================================================================
--- qemu-8.0.0.orig/hw/mips/malta.c
+++ qemu-8.0.0/hw/mips/malta.c
@@ -64,7 +64,7 @@
#define ENVP_PADDR 0x2000
#define ENVP_VADDR cpu_mips_phys_to_kseg0(NULL, ENVP_PADDR)
#define ENVP_NB_ENTRIES 16
-#define ENVP_ENTRY_SIZE 256
+#define ENVP_ENTRY_SIZE 1024
/* Hardware addresses */
#define FLASH_ADDRESS 0x1e000000ULL

View File

@@ -0,0 +1,47 @@
From ddb27569449c941014fa44b1b542de0831d993a0 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Thu, 10 Oct 2024 22:40:32 -0700
Subject: [PATCH v2] sched_attr: Do not define for glibc >= 2.41
glibc 2.41+ has added [1] definitions for sched_setattr and sched_getattr functions
and struct sched_attr. Therefore, it needs to be checked for here as well before
defining sched_attr
Define sched_attr conditionally on SCHED_ATTR_SIZE_VER0
Fixes builds with glibc/trunk
[1] https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=21571ca0d70302909cf72707b2a7736cf12190a0;hp=298bc488fdc047da37482f4003023cb9adef78f8
Upstream-Status: Submitted [https://patchwork.ozlabs.org/project/qemu-devel/patch/20241011193140.1047648-1-raj.khem@gmail.com/]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Cc: Laurent Vivier <laurent@vivier.eu>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
v2: Use SCHED_ATTR_SIZE_VER0 instead of glibc version check
linux-user/syscall.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1354e75694..caecbb765d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -359,7 +359,8 @@ _syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
#define __NR_sys_sched_setaffinity __NR_sched_setaffinity
_syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len,
unsigned long *, user_mask_ptr);
-/* sched_attr is not defined in glibc */
+/* sched_attr is not defined in glibc < 2.41 */
+#ifndef SCHED_ATTR_SIZE_VER0
struct sched_attr {
uint32_t size;
uint32_t sched_policy;
@@ -372,6 +373,7 @@ struct sched_attr {
uint32_t sched_util_min;
uint32_t sched_util_max;
};
+#endif
#define __NR_sys_sched_getattr __NR_sched_getattr
_syscall4(int, sys_sched_getattr, pid_t, pid, struct sched_attr *, attr,
unsigned int, size, unsigned int, flags);

View File

@@ -0,0 +1,355 @@
From 71f14902256e3c3529710b713e1ea43100bf4c40 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Sat, 17 Dec 2022 08:37:46 -0800
Subject: [PATCH 2/2] linux-user: Replace use of lfs64 related functions and
macros
Builds defines -D_FILE_OFFSET_BITS=64 which makes the original functions
anf macros behave same as their 64 suffixed counterparts. This also
helps in compiling with latest musl C library, where these macros and
functions are no more available under _GNU_SOURCE feature macro
Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2022-12/msg02841.html]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Cc: Laurent Vivier <laurent@vivier.eu>
---
linux-user/syscall.c | 153 +++++++++++--------------------------------
1 file changed, 39 insertions(+), 114 deletions(-)
Index: qemu-8.0.0/linux-user/syscall.c
===================================================================
--- qemu-8.0.0.orig/linux-user/syscall.c
+++ qemu-8.0.0/linux-user/syscall.c
@@ -761,8 +761,8 @@ safe_syscall6(ssize_t, copy_file_range,
*/
#define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
/* Similarly for fcntl. Note that callers must always:
- * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
- * use the flock64 struct rather than unsuffixed flock
+ * pass the F_GETLK etc constants rather than the unsuffixed F_GETLK
+ * use the flock struct rather than unsuffixed flock
* This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
*/
#ifdef __NR_fcntl64
@@ -6813,13 +6813,13 @@ static int target_to_host_fcntl_cmd(int
ret = cmd;
break;
case TARGET_F_GETLK:
- ret = F_GETLK64;
+ ret = F_GETLK;
break;
case TARGET_F_SETLK:
- ret = F_SETLK64;
+ ret = F_SETLK;
break;
case TARGET_F_SETLKW:
- ret = F_SETLKW64;
+ ret = F_SETLKW;
break;
case TARGET_F_GETOWN:
ret = F_GETOWN;
@@ -6833,17 +6833,6 @@ static int target_to_host_fcntl_cmd(int
case TARGET_F_SETSIG:
ret = F_SETSIG;
break;
-#if TARGET_ABI_BITS == 32
- case TARGET_F_GETLK64:
- ret = F_GETLK64;
- break;
- case TARGET_F_SETLK64:
- ret = F_SETLK64;
- break;
- case TARGET_F_SETLKW64:
- ret = F_SETLKW64;
- break;
-#endif
case TARGET_F_SETLEASE:
ret = F_SETLEASE;
break;
@@ -6895,8 +6884,8 @@ static int target_to_host_fcntl_cmd(int
* them to 5, 6 and 7 before making the syscall(). Since we make the
* syscall directly, adjust to what is supported by the kernel.
*/
- if (ret >= F_GETLK64 && ret <= F_SETLKW64) {
- ret -= F_GETLK64 - 5;
+ if (ret >= F_GETLK && ret <= F_SETLKW) {
+ ret -= F_GETLK - 5;
}
#endif
@@ -6929,55 +6918,11 @@ static int host_to_target_flock(int type
return type;
}
-static inline abi_long copy_from_user_flock(struct flock64 *fl,
- abi_ulong target_flock_addr)
-{
- struct target_flock *target_fl;
- int l_type;
-
- if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
- return -TARGET_EFAULT;
- }
-
- __get_user(l_type, &target_fl->l_type);
- l_type = target_to_host_flock(l_type);
- if (l_type < 0) {
- return l_type;
- }
- fl->l_type = l_type;
- __get_user(fl->l_whence, &target_fl->l_whence);
- __get_user(fl->l_start, &target_fl->l_start);
- __get_user(fl->l_len, &target_fl->l_len);
- __get_user(fl->l_pid, &target_fl->l_pid);
- unlock_user_struct(target_fl, target_flock_addr, 0);
- return 0;
-}
-
-static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
- const struct flock64 *fl)
-{
- struct target_flock *target_fl;
- short l_type;
-
- if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
- return -TARGET_EFAULT;
- }
-
- l_type = host_to_target_flock(fl->l_type);
- __put_user(l_type, &target_fl->l_type);
- __put_user(fl->l_whence, &target_fl->l_whence);
- __put_user(fl->l_start, &target_fl->l_start);
- __put_user(fl->l_len, &target_fl->l_len);
- __put_user(fl->l_pid, &target_fl->l_pid);
- unlock_user_struct(target_fl, target_flock_addr, 1);
- return 0;
-}
-
-typedef abi_long from_flock64_fn(struct flock64 *fl, abi_ulong target_addr);
-typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock64 *fl);
+typedef abi_long from_flock_fn(struct flock *fl, abi_ulong target_addr);
+typedef abi_long to_flock_fn(abi_ulong target_addr, const struct flock *fl);
#if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
-struct target_oabi_flock64 {
+struct target_oabi_flock {
abi_short l_type;
abi_short l_whence;
abi_llong l_start;
@@ -6985,10 +6930,10 @@ struct target_oabi_flock64 {
abi_int l_pid;
} QEMU_PACKED;
-static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl,
+static inline abi_long copy_from_user_oabi_flock(struct flock *fl,
abi_ulong target_flock_addr)
{
- struct target_oabi_flock64 *target_fl;
+ struct target_oabi_flock *target_fl;
int l_type;
if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
@@ -7009,10 +6954,10 @@ static inline abi_long copy_from_user_oa
return 0;
}
-static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
- const struct flock64 *fl)
+static inline abi_long copy_to_user_oabi_flock(abi_ulong target_flock_addr,
+ const struct flock *fl)
{
- struct target_oabi_flock64 *target_fl;
+ struct target_oabi_flock *target_fl;
short l_type;
if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
@@ -7030,10 +6975,10 @@ static inline abi_long copy_to_user_oabi
}
#endif
-static inline abi_long copy_from_user_flock64(struct flock64 *fl,
+static inline abi_long copy_from_user_flock(struct flock *fl,
abi_ulong target_flock_addr)
{
- struct target_flock64 *target_fl;
+ struct target_flock *target_fl;
int l_type;
if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
@@ -7054,10 +6999,10 @@ static inline abi_long copy_from_user_fl
return 0;
}
-static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
- const struct flock64 *fl)
+static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
+ const struct flock *fl)
{
- struct target_flock64 *target_fl;
+ struct target_flock *target_fl;
short l_type;
if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
@@ -7076,7 +7021,7 @@ static inline abi_long copy_to_user_floc
static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
{
- struct flock64 fl64;
+ struct flock fl64;
#ifdef F_GETOWN_EX
struct f_owner_ex fox;
struct target_f_owner_ex *target_fox;
@@ -7089,6 +7034,7 @@ static abi_long do_fcntl(int fd, int cmd
switch(cmd) {
case TARGET_F_GETLK:
+ case TARGET_F_OFD_GETLK:
ret = copy_from_user_flock(&fl64, arg);
if (ret) {
return ret;
@@ -7098,32 +7044,11 @@ static abi_long do_fcntl(int fd, int cmd
ret = copy_to_user_flock(arg, &fl64);
}
break;
-
case TARGET_F_SETLK:
case TARGET_F_SETLKW:
- ret = copy_from_user_flock(&fl64, arg);
- if (ret) {
- return ret;
- }
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
- break;
-
- case TARGET_F_GETLK64:
- case TARGET_F_OFD_GETLK:
- ret = copy_from_user_flock64(&fl64, arg);
- if (ret) {
- return ret;
- }
- ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
- if (ret == 0) {
- ret = copy_to_user_flock64(arg, &fl64);
- }
- break;
- case TARGET_F_SETLK64:
- case TARGET_F_SETLKW64:
case TARGET_F_OFD_SETLK:
case TARGET_F_OFD_SETLKW:
- ret = copy_from_user_flock64(&fl64, arg);
+ ret = copy_from_user_flock(&fl64, arg);
if (ret) {
return ret;
}
@@ -7348,7 +7273,7 @@ static inline abi_long target_truncate64
arg2 = arg3;
arg3 = arg4;
}
- return get_errno(truncate64(arg1, target_offset64(arg2, arg3)));
+ return get_errno(truncate(arg1, target_offset64(arg2, arg3)));
}
#endif
@@ -7362,7 +7287,7 @@ static inline abi_long target_ftruncate6
arg2 = arg3;
arg3 = arg4;
}
- return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3)));
+ return get_errno(ftruncate(arg1, target_offset64(arg2, arg3)));
}
#endif
@@ -8598,7 +8523,7 @@ static int do_getdents(abi_long dirfd, a
void *tdirp;
int hlen, hoff, toff;
int hreclen, treclen;
- off64_t prev_diroff = 0;
+ off_t prev_diroff = 0;
hdirp = g_try_malloc(count);
if (!hdirp) {
@@ -8651,7 +8576,7 @@ static int do_getdents(abi_long dirfd, a
* Return what we have, resetting the file pointer to the
* location of the first record not returned.
*/
- lseek64(dirfd, prev_diroff, SEEK_SET);
+ lseek(dirfd, prev_diroff, SEEK_SET);
break;
}
@@ -8685,7 +8610,7 @@ static int do_getdents64(abi_long dirfd,
void *tdirp;
int hlen, hoff, toff;
int hreclen, treclen;
- off64_t prev_diroff = 0;
+ off_t prev_diroff = 0;
hdirp = g_try_malloc(count);
if (!hdirp) {
@@ -8727,7 +8652,7 @@ static int do_getdents64(abi_long dirfd,
* Return what we have, resetting the file pointer to the
* location of the first record not returned.
*/
- lseek64(dirfd, prev_diroff, SEEK_SET);
+ lseek(dirfd, prev_diroff, SEEK_SET);
break;
}
@@ -11158,7 +11083,7 @@ static abi_long do_syscall1(CPUArchState
return -TARGET_EFAULT;
}
}
- ret = get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg5)));
+ ret = get_errno(pread(arg1, p, arg3, target_offset64(arg4, arg5)));
unlock_user(p, arg2, ret);
return ret;
case TARGET_NR_pwrite64:
@@ -11175,7 +11100,7 @@ static abi_long do_syscall1(CPUArchState
return -TARGET_EFAULT;
}
}
- ret = get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, arg5)));
+ ret = get_errno(pwrite(arg1, p, arg3, target_offset64(arg4, arg5)));
unlock_user(p, arg2, 0);
return ret;
#endif
@@ -11998,14 +11923,14 @@ static abi_long do_syscall1(CPUArchState
case TARGET_NR_fcntl64:
{
int cmd;
- struct flock64 fl;
- from_flock64_fn *copyfrom = copy_from_user_flock64;
- to_flock64_fn *copyto = copy_to_user_flock64;
+ struct flock fl;
+ from_flock_fn *copyfrom = copy_from_user_flock;
+ to_flock_fn *copyto = copy_to_user_flock;
#ifdef TARGET_ARM
if (!cpu_env->eabi) {
- copyfrom = copy_from_user_oabi_flock64;
- copyto = copy_to_user_oabi_flock64;
+ copyfrom = copy_from_user_oabi_flock;
+ copyto = copy_to_user_oabi_flock;
}
#endif
@@ -12015,7 +11940,7 @@ static abi_long do_syscall1(CPUArchState
}
switch(arg2) {
- case TARGET_F_GETLK64:
+ case TARGET_F_GETLK:
ret = copyfrom(&fl, arg3);
if (ret) {
break;
@@ -12026,8 +11951,8 @@ static abi_long do_syscall1(CPUArchState
}
break;
- case TARGET_F_SETLK64:
- case TARGET_F_SETLKW64:
+ case TARGET_F_SETLK:
+ case TARGET_F_SETLKW:
ret = copyfrom(&fl, arg3);
if (ret) {
break;

View File

@@ -0,0 +1,43 @@
From 5bf65b24414d3ff8339f6f1beb221c7c35c91e5d Mon Sep 17 00:00:00 2001
From: Richard Henderson <richard.henderson@linaro.org>
Date: Wed, 28 Feb 2024 10:25:15 -1000
Subject: [PATCH 2/5] linux-user/loongarch64: Remove TARGET_FORCE_SHMLBA
The kernel abi was changed with
commit d23b77953f5a4fbf94c05157b186aac2a247ae32
Author: Huacai Chen <chenhuacai@kernel.org>
Date: Wed Jan 17 12:43:08 2024 +0800
LoongArch: Change SHMLBA from SZ_64K to PAGE_SIZE
during the v6.8 cycle.
Upstream-Status: Submitted [https://www.mail-archive.com/qemu-devel@nongnu.org/msg1026793.html]
Reviewed-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
linux-user/loongarch64/target_syscall.h | 7 -------
1 file changed, 7 deletions(-)
diff --git a/linux-user/loongarch64/target_syscall.h b/linux-user/loongarch64/target_syscall.h
index 8b5de5212..39f229bb9 100644
--- a/linux-user/loongarch64/target_syscall.h
+++ b/linux-user/loongarch64/target_syscall.h
@@ -38,11 +38,4 @@ struct target_pt_regs {
#define TARGET_MCL_FUTURE 2
#define TARGET_MCL_ONFAULT 4
-#define TARGET_FORCE_SHMLBA
-
-static inline abi_ulong target_shmlba(CPULoongArchState *env)
-{
- return 64 * KiB;
-}
-
#endif
--
2.34.1

View File

@@ -0,0 +1,44 @@
From dc2a8ccd440ee3741b61606eafed3f7e092f4312 Mon Sep 17 00:00:00 2001
From: Mark Asselstine <mark.asselstine@windriver.com>
Date: Tue, 26 Feb 2013 11:43:28 -0500
Subject: [PATCH 03/12] apic: fixup fallthrough to PIC
Commit 0e21e12bb311c4c1095d0269dc2ef81196ccb60a [Don't route PIC
interrupts through the local APIC if the local APIC config says so.]
missed a check to ensure the local APIC is enabled. Since if the local
APIC is disabled it doesn't matter what the local APIC config says.
If this check isn't done and the guest has disabled the local APIC the
guest will receive a general protection fault, similar to what is seen
here:
https://lists.gnu.org/archive/html/qemu-devel/2012-12/msg02304.html
The GPF is caused by an attempt to service interrupt 0xffffffff. This
comes about since cpu_get_pic_interrupt() calls apic_accept_pic_intr()
(with the local APIC disabled apic_get_interrupt() returns -1).
apic_accept_pic_intr() returns 0 and thus the interrupt number which
is returned from cpu_get_pic_interrupt(), and which is attempted to be
serviced, is -1.
Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2013-04/msg00878.html]
Signed-off-by: He Zhe <zhe.he@windriver.com>
---
hw/intc/apic.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: qemu-8.0.0/hw/intc/apic.c
===================================================================
--- qemu-8.0.0.orig/hw/intc/apic.c
+++ qemu-8.0.0/hw/intc/apic.c
@@ -607,7 +607,7 @@ int apic_accept_pic_intr(DeviceState *de
APICCommonState *s = APIC(dev);
uint32_t lvt0;
- if (!s)
+ if (!s || !(s->spurious_vec & APIC_SV_ENABLE))
return -1;
lvt0 = s->lvt[APIC_LVT_LINT0];

View File

@@ -0,0 +1,71 @@
From e8f06676c6c88e12cd5f4f81a839b7111c683596 Mon Sep 17 00:00:00 2001
From: Richard Henderson <richard.henderson@linaro.org>
Date: Wed, 28 Feb 2024 10:25:16 -1000
Subject: [PATCH 3/5] linux-user: Add strace for shmat
Upstream-Status: Submitted [https://www.mail-archive.com/qemu-devel@nongnu.org/msg1026793.html]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
linux-user/strace.c | 23 +++++++++++++++++++++++
linux-user/strace.list | 2 +-
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index cf26e5526..47d6ec326 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -670,6 +670,25 @@ print_semctl(CPUArchState *cpu_env, const struct syscallname *name,
}
#endif
+static void
+print_shmat(CPUArchState *cpu_env, const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ static const struct flags shmat_flags[] = {
+ FLAG_GENERIC(SHM_RND),
+ FLAG_GENERIC(SHM_REMAP),
+ FLAG_GENERIC(SHM_RDONLY),
+ FLAG_GENERIC(SHM_EXEC),
+ };
+
+ print_syscall_prologue(name);
+ print_raw_param(TARGET_ABI_FMT_ld, arg0, 0);
+ print_pointer(arg1, 0);
+ print_flags(shmat_flags, arg2, 1);
+ print_syscall_epilogue(name);
+}
+
#ifdef TARGET_NR_ipc
static void
print_ipc(CPUArchState *cpu_env, const struct syscallname *name,
@@ -683,6 +702,10 @@ print_ipc(CPUArchState *cpu_env, const struct syscallname *name,
print_ipc_cmd(arg3);
qemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
break;
+ case IPCOP_shmat:
+ print_shmat(cpu_env, &(const struct syscallname){ .name = "shmat" },
+ arg1, arg4, arg2, 0, 0, 0);
+ break;
default:
qemu_log(("%s("
TARGET_ABI_FMT_ld ","
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 6655d4f26..dfd4237d1 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1398,7 +1398,7 @@
{ TARGET_NR_sgetmask, "sgetmask" , NULL, NULL, NULL },
#endif
#ifdef TARGET_NR_shmat
-{ TARGET_NR_shmat, "shmat" , NULL, NULL, print_syscall_ret_addr },
+{ TARGET_NR_shmat, "shmat" , NULL, print_shmat, print_syscall_ret_addr },
#endif
#ifdef TARGET_NR_shmctl
{ TARGET_NR_shmctl, "shmctl" , NULL, NULL, NULL },
--
2.34.1

View File

@@ -0,0 +1,29 @@
From d8265abdce5dc2bf74b3fccdf2b7257b4f3894f0 Mon Sep 17 00:00:00 2001
From: He Zhe <zhe.he@windriver.com>
Date: Wed, 28 Aug 2019 19:56:28 +0800
Subject: [PATCH 04/12] configure: Add pkg-config handling for libgcrypt
libgcrypt may also be controlled by pkg-config, this patch adds pkg-config
handling for libgcrypt.
Upstream-Status: Denied [https://lists.nongnu.org/archive/html/qemu-devel/2019-08/msg06333.html]
Signed-off-by: He Zhe <zhe.he@windriver.com>
---
meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: qemu-8.1.0/meson.build
===================================================================
--- qemu-8.1.0.orig/meson.build
+++ qemu-8.1.0/meson.build
@@ -1481,7 +1481,7 @@ endif
if not gnutls_crypto.found()
if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
gcrypt = dependency('libgcrypt', version: '>=1.8',
- method: 'config-tool',
+ method: 'pkg-config',
required: get_option('gcrypt'))
# Debian has removed -lgpg-error from libgcrypt-config
# as it "spreads unnecessary dependencies" which in

View File

@@ -0,0 +1,236 @@
From cb48d5d1592e63ebd0d4a3e300ef98e38e6306d7 Mon Sep 17 00:00:00 2001
From: Richard Henderson <richard.henderson@linaro.org>
Date: Wed, 28 Feb 2024 10:25:17 -1000
Subject: [PATCH 4/5] linux-user: Rewrite target_shmat
Handle combined host and guest alignment requirements.
Handle host and guest page size differences.
Handle SHM_EXEC.
Upstream-Status: Submitted [https://www.mail-archive.com/qemu-devel@nongnu.org/msg1026793.html]
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/115
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
linux-user/mmap.c | 166 +++++++++++++++++++++++++++++++++++++---------
1 file changed, 133 insertions(+), 33 deletions(-)
diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 18fb3aaf7..6a2f649bb 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -1062,69 +1062,161 @@ static inline abi_ulong target_shmlba(CPUArchState *cpu_env)
}
#endif
+#if defined(__arm__) || defined(__mips__) || defined(__sparc__)
+#define HOST_FORCE_SHMLBA 1
+#else
+#define HOST_FORCE_SHMLBA 0
+#endif
+
abi_ulong target_shmat(CPUArchState *cpu_env, int shmid,
abi_ulong shmaddr, int shmflg)
{
CPUState *cpu = env_cpu(cpu_env);
- abi_ulong raddr;
struct shmid_ds shm_info;
int ret;
- abi_ulong shmlba;
+ int h_pagesize;
+ int t_shmlba, h_shmlba, m_shmlba;
+ size_t t_len, h_len, m_len;
/* shmat pointers are always untagged */
- /* find out the length of the shared memory segment */
+ /*
+ * Because we can't use host shmat() unless the address is sufficiently
+ * aligned for the host, we'll need to check both.
+ * TODO: Could be fixed with softmmu.
+ */
+ t_shmlba = target_shmlba(cpu_env);
+ h_pagesize = qemu_real_host_page_size();
+ h_shmlba = (HOST_FORCE_SHMLBA ? SHMLBA : h_pagesize);
+ m_shmlba = MAX(t_shmlba, h_shmlba);
+
+ if (shmaddr) {
+ if (shmaddr & (m_shmlba - 1)) {
+ if (shmflg & SHM_RND) {
+ /*
+ * The guest is allowing the kernel to round the address.
+ * Assume that the guest is ok with us rounding to the
+ * host required alignment too. Anyway if we don't, we'll
+ * get an error from the kernel.
+ */
+ shmaddr &= ~(m_shmlba - 1);
+ if (shmaddr == 0 && (shmflg & SHM_REMAP)) {
+ return -TARGET_EINVAL;
+ }
+ } else {
+ int require = TARGET_PAGE_SIZE;
+#ifdef TARGET_FORCE_SHMLBA
+ require = t_shmlba;
+#endif
+ /*
+ * Include host required alignment, as otherwise we cannot
+ * use host shmat at all.
+ */
+ require = MAX(require, h_shmlba);
+ if (shmaddr & (require - 1)) {
+ return -TARGET_EINVAL;
+ }
+ }
+ }
+ } else {
+ if (shmflg & SHM_REMAP) {
+ return -TARGET_EINVAL;
+ }
+ }
+ /* All rounding now manually concluded. */
+ shmflg &= ~SHM_RND;
+
+ /* Find out the length of the shared memory segment. */
ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info));
if (is_error(ret)) {
/* can't get length, bail out */
return ret;
}
+ t_len = TARGET_PAGE_ALIGN(shm_info.shm_segsz);
+ h_len = ROUND_UP(shm_info.shm_segsz, h_pagesize);
+ m_len = MAX(t_len, h_len);
- shmlba = target_shmlba(cpu_env);
-
- if (shmaddr & (shmlba - 1)) {
- if (shmflg & SHM_RND) {
- shmaddr &= ~(shmlba - 1);
- } else {
- return -TARGET_EINVAL;
- }
- }
- if (!guest_range_valid_untagged(shmaddr, shm_info.shm_segsz)) {
+ if (!guest_range_valid_untagged(shmaddr, m_len)) {
return -TARGET_EINVAL;
}
WITH_MMAP_LOCK_GUARD() {
- void *host_raddr;
+ bool mapped = false;
+ void *want, *test;
abi_ulong last;
- if (shmaddr) {
- host_raddr = shmat(shmid, (void *)g2h_untagged(shmaddr), shmflg);
+ if (!shmaddr) {
+ shmaddr = mmap_find_vma(0, m_len, m_shmlba);
+ if (shmaddr == -1) {
+ return -TARGET_ENOMEM;
+ }
+ mapped = !reserved_va;
+ } else if (shmflg & SHM_REMAP) {
+ /*
+ * If host page size > target page size, the host shmat may map
+ * more memory than the guest expects. Reject a mapping that
+ * would replace memory in the unexpected gap.
+ * TODO: Could be fixed with softmmu.
+ */
+ if (t_len < h_len &&
+ !page_check_range_empty(shmaddr + t_len,
+ shmaddr + h_len - 1)) {
+ return -TARGET_EINVAL;
+ }
} else {
- abi_ulong mmap_start;
+ if (!page_check_range_empty(shmaddr, shmaddr + m_len - 1)) {
+ return -TARGET_EINVAL;
+ }
+ }
- /* In order to use the host shmat, we need to honor host SHMLBA. */
- mmap_start = mmap_find_vma(0, shm_info.shm_segsz,
- MAX(SHMLBA, shmlba));
+ /* All placement is now complete. */
+ want = (void *)g2h_untagged(shmaddr);
- if (mmap_start == -1) {
- return -TARGET_ENOMEM;
+ /*
+ * Map anonymous pages across the entire range, then remap with
+ * the shared memory. This is required for a number of corner
+ * cases for which host and guest page sizes differ.
+ */
+ if (h_len != t_len) {
+ int mmap_p = PROT_READ | (shmflg & SHM_RDONLY ? 0 : PROT_WRITE);
+ int mmap_f = MAP_PRIVATE | MAP_ANONYMOUS
+ | (reserved_va || (shmflg & SHM_REMAP)
+ ? MAP_FIXED : MAP_FIXED_NOREPLACE);
+
+ test = mmap(want, m_len, mmap_p, mmap_f, -1, 0);
+ if (unlikely(test != want)) {
+ /* shmat returns EINVAL not EEXIST like mmap. */
+ ret = (test == MAP_FAILED && errno != EEXIST
+ ? get_errno(-1) : -TARGET_EINVAL);
+ if (mapped) {
+ do_munmap(want, m_len);
+ }
+ return ret;
}
- host_raddr = shmat(shmid, g2h_untagged(mmap_start),
- shmflg | SHM_REMAP);
+ mapped = true;
}
- if (host_raddr == (void *)-1) {
- return get_errno(-1);
+ if (reserved_va || mapped) {
+ shmflg |= SHM_REMAP;
+ }
+ test = shmat(shmid, want, shmflg);
+ if (test == MAP_FAILED) {
+ ret = get_errno(-1);
+ if (mapped) {
+ do_munmap(want, m_len);
+ }
+ return ret;
}
- raddr = h2g(host_raddr);
- last = raddr + shm_info.shm_segsz - 1;
+ assert(test == want);
- page_set_flags(raddr, last,
+ last = shmaddr + m_len - 1;
+ page_set_flags(shmaddr, last,
PAGE_VALID | PAGE_RESET | PAGE_READ |
- (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE));
+ (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE) |
+ (shmflg & SHM_EXEC ? PAGE_EXEC : 0));
- shm_region_rm_complete(raddr, last);
- shm_region_add(raddr, last);
+ shm_region_rm_complete(shmaddr, last);
+ shm_region_add(shmaddr, last);
}
/*
@@ -1138,7 +1230,15 @@ abi_ulong target_shmat(CPUArchState *cpu_env, int shmid,
tb_flush(cpu);
}
- return raddr;
+ if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
+ FILE *f = qemu_log_trylock();
+ if (f) {
+ fprintf(f, "page layout changed following shmat\n");
+ page_dump(f);
+ qemu_log_unlock(f);
+ }
+ }
+ return shmaddr;
}
abi_long target_shmdt(abi_ulong shmaddr)
--
2.34.1

View File

@@ -0,0 +1,32 @@
From f39e7bfc5ed07b5ecaeb705c4eae4855ca120d47 Mon Sep 17 00:00:00 2001
From: Oleksiy Obitotskyy <oobitots@cisco.com>
Date: Wed, 25 Mar 2020 21:21:35 +0200
Subject: [PATCH 05/12] qemu: Do not include file if not exists
Script configure checks for if_alg.h and check failed but
if_alg.h still included.
Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2020-03/msg07188.html]
Signed-off-by: Oleksiy Obitotskyy <oobitots@cisco.com>
[update patch context]
Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
---
linux-user/syscall.c | 2 ++
1 file changed, 2 insertions(+)
Index: qemu-8.0.0/linux-user/syscall.c
===================================================================
--- qemu-8.0.0.orig/linux-user/syscall.c
+++ qemu-8.0.0/linux-user/syscall.c
@@ -115,7 +115,9 @@
#include <linux/blkpg.h>
#include <netpacket/packet.h>
#include <linux/netlink.h>
+#if defined(CONFIG_AF_ALG)
#include <linux/if_alg.h>
+#endif
#include <linux/rtc.h>
#include <sound/asound.h>
#ifdef HAVE_BTRFS_H

View File

@@ -0,0 +1,85 @@
From 1234063488134ad1f541f56dd30caa7896905f06 Mon Sep 17 00:00:00 2001
From: Ilya Leoshkevich <iii@linux.ibm.com>
Date: Wed, 28 Feb 2024 10:25:18 -1000
Subject: [PATCH 5/5] tests/tcg: Check that shmat() does not break
/proc/self/maps
Add a regression test for a recently fixed issue, where shmat()
desynced the guest and the host view of the address space and caused
open("/proc/self/maps") to SEGV.
Upstream-Status: Submitted [https://www.mail-archive.com/qemu-devel@nongnu.org/msg1026793.html]
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-Id: <jwyuvao4apydvykmsnvacwshdgy3ixv7qvkh4dbxm3jkwgnttw@k4wpaayou7oq>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
tests/tcg/multiarch/linux/linux-shmat-maps.c | 55 ++++++++++++++++++++
1 file changed, 55 insertions(+)
create mode 100644 tests/tcg/multiarch/linux/linux-shmat-maps.c
diff --git a/tests/tcg/multiarch/linux/linux-shmat-maps.c b/tests/tcg/multiarch/linux/linux-shmat-maps.c
new file mode 100644
index 000000000..0ccf7a973
--- /dev/null
+++ b/tests/tcg/multiarch/linux/linux-shmat-maps.c
@@ -0,0 +1,55 @@
+/*
+ * Test that shmat() does not break /proc/self/maps.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include <assert.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <unistd.h>
+
+int main(void)
+{
+ char buf[128];
+ int err, fd;
+ int shmid;
+ ssize_t n;
+ void *p;
+
+ shmid = shmget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
+ assert(shmid != -1);
+
+ /*
+ * The original bug required a non-NULL address, which skipped the
+ * mmap_find_vma step, which could result in a host mapping smaller
+ * than the target mapping. Choose an address at random.
+ */
+ p = shmat(shmid, (void *)0x800000, SHM_RND);
+ if (p == (void *)-1) {
+ /*
+ * Because we are now running the testcase for all guests for which
+ * we have a cross-compiler, the above random address might conflict
+ * with the guest executable in some way. Rather than stopping,
+ * continue with a system supplied address, which should never fail.
+ */
+ p = shmat(shmid, NULL, 0);
+ assert(p != (void *)-1);
+ }
+
+ fd = open("/proc/self/maps", O_RDONLY);
+ assert(fd != -1);
+ do {
+ n = read(fd, buf, sizeof(buf));
+ assert(n >= 0);
+ } while (n != 0);
+ close(fd);
+
+ err = shmdt(p);
+ assert(err == 0);
+ err = shmctl(shmid, IPC_RMID, NULL);
+ assert(err == 0);
+
+ return EXIT_SUCCESS;
+}
--
2.34.1

View File

@@ -0,0 +1,49 @@
From 375cae3dd6151ef33cae8f243f6a2c2da6c0c356 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Fri, 8 Jan 2021 17:27:06 +0000
Subject: [PATCH 06/12] qemu: Add some user space mmap tweaks to address musl
32 bit
When using qemu-i386 to build qemux86 webkitgtk on musl, it sits in an
infinite loop of mremap calls of ever decreasing/increasing addresses.
I suspect something in the musl memory allocation code loops indefinitely
if it only sees ENOMEM and only exits when it hits EFAULT.
According to the docs, trying to mremap outside the address space
can/should return EFAULT and changing this allows the build to succeed.
A better return value for the other cases of invalid addresses is EINVAL
rather than ENOMEM so adjust the other part of the test to this.
Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg01355.html]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org
---
linux-user/mmap.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
Index: qemu-8.0.0/linux-user/mmap.c
===================================================================
--- qemu-8.0.0.orig/linux-user/mmap.c
+++ qemu-8.0.0/linux-user/mmap.c
@@ -776,12 +776,16 @@ abi_long target_mremap(abi_ulong old_add
int prot;
void *host_addr;
- if (!guest_range_valid_untagged(old_addr, old_size) ||
- ((flags & MREMAP_FIXED) &&
+ if (!guest_range_valid_untagged(old_addr, old_size)) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ if (((flags & MREMAP_FIXED) &&
!guest_range_valid_untagged(new_addr, new_size)) ||
((flags & MREMAP_MAYMOVE) == 0 &&
!guest_range_valid_untagged(old_addr, new_size))) {
- errno = ENOMEM;
+ errno = EINVAL;
return -1;
}

View File

@@ -0,0 +1,31 @@
From 50bab5c2605b609ea7ea154f57a9be96d656725a Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Mon, 1 Mar 2021 13:00:47 +0000
Subject: [PATCH 07/12] qemu: Determinism fixes
When sources are included within debug information, a couple of areas of the
qemu build are not reproducible due to either full buildpaths or timestamps.
Replace the full paths with relative ones. I couldn't figure out how to get
meson to pass relative paths but we can fix that in the script.
Upstream-Status: Pending [some version of all/part of this may be accepted]
RP 2021/3/1
---
scripts/decodetree.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: qemu-8.0.0/scripts/decodetree.py
===================================================================
--- qemu-8.0.0.orig/scripts/decodetree.py
+++ qemu-8.0.0/scripts/decodetree.py
@@ -1328,7 +1328,7 @@ def main():
toppat = ExcMultiPattern(0)
for filename in args:
- input_file = filename
+ input_file = os.path.relpath(filename)
f = open(filename, 'rt', encoding='utf-8')
parse_file(f, toppat)
f.close()

View File

@@ -0,0 +1,41 @@
From 2bf9388b801d4389e2d57e95a7897bfc1c42786e Mon Sep 17 00:00:00 2001
From: Changqing Li <changqing.li@windriver.com>
Date: Thu, 14 Jan 2021 06:33:04 +0000
Subject: [PATCH 08/12] tests/meson.build: use relative path to refer to files
Fix error like:
Fatal error: can't create tests/ptimer-test.p/..._qemu-5.2.0_hw_core_ptimer.c.o: File name too long
when build path is too long, use meson.source_root() will make this
filename too long. Fixed by using relative path to refer to files
Upstream-Status: Submitted [send to qemu-devel]
Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
tests/unit/meson.build | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: qemu-8.0.0/tests/unit/meson.build
===================================================================
--- qemu-8.0.0.orig/tests/unit/meson.build
+++ qemu-8.0.0/tests/unit/meson.build
@@ -46,7 +46,7 @@ tests = {
'test-keyval': [testqapi],
'test-logging': [],
'test-uuid': [],
- 'ptimer-test': ['ptimer-test-stubs.c', meson.project_source_root() / 'hw/core/ptimer.c'],
+ 'ptimer-test': ['ptimer-test-stubs.c', '../../hw/core/ptimer.c'],
'test-qapi-util': [],
'test-interval-tree': [],
'test-xs-node': [qom],
@@ -136,7 +136,7 @@ if have_system
'test-util-sockets': ['socket-helpers.c'],
'test-base64': [],
'test-bufferiszero': [],
- 'test-smp-parse': [qom, meson.project_source_root() / 'hw/core/machine-smp.c'],
+ 'test-smp-parse': [qom, '../../hw/core/machine-smp.c'],
'test-vmstate': [migration, io],
'test-yank': ['socket-helpers.c', qom, io, chardev]
}

View File

@@ -0,0 +1,46 @@
From ebf4bb2f51da83af0c61480414cfa156f7308b34 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Mon, 21 Mar 2022 10:09:38 -0700
Subject: [PATCH 09/12] Define MAP_SYNC and MAP_SHARED_VALIDATE on needed linux
systems
linux only wires MAP_SYNC and MAP_SHARED_VALIDATE for architectures
which include asm-generic/mman.h and mips/powerpc are not including this
file in linux/mman.h, therefore these should be defined for such
architectures on Linux as well. This fixes build on mips/musl/linux
Upstream-Status: Submitted [https://lists.nongnu.org/archive/html/qemu-devel/2022-03/msg05298.html]
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Cc: Zhang Yi <yi.z.zhang@linux.intel.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
---
util/mmap-alloc.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
Index: qemu-8.0.0/util/mmap-alloc.c
===================================================================
--- qemu-8.0.0.orig/util/mmap-alloc.c
+++ qemu-8.0.0/util/mmap-alloc.c
@@ -10,14 +10,18 @@
* later. See the COPYING file in the top-level directory.
*/
+#include "qemu/osdep.h"
#ifdef CONFIG_LINUX
#include <linux/mman.h>
-#else /* !CONFIG_LINUX */
+#endif /* CONFIG_LINUX */
+
+#ifndef MAP_SYNC
#define MAP_SYNC 0x0
+#endif /* MAP_SYNC */
+#ifndef MAP_SHARED_VALIDATE
#define MAP_SHARED_VALIDATE 0x0
-#endif /* CONFIG_LINUX */
+#endif /* MAP_SHARED_VALIDATE */
-#include "qemu/osdep.h"
#include "qemu/mmap-alloc.h"
#include "qemu/host-utils.h"
#include "qemu/cutils.h"

View File

@@ -0,0 +1,40 @@
CVE: CVE-2022-1050
Upstream-Status: Submitted [https://lore.kernel.org/qemu-devel/20220403095234.2210-1-yuval.shaia.ml@gmail.com/]
Signed-off-by: Ross Burton <ross.burton@arm.com>
From dbdef95c272e8f3ec037c3db4197c66002e30995 Mon Sep 17 00:00:00 2001
From: Yuval Shaia <yuval.shaia.ml@gmail.com>
Date: Sun, 3 Apr 2022 12:52:34 +0300
Subject: [PATCH] hw/pvrdma: Protect against buggy or malicious guest driver
Guest driver might execute HW commands when shared buffers are not yet
allocated.
This could happen on purpose (malicious guest) or because of some other
guest/host address mapping error.
We need to protect againts such case.
Fixes: CVE-2022-1050
Reported-by: Raven <wxhusst@gmail.com>
Signed-off-by: Yuval Shaia <yuval.shaia.ml@gmail.com>
---
hw/rdma/vmw/pvrdma_cmd.c | 6 ++++++
1 file changed, 6 insertions(+)
Index: qemu-8.0.0/hw/rdma/vmw/pvrdma_cmd.c
===================================================================
--- qemu-8.0.0.orig/hw/rdma/vmw/pvrdma_cmd.c
+++ qemu-8.0.0/hw/rdma/vmw/pvrdma_cmd.c
@@ -782,6 +782,12 @@ int pvrdma_exec_cmd(PVRDMADev *dev)
goto out;
}
+ if (!dsr_info->dsr) {
+ /* Buggy or malicious guest driver */
+ rdma_error_report("Exec command without dsr, req or rsp buffers");
+ goto out;
+ }
+
if (dsr_info->req->hdr.cmd >= sizeof(cmd_handlers) /
sizeof(struct cmd_handler)) {
rdma_error_report("Unsupported command");

View File

@@ -0,0 +1,282 @@
From fa9bcabe2387bb230ef82d62827ad6f93b8a1e61 Mon Sep 17 00:00:00 2001
From: Frederic Konrad <fkonrad@amd.com>
Date: Wed, 17 Jan 2024 18:15:06 +0000
Subject: [PATCH 1/2] linux-user/*: workaround for missing MAP_FIXED_NOREPLACE
QEMU v8.1.0 recently requires MAP_FIXED_NOREPLACE flags implementation for mmap.
This is missing from ubuntu 18.04, thus this patch catches the mmap calls which
could use that new flag and forwards them to mmap when MAP_FIXED_NOREPLACE
flag isn't set or emulates them by checking the returned address w.r.t the
requested address.
Signed-off-by: Frederic Konrad <fkonrad@amd.com>
Signed-off-by: Francisco Iglesias <francisco.iglesias@amd.com>
Upstream-Status: Inappropriate [OE specific]
The upstream only supports the last two major releases of an OS. The ones
they have declared all have kernel 4.17 or newer.
See:
https://xilinx.slack.com/archives/D04G2647CTV/p1705074697942019
https://www.qemu.org/docs/master/about/build-platforms.html
The project aims to support the most recent major version at all times for up
to five years after its initial release. Support for the previous major
version will be dropped 2 years after the new major version is released or
when the vendor itself drops support, whichever comes first.
Signed-off-by: Mark Hatle <mark.hatle@amd.com>
---
linux-user/elfload.c | 7 +++--
linux-user/meson.build | 1 +
linux-user/mmap-fixed.c | 63 +++++++++++++++++++++++++++++++++++++++++
linux-user/mmap-fixed.h | 39 +++++++++++++++++++++++++
linux-user/mmap.c | 31 +++++++++++---------
linux-user/syscall.c | 1 +
6 files changed, 125 insertions(+), 17 deletions(-)
create mode 100644 linux-user/mmap-fixed.c
create mode 100644 linux-user/mmap-fixed.h
Index: qemu-8.2.1/linux-user/elfload.c
===================================================================
--- qemu-8.2.1.orig/linux-user/elfload.c
+++ qemu-8.2.1/linux-user/elfload.c
@@ -22,6 +22,7 @@
#include "qemu/error-report.h"
#include "target_signal.h"
#include "accel/tcg/debuginfo.h"
+#include "mmap-fixed.h"
#ifdef TARGET_ARM
#include "target/arm/cpu-features.h"
@@ -2765,9 +2766,9 @@ static abi_ulong create_elf_tables(abi_u
static int pgb_try_mmap(uintptr_t addr, uintptr_t addr_last, bool keep)
{
size_t size = addr_last - addr + 1;
- void *p = mmap((void *)addr, size, PROT_NONE,
- MAP_ANONYMOUS | MAP_PRIVATE |
- MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0);
+ void *p = mmap_fixed_noreplace((void *)addr, size, PROT_NONE,
+ MAP_ANONYMOUS | MAP_PRIVATE |
+ MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0);
int ret;
if (p == MAP_FAILED) {
Index: qemu-8.2.1/linux-user/meson.build
===================================================================
--- qemu-8.2.1.orig/linux-user/meson.build
+++ qemu-8.2.1/linux-user/meson.build
@@ -14,6 +14,7 @@ linux_user_ss.add(files(
'linuxload.c',
'main.c',
'mmap.c',
+ 'mmap-fixed.c',
'signal.c',
'strace.c',
'syscall.c',
Index: qemu-8.2.1/linux-user/mmap-fixed.c
===================================================================
--- /dev/null
+++ qemu-8.2.1/linux-user/mmap-fixed.c
@@ -0,0 +1,63 @@
+/*
+ * Workaround for MAP_FIXED_NOREPLACE
+ *
+ * Copyright (c) 2024, Advanced Micro Devices, Inc.
+ * Developed by Fred Konrad <fkonrad@amd.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <sys/mman.h>
+#include <errno.h>
+
+#ifndef MAP_FIXED_NOREPLACE
+#include "mmap-fixed.h"
+
+void *mmap_fixed_noreplace(void *addr, size_t len, int prot, int flags,
+ int fd, off_t offset)
+{
+ void *retaddr;
+
+ if (!(flags & MAP_FIXED_NOREPLACE)) {
+ /* General case, use the regular mmap. */
+ return mmap(addr, len, prot, flags, fd, offset);
+ }
+
+ /* Since MAP_FIXED_NOREPLACE is not implemented, try to emulate it. */
+ flags = flags & ~(MAP_FIXED_NOREPLACE | MAP_FIXED);
+ retaddr = mmap(addr, len, prot, flags, fd, offset);
+ if ((retaddr == addr) || (retaddr == MAP_FAILED)) {
+ /*
+ * Either the map worked and we get the good address so it can be
+ * returned, or it failed and would have failed the same with
+ * MAP_FIXED*, in which case return MAP_FAILED.
+ */
+ return retaddr;
+ } else {
+ /*
+ * Page has been mapped but not at the requested address.. unmap it and
+ * return EEXIST.
+ */
+ munmap(retaddr, len);
+ errno = EEXIST;
+ return MAP_FAILED;
+ }
+}
+
+#endif
Index: qemu-8.2.1/linux-user/mmap-fixed.h
===================================================================
--- /dev/null
+++ qemu-8.2.1/linux-user/mmap-fixed.h
@@ -0,0 +1,39 @@
+/*
+ * Workaround for MAP_FIXED_NOREPLACE
+ *
+ * Copyright (c) 2024, Advanced Micro Devices, Inc.
+ * Developed by Fred Konrad <fkonrad@amd.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MMAP_FIXED_H
+#define MMAP_FIXED_H
+
+#ifndef MAP_FIXED_NOREPLACE
+#define MAP_FIXED_NOREPLACE 0x100000
+
+void *mmap_fixed_noreplace(void *addr, size_t len, int prot, int flags,
+ int fd, off_t offset);
+
+#else /* MAP_FIXED_NOREPLACE */
+#define mmap_fixed_noreplace mmap
+#endif /* MAP_FIXED_NOREPLACE */
+
+#endif /* MMAP_FIXED_H */
Index: qemu-8.2.1/linux-user/mmap.c
===================================================================
--- qemu-8.2.1.orig/linux-user/mmap.c
+++ qemu-8.2.1/linux-user/mmap.c
@@ -25,6 +25,7 @@
#include "user-mmap.h"
#include "target_mman.h"
#include "qemu/interval-tree.h"
+#include "mmap-fixed.h"
#ifdef TARGET_ARM
#include "target/arm/cpu-features.h"
@@ -273,7 +274,7 @@ int target_mprotect(abi_ulong start, abi
static int do_munmap(void *addr, size_t len)
{
if (reserved_va) {
- void *ptr = mmap(addr, len, PROT_NONE,
+ void *ptr = mmap_fixed_noreplace(addr, len, PROT_NONE,
MAP_FIXED | MAP_ANONYMOUS
| MAP_PRIVATE | MAP_NORESERVE, -1, 0);
return ptr == addr ? 0 : -1;
@@ -319,9 +320,9 @@ static bool mmap_frag(abi_ulong real_sta
* outside of the fragment we need to map. Allocate a new host
* page to cover, discarding whatever else may have been present.
*/
- void *p = mmap(host_start, qemu_host_page_size,
- target_to_host_prot(prot),
- flags | MAP_ANONYMOUS, -1, 0);
+ void *p = mmap_fixed_noreplace(host_start, qemu_host_page_size,
+ target_to_host_prot(prot),
+ flags | MAP_ANONYMOUS, -1, 0);
if (p != host_start) {
if (p != MAP_FAILED) {
munmap(p, qemu_host_page_size);
@@ -420,8 +421,9 @@ abi_ulong mmap_find_vma(abi_ulong start,
* - mremap() with MREMAP_FIXED flag
* - shmat() with SHM_REMAP flag
*/
- ptr = mmap(g2h_untagged(addr), size, PROT_NONE,
- MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
+ ptr = mmap_fixed_noreplace(g2h_untagged(addr), size, PROT_NONE,
+ MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE,
+ -1, 0);
/* ENOMEM, if host address space has no memory */
if (ptr == MAP_FAILED) {
@@ -615,16 +617,16 @@ abi_long target_mmap(abi_ulong start, ab
* especially important if qemu_host_page_size >
* qemu_real_host_page_size.
*/
- p = mmap(g2h_untagged(start), host_len, host_prot,
- flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
+ p = mmap_fixed_noreplace(g2h_untagged(start), host_len, host_prot,
+ flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
if (p == MAP_FAILED) {
goto fail;
}
/* update start so that it points to the file position at 'offset' */
host_start = (uintptr_t)p;
if (!(flags & MAP_ANONYMOUS)) {
- p = mmap(g2h_untagged(start), len, host_prot,
- flags | MAP_FIXED, fd, host_offset);
+ p = mmap_fixed_noreplace(g2h_untagged(start), len, host_prot,
+ flags | MAP_FIXED, fd, host_offset);
if (p == MAP_FAILED) {
munmap(g2h_untagged(start), host_len);
goto fail;
@@ -749,8 +751,9 @@ abi_long target_mmap(abi_ulong start, ab
len1 = real_last - real_start + 1;
want_p = g2h_untagged(real_start);
- p = mmap(want_p, len1, target_to_host_prot(target_prot),
- flags, fd, offset1);
+ p = mmap_fixed_noreplace(want_p, len1,
+ target_to_host_prot(target_prot),
+ flags, fd, offset1);
if (p != want_p) {
if (p != MAP_FAILED) {
munmap(p, len1);
Index: qemu-8.2.1/linux-user/syscall.c
===================================================================
--- qemu-8.2.1.orig/linux-user/syscall.c
+++ qemu-8.2.1/linux-user/syscall.c
@@ -145,6 +145,7 @@
#include "qapi/error.h"
#include "fd-trans.h"
#include "cpu_loop-common.h"
+#include "mmap-fixed.h"
#ifndef CLONE_IO
#define CLONE_IO 0x80000000 /* Clone io context */

View File

@@ -0,0 +1,51 @@
From 5c73e53997df800a742f9cd7355f3045861984bb Mon Sep 17 00:00:00 2001
From: Frederic Konrad <fkonrad@amd.com>
Date: Thu, 18 Jan 2024 10:43:44 +0000
Subject: [PATCH 2/2] linux-user/*: workaround for missing MAP_SHARED_VALIDATE
QEMU v8.1.0 recently requires MAP_SHARED_VALIDATE flags implementation for mmap.
This is missing from the Ubuntu 18.04 compiler but looks like to be in the
kernel source.
Signed-off-by: Frederic Konrad <fkonrad@amd.com>
Signed-off-by: Francisco Iglesias <francisco.iglesias@amd.com>
Upstream-Status: Inappropriate [OE specific]
The upstream only supports the last two major releases of an OS. The ones
they have declared all have kernel 4.17 or newer.
See:
https://xilinx.slack.com/archives/D04G2647CTV/p1705074697942019
https://www.qemu.org/docs/master/about/build-platforms.html
The project aims to support the most recent major version at all times for up
to five years after its initial release. Support for the previous major
version will be dropped 2 years after the new major version is released or
when the vendor itself drops support, whichever comes first.
Signed-off-by: Mark Hatle <mark.hatle@amd.com>
---
linux-user/mmap-fixed.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/linux-user/mmap-fixed.h b/linux-user/mmap-fixed.h
index ef6eef5114..ec86586c1f 100644
--- a/linux-user/mmap-fixed.h
+++ b/linux-user/mmap-fixed.h
@@ -26,6 +26,10 @@
#ifndef MMAP_FIXED_H
#define MMAP_FIXED_H
+#ifndef MAP_SHARED_VALIDATE
+#define MAP_SHARED_VALIDATE 0x03
+#endif
+
#ifndef MAP_FIXED_NOREPLACE
#define MAP_FIXED_NOREPLACE 0x100000
--
2.34.1

View File

@@ -0,0 +1,60 @@
From 4a8579ad8629b57a43daa62e46cc7af6e1078116 Mon Sep 17 00:00:00 2001
From: Richard Henderson <richard.henderson@linaro.org>
Date: Tue, 13 Feb 2024 10:20:27 -1000
Subject: [PATCH] linux-user: Split out do_munmap
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Upstream-Status: Submitted [https://gitlab.com/rth7680/qemu/-/commit/4a8579ad8629b57a43daa62e46cc7af6e1078116]
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/mmap.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index 1bbfeb25b14..8ebcca44444 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -267,6 +267,21 @@ int target_mprotect(abi_ulong start, abi_ulong len, int target_prot)
return ret;
}
+/*
+ * Perform munmap on behalf of the target, with host parameters.
+ * If reserved_va, we must replace the memory reservation.
+ */
+static int do_munmap(void *addr, size_t len)
+{
+ if (reserved_va) {
+ void *ptr = mmap(addr, len, PROT_NONE,
+ MAP_FIXED | MAP_ANONYMOUS
+ | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
+ return ptr == addr ? 0 : -1;
+ }
+ return munmap(addr, len);
+}
+
/* map an incomplete host page */
static bool mmap_frag(abi_ulong real_start, abi_ulong start, abi_ulong last,
int prot, int flags, int fd, off_t offset)
@@ -854,13 +869,7 @@ static int mmap_reserve_or_unmap(abi_ulong start, abi_ulong len)
real_len = real_last - real_start + 1;
host_start = g2h_untagged(real_start);
- if (reserved_va) {
- void *ptr = mmap(host_start, real_len, PROT_NONE,
- MAP_FIXED | MAP_ANONYMOUS
- | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
- return ptr == host_start ? 0 : -1;
- }
- return munmap(host_start, real_len);
+ return do_munmap(host_start, real_len);
}
int target_munmap(abi_ulong start, abi_ulong len)
--
GitLab

View File

@@ -0,0 +1,20 @@
Upstream-Status: Inappropriate [workaround, would need a real fix for upstream]
Index: qemu-8.2.0/configure
===================================================================
--- qemu-8.2.0.orig/configure
+++ qemu-8.2.0/configure
@@ -955,12 +955,7 @@ fi
$mkvenv ensuregroup --dir "${source_path}/python/wheels" \
${source_path}/pythondeps.toml meson || exit 1
-# At this point, we expect Meson to be installed and available.
-# We expect mkvenv or pip to have created pyvenv/bin/meson for us.
-# We ignore PATH completely here: we want to use the venv's Meson
-# *exclusively*.
-
-meson="$(cd pyvenv/bin; pwd)/meson"
+meson=`which meson`
# Conditionally ensure Sphinx is installed.

View File

@@ -0,0 +1,45 @@
qemu: Ensure pip and the python venv aren't used for meson
Qemu wants to use a supported python version and a specific meson version
to "help" users and uses pip and creates a venv to do this. This is a nightmare
for us. Our versions stay up to date and should be supported so we don't
really need/want this wrapping. Tweak things to disable it.
There was breakage from the wrapper shown by:
bitbake qemu-system-native
<add DISTRO_FEATURES:remove = "opengl" to local.conf>
bitbake qemu-system-native -c configure
which would crash. The issue is the change in configuration removes pieces
from the sysroot but pyc files remainm as do pieces of pip which causes
problems.
Ideally we'd convince upstream to allow some way to disable the venv on
the understanding that if/when it breaks, we keep the pieces. The patch
as it stands is a workaround.
Upstream-Status: Inappropriate [oe specific]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Index: qemu-8.2.0/configure
===================================================================
--- qemu-8.2.0.orig/configure
+++ qemu-8.2.0/configure
@@ -937,7 +937,7 @@ python="$(command -v "$python")"
echo "python determined to be '$python'"
echo "python version: $($python --version)"
-python="$($python -B "${source_path}/python/scripts/mkvenv.py" create pyvenv)"
+python=python3
if test "$?" -ne 0 ; then
error_exit "python venv creation failed"
fi
@@ -945,6 +945,7 @@ fi
# Suppress writing compiled files
python="$python -B"
mkvenv="$python ${source_path}/python/scripts/mkvenv.py"
+mkvenv=true
# Finish preparing the virtual environment using vendored .whl files

View File

@@ -0,0 +1,75 @@
# SPDX-License-Identifier: GPL-2.0-only
# Initially written by: Michael Tokarev <mjt@tls.msk.ru>
# For QEMU Debian downstream package
set -e
. /etc/init.d/functions
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="QEMU Guest Agent"
NAME=qemu-ga
DAEMON=@bindir@/$NAME
PIDFILE=/var/run/$NAME.pid
# config
DAEMON_ARGS=""
# default transport
TRANSPORT=virtio-serial:/dev/virtio-ports/org.qemu.guest_agent.0
NO_START=0
test ! -r /etc/default/qemu-guest-agent || . /etc/default/qemu-guest-agent
test "$NO_START" = "0" || exit 0
test -x "$DAEMON" || exit 0
#
# Function that checks whenever system has necessary environment
# It also splits $TRANSPORT into $method and $path
#
do_check_transport() {
method=${TRANSPORT%%:*};
path=${TRANSPORT#*:}
case "$method" in
virtio-serial | isa-serial)
if [ ! -e "$path" ]; then
echo "$NAME: transport endpoint not found, not starting"
return 1
fi
;;
esac
}
case "$1" in
start)
do_check_transport || exit 0
echo -n "Starting $DESC: "
start-stop-daemon -S -p $PIDFILE -x "$DAEMON" -- \
$DAEMON_ARGS -d -m "$method" -p "$path"
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon -K -x "$DAEMON" -p $PIDFILE
echo "$NAME."
;;
status)
status "$DAEMON"
exit $?
;;
restart|force-reload)
do_check_transport || exit 0
echo -n "Restarting $DESC: "
start-stop-daemon -K -x "$DAEMON" -p $PIDFILE
sleep 1
start-stop-daemon -S -p $PIDFILE -x "$DAEMON" -- \
$DAEMON_ARGS -d -m "$method" -p "$path"
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|status|restart|force-reload}" >&2
exit 1
;;
esac
exit 0

View File

@@ -0,0 +1,2 @@
SUBSYSTEM=="virtio-ports", ATTR{name}=="org.qemu.guest_agent.0", \
TAG+="systemd", ENV{SYSTEMD_WANTS}="qemu-guest-agent.service"

View File

@@ -0,0 +1,13 @@
#!/bin/sh
#
#This script is used to run qemu test suites
#
ptestdir=$(dirname "$(readlink -f "$0")")
export SRC_PATH=$ptestdir
cd $ptestdir/tests
tests=$(find . -name "test-*" ! -name "*.p")
for f in $tests; do
$f | sed '/^ok/ s/ok/PASS:/g'
done

View File

@@ -0,0 +1,27 @@
BBCLASSEXTEND = "nativesdk"
require qemu.inc
DEPENDS += "glib-2.0 zlib pixman"
DEPENDS:append:libc-musl = " libucontext"
CFLAGS += "${@bb.utils.contains('DISTRO_FEATURES', 'x11', '', '-DEGL_NO_X11=1', d)}"
RDEPENDS:${PN}-common:class-target += "bash"
EXTRA_OECONF:append:class-target = " --target-list=${@get_qemu_target_list(d)}"
EXTRA_OECONF:append:class-target:mipsarcho32 = "${@bb.utils.contains('BBEXTENDCURR', 'multilib', ' --disable-capstone', '', d)}"
EXTRA_OECONF:append:class-nativesdk = " --target-list=${@get_qemu_target_list(d)}"
PACKAGECONFIG ??= " \
fdt sdl kvm pie slirp \
${@bb.utils.filter('DISTRO_FEATURES', 'alsa pulseaudio xen', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virglrenderer epoxy', '', d)} \
${@bb.utils.filter('DISTRO_FEATURES', 'seccomp', d)} \
"
PACKAGECONFIG:class-nativesdk ??= "fdt sdl kvm pie slirp \
${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virglrenderer epoxy', '', d)} \
"
# ppc32 hosts are no longer supported in qemu
COMPATIBLE_HOST:powerpc = "null"

View File

@@ -0,0 +1,40 @@
SUMMARY = "QEMU wrapper script"
HOMEPAGE = "http://qemu.org"
LICENSE = "MIT"
S = "${WORKDIR}"
DEPENDS += "qemu-native"
inherit qemu
do_populate_sysroot[depends] = ""
do_install () {
install -d ${D}${bindir_crossscripts}/
qemu_binary=${@qemu_target_binary(d)}
qemu_options='${QEMU_OPTIONS} -E LD_LIBRARY_PATH=$D${libdir}:$D${base_libdir}'
cat >> ${D}${bindir_crossscripts}/${MLPREFIX}qemuwrapper << EOF
#!/bin/sh
# Wrapper script to run binaries under qemu user-mode emulation
set -x
if [ ${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'True', 'False', d)} = False -a "${PN}" != "nativesdk-qemuwrapper-cross" ]; then
echo "qemuwrapper: qemu usermode is not supported"
exit 1
fi
$qemu_binary $qemu_options "\$@"
EOF
chmod +x ${D}${bindir_crossscripts}/${MLPREFIX}qemuwrapper
}
SYSROOT_DIRS += "${bindir_crossscripts}"
INHIBIT_DEFAULT_DEPS = "1"
BBCLASSEXTEND = "nativesdk"