distro/yocto: add meta-salmanoff Yocto layer for QEMU x86 images

Vendor the BitBake layer (recipes, network config, boost pin, kernel
append, runqemu bridge script) alongside SMO for packaging as a Yocto image.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-21 16:18:33 -04:00
parent 63ff0aa264
commit 026ba608a1
21 changed files with 1166 additions and 0 deletions
@@ -0,0 +1,17 @@
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "salmanoff"
BBFILE_PATTERN_salmanoff = "^${LAYERDIR}/"
BBFILE_PRIORITY_salmanoff = "10"
LAYERSERIES_COMPAT_salmanoff = "wrynose"
# Salmanoff requires shared Boost.System (< 1.89). Pin 1.86 from this layer.
BBMASK += ".*/boost_1.90.0.bb"
BBMASK += ".*/boost-build-native_1.90.0.bb"
PREFERRED_VERSION_boost = "1.86.%"
PREFERRED_VERSION_boost-build-native = "1.86.%"
@@ -0,0 +1,3 @@
# Layer-local build settings (require from build/conf/local.conf).
# Enables Mesa Rusticl so libopencl-mesa provides a software OpenCL ICD (llvmpipe).
DISTRO_FEATURES:append = " opencl"
@@ -0,0 +1,22 @@
require recipes-core/images/core-image-minimal.bb
SUMMARY = "Salmanoff runtime image"
IMAGE_FEATURES += "ssh-server-openssh"
IMAGE_INSTALL:append = " \
rseqsliceprobe \
iproute2 \
boost-system \
boost-log \
libcamera \
opencl-icd-loader \
libopencl-mesa \
libgallium \
clinfo \
v4l-utils \
salmanoff-rusticl-env \
liburing \
salmanoff \
"
@@ -0,0 +1,12 @@
# Salmanoff lab LAN — static eth0 for bridged QEMU on 10.42.0.0/24.
# Used with: runqemu salmanoff-image snapshot bridge=<host-bridge>
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.42.0.16
netmask 255.255.255.0
gateway 10.42.0.1
dns-nameservers 10.42.0.1
@@ -0,0 +1,7 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append = " file://salmanoff-interfaces"
do_install:append() {
install -m 0644 ${UNPACKDIR}/salmanoff-interfaces ${D}${sysconfdir}/network/interfaces
}
@@ -0,0 +1,4 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append = " file://rseq-slice-extension.cfg"
@@ -0,0 +1,3 @@
CONFIG_RSEQ=y
CONFIG_RSEQ_SLICE_EXTENSION=y
@@ -0,0 +1,59 @@
SUMMARY = "Salmanoff cognitive robotics runtime"
DESCRIPTION = "Sensor management runtime with Livox LiDAR support"
HOMEPAGE = "https://github.com/salmanoff/salmanoff"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = "file://${S}/LICENSE;beginline=1;endline=1;md5=7902e8a44912c18af1caf7499fb00176"
DEPENDS += " \
boost \
liburing \
libcamera \
opencl-headers \
virtual/libopencl1 \
flex-native \
bison-native \
"
RDEPENDS:${PN} += " \
boost-system \
boost-log \
liburing \
libcamera \
opencl-icd-loader \
libopencl-mesa \
libgallium \
salmanoff-rusticl-env \
"
SRC_URI = "gitsm://git@zbz-gitea-as-hayodea/hayodea/salmanoff.git;protocol=ssh;branch=clast"
SRCREV = "63ff0aa264b62977c5d41781d7802628f771aac0"
PV = "0.01.001"
inherit cmake pkgconfig
# Remap DWARF source paths from WORKDIR to the installed debug source tree.
DEBUG_PREFIX_MAP_EXTRA:append = " -fdebug-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}"
EXTRA_OECMAKE += " \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DENABLE_TESTS=OFF \
-DENABLE_LIB_xcbXorg=OFF \
-DENABLE_LIB_lcameraDev=ON \
-DENABLE_STIMBUFFAPI_lcameraBuff=ON \
-DENABLE_LCAMERADEV_TOOLS=OFF \
-DCOMPILE_PCL_TOOLS=OFF \
"
FILES:${PN} += " \
${libdir}/lib*.so.* \
${datadir}/salmanoff \
"
do_install:append() {
# CMake installs .daps under share/salmanoff/devices; ensure bodies path exists.
if [ ! -d ${D}${datadir}/salmanoff/devices/bodies ]; then
install -d ${D}${datadir}/salmanoff/devices/bodies
fi
}
@@ -0,0 +1,20 @@
# The Boost web site provides free peer-reviewed portable
# C++ source libraries. The emphasis is on libraries which
# work well with the C++ Standard Library. The libraries are
# intended to be widely useful, and are in regular use by
# thousands of programmers across a broad spectrum of applications.
HOMEPAGE = "http://www.boost.org/"
LICENSE = "BSL-1.0 & MIT & Python-2.0"
LIC_FILES_CHKSUM = "file://LICENSE_1_0.txt;md5=e4224ccaecb14d942c71d31bef20d78c"
BOOST_VER = "${@"_".join(d.getVar("PV").split("."))}"
BOOST_MAJ = "${@"_".join(d.getVar("PV").split(".")[0:2])}"
BOOST_P = "boost_${BOOST_VER}"
SRC_URI = "https://archives.boost.io/release/${PV}/source/${BOOST_P}.tar.bz2"
SRC_URI[sha256sum] = "1bed88e40401b2cb7a1f76d4bab499e352fa4d0c5f31c0dbae64e24d34d7513b"
UPSTREAM_CHECK_URI = "http://www.boost.org/users/download/"
UPSTREAM_CHECK_REGEX = "release/(?P<pver>.*)/source/"
S = "${UNPACKDIR}/${BOOST_P}"
@@ -0,0 +1,26 @@
SUMMARY = "Boost.Build"
DESCRIPTION = "B2 makes it easy to build C++ projects, everywhere."
HOMEPAGE = "https://github.com/boostorg/build"
SECTION = "devel"
LICENSE = "BSL-1.0"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=e4224ccaecb14d942c71d31bef20d78c"
SRC_URI = "git://github.com/boostorg/build;protocol=https;branch=master;tag=boost-${PV}"
SRCREV = "4a52d8c06635435b64e31a56eaf7ca5dc912a71d"
PE = "1"
UPSTREAM_CHECK_GITTAGREGEX = "boost-(?P<pver>(\d+(\.\d+)+))"
inherit native
do_compile() {
./bootstrap.sh
}
do_install() {
HOME=/var/run ./b2 install --prefix=${D}${prefix}
}
# The build is either release mode (pre-stripped) or debug (-O0).
INSANE_SKIP:${PN} = "already-stripped"
@@ -0,0 +1,223 @@
SUMMARY = "Free peer-reviewed portable C++ source libraries"
DESCRIPTION = "Provides free peer-reviewed portable C++ source libraries. The emphasis is on libraries which work well with the C++ \
Standard Library. One goal is to establish 'existing practice' and \
provide reference implementations so that the Boost libraries are suitable for eventual standardization. Some of the libraries have already been proposed for inclusion in the C++ Standards Committee's \
upcoming C++ Standard Library Technical Report."
SECTION = "libs"
DEPENDS = "boost-build-native zlib bzip2"
CVE_PRODUCT = "boost:boost"
ARM_INSTRUCTION_SET:armv4 = "arm"
ARM_INSTRUCTION_SET:armv5 = "arm"
B = "${WORKDIR}/build"
do_configure[cleandirs] = "${B}"
BOOST_LIBS = "\
atomic \
charconv \
chrono \
container \
context \
contract \
coroutine \
date_time \
exception \
fiber \
filesystem \
graph \
headers \
iostreams \
json \
log \
math \
process \
program_options \
random \
regex \
serialization \
system \
test \
thread \
timer \
type_erasure \
url \
wave \
${@bb.utils.filter('PACKAGECONFIG', 'locale python', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'graph_parallel', 'graph_parallel mpi', \
bb.utils.filter('PACKAGECONFIG', 'mpi', d), d)} \
"
# optional libraries
PACKAGECONFIG ??= "locale python"
PACKAGECONFIG[locale] = ",,icu"
PACKAGECONFIG[graph_parallel] = ",,,boost-mpi mpich"
PACKAGECONFIG[mpi] = ",,mpich"
PACKAGECONFIG[python] = ",,python3"
inherit python3-dir
PYTHON_ROOT = "${STAGING_DIR_HOST}/${prefix}"
# Make a package for each library, plus -dev
PACKAGES = "${PN}-dbg ${BOOST_PACKAGES}"
python __anonymous () {
packages = []
extras = []
pn = d.getVar("PN")
mlprefix = d.getVar("MLPREFIX")
for lib in d.getVar('BOOST_LIBS').split():
extras.append("--with-%s" % lib)
pkg = "%s-%s" % (d.getVar("BPN"), lib.replace("_", "-"))
if "-native" in pn:
pkg = pkg + "-native"
packages.append(mlprefix + pkg)
if not d.getVar("FILES:%s%s" % (mlprefix, pkg)):
d.setVar("FILES:%s%s" % (mlprefix, pkg), "${libdir}/libboost_%s*.so.*" % lib)
d.setVar("BOOST_PACKAGES", " ".join(packages))
d.setVar("BJAM_EXTRA", " ".join(extras))
}
# Override the contents of specific packages
FILES:${PN}-graph_parallel = "${libdir}/libboost_graph_parallel.so.*"
FILES:${PN}-locale = "${libdir}/libboost_locale.so.*"
FILES:${PN}-mpi = "${libdir}/mpi.so ${libdir}/libboost_mpi*.so.*"
FILES:${PN}-serialization = "${libdir}/libboost_serialization*.so.* \
${libdir}/libboost_wserialization*.so.*"
FILES:${PN}-test = "${libdir}/libboost_prg_exec_monitor*.so.* \
${libdir}/libboost_unit_test_framework*.so.*"
# -dev last to pick up the remaining stuff
PACKAGES += "${PN}-dev ${PN}-staticdev"
FILES:${PN}-dev = "${includedir} ${libdir}/libboost_*.so ${libdir}/cmake"
FILES:${PN}-staticdev = "${libdir}/libboost_*.a"
# "boost" is a metapackage which pulls in all boost librabries
PACKAGES += "${PN}"
FILES:${PN} = ""
ALLOW_EMPTY:${PN} = "1"
RRECOMMENDS:${PN} += "${BOOST_PACKAGES}"
RRECOMMENDS:${PN}:class-native = ""
# to avoid GNU_HASH QA errors added LDFLAGS to ARCH; a little bit dirty but at least it works
TARGET_CC_ARCH += "${LDFLAGS}"
# Oh yippee, a new build system, it's sooo cooool I could eat my own
# foot. inlining=on lets the compiler choose, I think. At least this
# stuff is documented...
# NOTE: if you leave <debug-symbols>on then in a debug build the build sys
# objcopy will be invoked, and that won't work. Building debug apparently
# requires hacking gcc-tools.jam
#
# Sometimes I wake up screaming. Famous figures are gathered in the nightmare,
# Steve Bourne, Larry Wall, the whole of the ANSI C committee. They're just
# standing there, waiting, but the truely terrifying thing is what they carry
# in their hands. At first sight each seems to bear the same thing, but it is
# not so for the forms in their grasp are ever so slightly different one from
# the other. Each is twisted in some grotesque way from the other to make each
# an unspeakable perversion impossible to perceive without the onset of madness.
# True insanity awaits anyone who perceives all of these horrors together.
#
# Quotation marks, there might be an easier way to do this, but I can't find
# it. The problem is that the user.hpp configuration file must receive a
# pre-processor macro defined as the appropriate string - complete with "'s
# around it. (<> is a possibility here but the danger to that is that the
# failure case interprets the < and > as shell redirections, creating
# random files in the source tree.)
#
#bjam: '-DBOOST_PLATFORM_CONFIG=\"config\"'
#do_compile: '-sGCC=... '"'-DBOOST_PLATFORM_CONFIG=\"config\"'"
SQD = '"'
EQD = '\"'
#boost.bb: "... '-sGCC=... '${SQD}'-DBOOST_PLATFORM_CONFIG=${EQD}config${EQD}'${SQD} ..."
BJAM_CONF = "${SQD}'-DBOOST_PLATFORM_CONFIG=${EQD}boost/config/platform/${TARGET_OS}.hpp${EQD}'${SQD}"
BJAM_TOOLS = "--ignore-site-config \
'-sTOOLS=gcc' \
'-sGCC=${CC} '${BJAM_CONF} \
'-sGXX=${CXX} '${BJAM_CONF} \
'-sGCC_INCLUDE_DIRECTORY=${STAGING_INCDIR}' \
'-sGCC_STDLIB_DIRECTORY=${STAGING_LIBDIR}' \
'-sBUILD=release <optimization>space <threading>multi <inlining>on <debug-symbols>off' \
'-sPYTHON_ROOT=${PYTHON_ROOT}' \
'--layout=system' \
"
# use PARALLEL_MAKE to speed up the build
BOOST_PARALLEL_MAKE = "${@oe.utils.parallel_make_argument(d, '-j%d')}"
BJAM_OPTS = '${BOOST_PARALLEL_MAKE} -d+2 -q \
${BJAM_TOOLS} \
-sBOOST_BUILD_USER_CONFIG=${WORKDIR}/user-config.jam \
-sICU_PATH=${STAGING_EXECPREFIXDIR} \
--build-dir=${B} \
--disable-icu \
${BJAM_EXTRA}'
# Native compilation of bzip2 isn't working
BJAM_OPTS:append:class-native = ' -sNO_BZIP2=1'
# Adjust the build for x32
BJAM_OPTS:append:x86-x32 = " abi=x32 address-model=64"
# cross compiling for arm fails to detect abi, so provide some help
BJAM_OPTS:append:arm = " abi=aapcs architecture=arm"
BJAM_OPTS:append:aarch64 = " abi=aapcs address-model=64 architecture=arm"
do_configure() {
cd ${S}
cp -f ${S}/boost/config/platform/linux.hpp ${S}/boost/config/platform/linux-gnueabi.hpp
# D2194:Fixing the failure of "error: duplicate initialization of gcc with the following parameters" during compilation.
rm -f ${WORKDIR}/user-config.jam
echo 'using gcc : : ${CXX} : <cflags>"${CFLAGS}" <cxxflags>"${CXXFLAGS}" <linkflags>"${LDFLAGS}" ;' >> ${WORKDIR}/user-config.jam
# If we want Python then we need to tell Boost *exactly* where to find it
if ${@bb.utils.contains('BOOST_LIBS', 'python', 'true', 'false', d)}; then
echo "using python : ${PYTHON_BASEVERSION} : ${STAGING_DIR_HOST}${bindir}/python3 : ${STAGING_DIR_HOST}${includedir}/${PYTHON_DIR}${PYTHON_ABI} : ${STAGING_DIR_HOST}${libdir}/${PYTHON_DIR} ;" >> ${WORKDIR}/user-config.jam
fi
if ${@bb.utils.contains('BOOST_LIBS', 'mpi', 'true', 'false', d)}; then
echo "using mpi : : <find-shared-library>mpi ;" >> ${WORKDIR}/user-config.jam
fi
CC="${BUILD_CC}" CFLAGS="${BUILD_CFLAGS}" ./bootstrap.sh --with-bjam=b2 --with-toolset=gcc
# Boost can't be trusted to find Python on it's own, so remove any mention
# of it from the boost configuration
sed -i '/using python/d' ${S}/project-config.jam
}
do_compile() {
cd ${S}
b2 ${BJAM_OPTS} \
--prefix=${prefix} \
--exec-prefix=${exec_prefix} \
--libdir=${libdir} \
--includedir=${includedir} \
--debug-configuration
}
do_install() {
cd ${S}
b2 ${BJAM_OPTS} \
--libdir=${D}${libdir} \
--includedir=${D}${includedir} \
install
for lib in ${BOOST_LIBS}; do
if [ -e ${D}${libdir}/libboost_${lib}.a ]; then
ln -s libboost_${lib}.a ${D}${libdir}/libboost_${lib}-mt.a
fi
if [ -e ${D}${libdir}/libboost_${lib}.so ]; then
ln -s libboost_${lib}.so ${D}${libdir}/libboost_${lib}-mt.so
fi
done
# Cmake files reference full paths to image
find ${D}${libdir}/cmake -type f | \
grep 'cmake$' | \
xargs -n 1 sed -e 's,${D}${libdir}/cmake,${libdir}/cmake,' -i
}
BBCLASSEXTEND = "native nativesdk"
@@ -0,0 +1,175 @@
From f88354966fe3af33fd6d9ec889a8e3926b886a8a Mon Sep 17 00:00:00 2001
From: Alexander Kanavin <alex.kanavin@gmail.com>
Date: Tue, 18 Dec 2018 15:42:57 +0100
Subject: [PATCH] Don't set up arch/instruction-set flags, we do that
ourselves
Upstream-Status: Inappropriate
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
---
tools/build/src/tools/gcc.jam | 153 ----------------------------------
1 file changed, 153 deletions(-)
diff --git a/tools/build/src/tools/gcc.jam b/tools/build/src/tools/gcc.jam
index b7825d4e6..ed7e39baf 100644
--- a/tools/build/src/tools/gcc.jam
+++ b/tools/build/src/tools/gcc.jam
@@ -1144,156 +1144,3 @@ local rule cpu-flags ( toolset variable : architecture : instruction-set + :
<architecture>$(architecture)/<instruction-set>$(instruction-set)
: $(values) ;
}
-
-
-# Set architecture/instruction-set options.
-#
-# x86 and compatible
-# The 'native' option appeared in gcc 4.2 so we cannot safely use it as default.
-# Use i686 instead for 32-bit.
-toolset.flags gcc OPTIONS <architecture>x86/<address-model>32/<instruction-set> : -march=i686 ;
-cpu-flags gcc OPTIONS : x86 : native : -march=native ;
-cpu-flags gcc OPTIONS : x86 : i486 : -march=i486 ;
-cpu-flags gcc OPTIONS : x86 : i586 : -march=i586 ;
-cpu-flags gcc OPTIONS : x86 : i686 : -march=i686 ;
-cpu-flags gcc OPTIONS : x86 : pentium : -march=pentium ;
-cpu-flags gcc OPTIONS : x86 : pentium-mmx : -march=pentium-mmx ;
-cpu-flags gcc OPTIONS : x86 : pentiumpro : -march=pentiumpro ;
-cpu-flags gcc OPTIONS : x86 : pentium2 : -march=pentium2 ;
-cpu-flags gcc OPTIONS : x86 : pentium3 : -march=pentium3 ;
-cpu-flags gcc OPTIONS : x86 : pentium3m : -march=pentium3m ;
-cpu-flags gcc OPTIONS : x86 : pentium-m : -march=pentium-m ;
-cpu-flags gcc OPTIONS : x86 : pentium4 : -march=pentium4 ;
-cpu-flags gcc OPTIONS : x86 : pentium4m : -march=pentium4m ;
-cpu-flags gcc OPTIONS : x86 : prescott : -march=prescott ;
-cpu-flags gcc OPTIONS : x86 : nocona : -march=nocona ;
-cpu-flags gcc OPTIONS : x86 : core2 : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : conroe : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : conroe-xe : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : conroe-l : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : allendale : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : wolfdale : -march=core2 -msse4.1 ;
-cpu-flags gcc OPTIONS : x86 : merom : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : merom-xe : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : kentsfield : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : kentsfield-xe : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : yorksfield : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : penryn : -march=core2 ;
-cpu-flags gcc OPTIONS : x86 : corei7 : -march=corei7 ;
-cpu-flags gcc OPTIONS : x86 : nehalem : -march=corei7 ;
-cpu-flags gcc OPTIONS : x86 : corei7-avx : -march=corei7-avx ;
-cpu-flags gcc OPTIONS : x86 : sandy-bridge : -march=corei7-avx ;
-cpu-flags gcc OPTIONS : x86 : core-avx-i : -march=core-avx-i ;
-cpu-flags gcc OPTIONS : x86 : ivy-bridge : -march=core-avx-i ;
-cpu-flags gcc OPTIONS : x86 : haswell : -march=core-avx-i -mavx2 -mfma -mbmi -mbmi2 -mlzcnt ;
-cpu-flags gcc OPTIONS : x86 : broadwell : -march=broadwell ;
-cpu-flags gcc OPTIONS : x86 : skylake : -march=skylake ;
-cpu-flags gcc OPTIONS : x86 : skylake-avx512 : -march=skylake-avx512 ;
-cpu-flags gcc OPTIONS : x86 : cannonlake : -march=skylake-avx512 -mavx512vbmi -mavx512ifma -msha ;
-cpu-flags gcc OPTIONS : x86 : icelake-client : -march=icelake-client ;
-cpu-flags gcc OPTIONS : x86 : icelake-server : -march=icelake-server ;
-cpu-flags gcc OPTIONS : x86 : cascadelake : -march=skylake-avx512 -mavx512vnni ;
-cpu-flags gcc OPTIONS : x86 : cooperlake : -march=cooperlake ;
-cpu-flags gcc OPTIONS : x86 : tigerlake : -march=tigerlake ;
-cpu-flags gcc OPTIONS : x86 : rocketlake : -march=rocketlake ;
-cpu-flags gcc OPTIONS : x86 : alderlake : -march=alderlake ;
-cpu-flags gcc OPTIONS : x86 : sapphirerapids : -march=sapphirerapids ;
-cpu-flags gcc OPTIONS : x86 : k6 : -march=k6 ;
-cpu-flags gcc OPTIONS : x86 : k6-2 : -march=k6-2 ;
-cpu-flags gcc OPTIONS : x86 : k6-3 : -march=k6-3 ;
-cpu-flags gcc OPTIONS : x86 : athlon : -march=athlon ;
-cpu-flags gcc OPTIONS : x86 : athlon-tbird : -march=athlon-tbird ;
-cpu-flags gcc OPTIONS : x86 : athlon-4 : -march=athlon-4 ;
-cpu-flags gcc OPTIONS : x86 : athlon-xp : -march=athlon-xp ;
-cpu-flags gcc OPTIONS : x86 : athlon-mp : -march=athlon-mp ;
-##
-cpu-flags gcc OPTIONS : x86 : k8 : -march=k8 ;
-cpu-flags gcc OPTIONS : x86 : opteron : -march=opteron ;
-cpu-flags gcc OPTIONS : x86 : athlon64 : -march=athlon64 ;
-cpu-flags gcc OPTIONS : x86 : athlon-fx : -march=athlon-fx ;
-cpu-flags gcc OPTIONS : x86 : k8-sse3 : -march=k8-sse3 ;
-cpu-flags gcc OPTIONS : x86 : opteron-sse3 : -march=opteron-sse3 ;
-cpu-flags gcc OPTIONS : x86 : athlon64-sse3 : -march=athlon64-sse3 ;
-cpu-flags gcc OPTIONS : x86 : amdfam10 : -march=amdfam10 ;
-cpu-flags gcc OPTIONS : x86 : barcelona : -march=barcelona ;
-cpu-flags gcc OPTIONS : x86 : bdver1 : -march=bdver1 ;
-cpu-flags gcc OPTIONS : x86 : bdver2 : -march=bdver2 ;
-cpu-flags gcc OPTIONS : x86 : bdver3 : -march=bdver3 ;
-cpu-flags gcc OPTIONS : x86 : bdver4 : -march=bdver4 ;
-cpu-flags gcc OPTIONS : x86 : btver1 : -march=btver1 ;
-cpu-flags gcc OPTIONS : x86 : btver2 : -march=btver2 ;
-cpu-flags gcc OPTIONS : x86 : znver1 : -march=znver1 ;
-cpu-flags gcc OPTIONS : x86 : znver2 : -march=znver2 ;
-cpu-flags gcc OPTIONS : x86 : znver3 : -march=znver3 ;
-cpu-flags gcc OPTIONS : x86 : winchip-c6 : -march=winchip-c6 ;
-cpu-flags gcc OPTIONS : x86 : winchip2 : -march=winchip2 ;
-cpu-flags gcc OPTIONS : x86 : c3 : -march=c3 ;
-cpu-flags gcc OPTIONS : x86 : c3-2 : -march=c3-2 ;
-cpu-flags gcc OPTIONS : x86 : c7 : -march=c7 ;
-##
-cpu-flags gcc OPTIONS : x86 : atom : -march=atom ;
-# Sparc
-cpu-flags gcc OPTIONS : sparc : v7 : -mcpu=v7 : default ;
-cpu-flags gcc OPTIONS : sparc : cypress : -mcpu=cypress ;
-cpu-flags gcc OPTIONS : sparc : v8 : -mcpu=v8 ;
-cpu-flags gcc OPTIONS : sparc : supersparc : -mcpu=supersparc ;
-cpu-flags gcc OPTIONS : sparc : sparclite : -mcpu=sparclite ;
-cpu-flags gcc OPTIONS : sparc : hypersparc : -mcpu=hypersparc ;
-cpu-flags gcc OPTIONS : sparc : sparclite86x : -mcpu=sparclite86x ;
-cpu-flags gcc OPTIONS : sparc : f930 : -mcpu=f930 ;
-cpu-flags gcc OPTIONS : sparc : f934 : -mcpu=f934 ;
-cpu-flags gcc OPTIONS : sparc : sparclet : -mcpu=sparclet ;
-cpu-flags gcc OPTIONS : sparc : tsc701 : -mcpu=tsc701 ;
-cpu-flags gcc OPTIONS : sparc : v9 : -mcpu=v9 ;
-cpu-flags gcc OPTIONS : sparc : ultrasparc : -mcpu=ultrasparc ;
-cpu-flags gcc OPTIONS : sparc : ultrasparc3 : -mcpu=ultrasparc3 ;
-# RS/6000 & PowerPC
-cpu-flags gcc OPTIONS : power : 403 : -mcpu=403 ;
-cpu-flags gcc OPTIONS : power : 505 : -mcpu=505 ;
-cpu-flags gcc OPTIONS : power : 601 : -mcpu=601 ;
-cpu-flags gcc OPTIONS : power : 602 : -mcpu=602 ;
-cpu-flags gcc OPTIONS : power : 603 : -mcpu=603 ;
-cpu-flags gcc OPTIONS : power : 603e : -mcpu=603e ;
-cpu-flags gcc OPTIONS : power : 604 : -mcpu=604 ;
-cpu-flags gcc OPTIONS : power : 604e : -mcpu=604e ;
-cpu-flags gcc OPTIONS : power : 620 : -mcpu=620 ;
-cpu-flags gcc OPTIONS : power : 630 : -mcpu=630 ;
-cpu-flags gcc OPTIONS : power : 740 : -mcpu=740 ;
-cpu-flags gcc OPTIONS : power : 7400 : -mcpu=7400 ;
-cpu-flags gcc OPTIONS : power : 7450 : -mcpu=7450 ;
-cpu-flags gcc OPTIONS : power : 750 : -mcpu=750 ;
-cpu-flags gcc OPTIONS : power : 801 : -mcpu=801 ;
-cpu-flags gcc OPTIONS : power : 821 : -mcpu=821 ;
-cpu-flags gcc OPTIONS : power : 823 : -mcpu=823 ;
-cpu-flags gcc OPTIONS : power : 860 : -mcpu=860 ;
-cpu-flags gcc OPTIONS : power : 970 : -mcpu=970 ;
-cpu-flags gcc OPTIONS : power : 8540 : -mcpu=8540 ;
-cpu-flags gcc OPTIONS : power : power : -mcpu=power ;
-cpu-flags gcc OPTIONS : power : power2 : -mcpu=power2 ;
-cpu-flags gcc OPTIONS : power : power3 : -mcpu=power3 ;
-cpu-flags gcc OPTIONS : power : power4 : -mcpu=power4 ;
-cpu-flags gcc OPTIONS : power : power5 : -mcpu=power5 ;
-cpu-flags gcc OPTIONS : power : powerpc : -mcpu=powerpc ;
-cpu-flags gcc OPTIONS : power : powerpc64 : -mcpu=powerpc64 ;
-cpu-flags gcc OPTIONS : power : rios : -mcpu=rios ;
-cpu-flags gcc OPTIONS : power : rios1 : -mcpu=rios1 ;
-cpu-flags gcc OPTIONS : power : rios2 : -mcpu=rios2 ;
-cpu-flags gcc OPTIONS : power : rsc : -mcpu=rsc ;
-cpu-flags gcc OPTIONS : power : rs64a : -mcpu=rs64 ;
-cpu-flags gcc OPTIONS : s390x : z196 : -march=z196 ;
-cpu-flags gcc OPTIONS : s390x : zEC12 : -march=zEC12 ;
-cpu-flags gcc OPTIONS : s390x : z13 : -march=z13 ;
-cpu-flags gcc OPTIONS : s390x : z14 : -march=z14 ;
-cpu-flags gcc OPTIONS : s390x : z15 : -march=z15 ;
-# ARM
-cpu-flags gcc OPTIONS : arm : cortex-a9+vfpv3 : -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard ;
-cpu-flags gcc OPTIONS : arm : cortex-a53 : -mcpu=cortex-a53 ;
-cpu-flags gcc OPTIONS : arm : cortex-r5 : -mcpu=cortex-r5 ;
-cpu-flags gcc OPTIONS : arm : cortex-r5+vfpv3-d16 : -mcpu=cortex-r5 -mfpu=vfpv3-d16 -mfloat-abi=hard ;
-# AIX variant of RS/6000 & PowerPC
-toolset.flags gcc AROPTIONS <address-model>64/<target-os>aix : "-X64" ;
-
-# Enable response file control
-toolset.flags gcc RESPONSE_FILE_SUB <response-file>auto : a ;
-toolset.flags gcc RESPONSE_FILE_SUB <response-file>file : f ;
-toolset.flags gcc RESPONSE_FILE_SUB <response-file>contents : c ;
@@ -0,0 +1,41 @@
From 7130850d74863d1e9a0ae3e85462f1466bdf6d88 Mon Sep 17 00:00:00 2001
From: Anuj Mittal <anuj.mittal@intel.com>
Date: Thu, 14 Nov 2019 10:13:53 +0800
Subject: [PATCH] dont setup compiler flags -m32/-m64
We don't want these to be setup by boost as we pass our own flags.
Upstream-Status: Inappropriate [OE-specific]
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
---
tools/build/src/tools/gcc.jam | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/tools/build/src/tools/gcc.jam b/tools/build/src/tools/gcc.jam
index ed7e39baf..90513f84a 100644
--- a/tools/build/src/tools/gcc.jam
+++ b/tools/build/src/tools/gcc.jam
@@ -377,22 +377,6 @@ local rule compile-link-flags ( * )
compile-link-flags <link>shared/<target-os>$(non-windows) : -fPIC ;
}
-{
- # Handle address-model
- compile-link-flags <target-os>aix/<address-model>32 : -maix32 ;
- compile-link-flags <target-os>aix/<address-model>64 : -maix64 ;
-
- compile-link-flags <target-os>hpux/<address-model>32 : -milp32 ;
- compile-link-flags <target-os>hpux/<address-model>64 : -mlp64 ;
-
- local generic-os = [ set.difference $(all-os) : aix hpux ] ;
- compile-link-flags <target-os>$(generic-os)/<architecture>s390x/<address-model>32 : -m31 ;
- compile-link-flags <target-os>$(generic-os)/<architecture>s390x/<address-model>64 : -m64 ;
- local arch = power sparc x86 ;
- compile-link-flags <target-os>$(generic-os)/<architecture>$(arch)/<address-model>32 : -m32 ;
- compile-link-flags <target-os>$(generic-os)/<architecture>$(arch)/<address-model>64 : -m64 ;
-}
-
{
# Handle threading
local rule threading-flags ( * )
@@ -0,0 +1,28 @@
From c6009cdc1fe76db0092443593396e4d5f0eaa86b Mon Sep 17 00:00:00 2001
From: Jackie Huang <jackie.huang@windriver.com>
Date: Fri, 23 Sep 2016 01:04:50 -0700
Subject: [PATCH] boost-math: disable pch for gcc
Upstream-Status: Inappropriate [*]
* It's a work around for a defect when build in parallel:
https://svn.boost.org/trac/boost/ticket/12477
Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
---
libs/math/build/Jamfile.v2 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libs/math/build/Jamfile.v2 b/libs/math/build/Jamfile.v2
index 6549e06b7..342cbf0b1 100644
--- a/libs/math/build/Jamfile.v2
+++ b/libs/math/build/Jamfile.v2
@@ -13,7 +13,7 @@ project
<toolset>intel-win:<linkflags>-nologo
#<toolset>intel-linux:<pch>off
<toolset>intel-darwin:<pch>off
- <toolset>gcc,<target-os>windows:<pch>off
+ <toolset>gcc:<pch>off
#<toolset>gcc:<cxxflags>-fvisibility=hidden
<toolset>intel-linux:<cxxflags>-fvisibility=hidden
#<toolset>sun:<cxxflags>-xldscope=hidden
@@ -0,0 +1,7 @@
require boost-${PV}.inc
require boost.inc
SRC_URI += "file://boost-math-disable-pch-for-gcc.patch \
file://0001-Don-t-set-up-arch-instruction-set-flags-we-do-that-o.patch \
file://0001-dont-setup-compiler-flags-m32-m64.patch \
"
@@ -0,0 +1,3 @@
# Wrynose ships Boost 1.90; Salmanoff requires Boost >= 1.69 and < 1.89.
# meta-salmanoff provides boost_1.86.0.bb; layer.conf masks this recipe and
# sets PREFERRED_VERSION_boost = "1.86.%".
@@ -0,0 +1,452 @@
#include <cerrno>
#include <cinttypes>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <linux/auxvec.h>
#include <linux/rseq.h>
#include <sys/auxv.h>
#include <sys/prctl.h>
#include <sys/syscall.h>
#include <sys/utsname.h>
#include <unistd.h>
#ifndef ENOTSUPP
#define ENOTSUPP 524
#endif
#if defined(__x86_64__)
#ifndef ARCH_GET_FS
#define ARCH_GET_FS 0x1003
#endif
#endif
#ifndef PR_RSEQ_SLICE_EXTENSION
#define PR_RSEQ_SLICE_EXTENSION 79
#define PR_RSEQ_SLICE_EXTENSION_GET 1
#define PR_RSEQ_SLICE_EXTENSION_SET 2
#define PR_RSEQ_SLICE_EXT_ENABLE 0x01
#endif
#ifndef RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE
#define RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE (1U << 4)
#define RSEQ_CS_FLAG_SLICE_EXT_ENABLED (1U << 5)
#endif
#ifndef RSEQ_SIG
#if defined(__x86_64__) || defined(__i386__)
#define RSEQ_SIG 0x53053053
#elif defined(__aarch64__)
#define RSEQ_SIG 0x00bc28d4
#else
#error "Add RSEQ_SIG for this architecture"
#endif
#endif
#ifndef SYS_rseq
#ifdef __NR_rseq
#define SYS_rseq __NR_rseq
#endif
#endif
#ifndef SYS_getcpu
#ifdef __NR_getcpu
#define SYS_getcpu __NR_getcpu
#endif
#endif
extern "C" {
extern __attribute__((weak)) ptrdiff_t __rseq_offset;
extern __attribute__((weak)) unsigned int __rseq_size;
extern __attribute__((weak)) unsigned int __rseq_flags;
}
struct rseq_slice_ctrl_fields {
uint8_t request;
uint8_t granted;
uint16_t reserved;
};
struct rseq_slice_ctrl_compat {
union {
uint32_t all;
rseq_slice_ctrl_fields parts;
};
};
struct rseq_compat {
uint32_t cpu_id_start;
int32_t cpu_id;
uint64_t rseq_cs;
uint32_t flags;
uint32_t node_id;
uint32_t mm_cid;
struct rseq_slice_ctrl_compat slice_ctrl;
uint8_t reserved;
} __attribute__((aligned(32)));
struct prctl_probe_result {
bool ok;
int value;
int err;
};
alignas(32) static thread_local unsigned char local_rseq_storage[512];
static unsigned int g_rseq_feature_size;
static unsigned int g_rseq_alloc_size;
static unsigned int g_rseq_align;
static unsigned long g_aux_rseq_feature_size;
static unsigned long g_aux_rseq_align;
static struct rseq *g_registered_rseq;
static struct rseq_compat *g_registered_rseq_compat;
static bool g_own_registration;
static const char *yes_no(bool value)
{
return value ? "yes" : "no";
}
static const char *set_clear(bool value)
{
return value ? "set" : "clear";
}
static int get_thread_pointer(uintptr_t *tp_out)
{
#if defined(__x86_64__)
unsigned long fsbase = 0;
if (syscall(SYS_arch_prctl, ARCH_GET_FS, &fsbase) != 0)
return -1;
*tp_out = fsbase;
return 0;
#elif defined(__aarch64__)
void *tp = nullptr;
__asm__ volatile("mrs %0, tpidr_el0" : "=r"(tp));
*tp_out = reinterpret_cast<uintptr_t>(tp);
return 0;
#else
(void) tp_out;
errno = ENOTSUP;
return -1;
#endif
}
static int sys_rseq(struct rseq *rseq, uint32_t len, int flags, uint32_t sig)
{
#ifdef SYS_rseq
return static_cast<int>(syscall(SYS_rseq, rseq, len, flags, sig));
#else
(void) rseq;
(void) len;
(void) flags;
(void) sig;
errno = ENOSYS;
return -1;
#endif
}
static int sys_getcpu(unsigned int *cpu, unsigned int *node)
{
#ifdef SYS_getcpu
return static_cast<int>(syscall(SYS_getcpu, cpu, node, nullptr));
#else
(void) cpu;
(void) node;
errno = ENOSYS;
return -1;
#endif
}
static const char *errno_name(int err)
{
switch (err) {
case 0: return "0";
case EINVAL: return "EINVAL";
case ENOSYS: return "ENOSYS";
case ENOTSUP: return "ENOTSUP";
case ENOTSUPP: return "ENOTSUPP";
case ENXIO: return "ENXIO";
case EPERM: return "EPERM";
case EBUSY: return "EBUSY";
default: return "UNKNOWN";
}
}
static const char *prctl_failure_meaning(int err)
{
switch (err) {
case EINVAL:
return "the prctl operation or argument is not accepted by this kernel";
case ENOTSUPP:
return "the prctl operation exists, but the slice extension is not supported here";
case EPERM:
return "the kernel denied the requested operation";
default:
return "the kernel returned an unclassified failure";
}
}
static void print_errno_status(const char *label, int err)
{
std::printf("%s: errno=%d (%s: %s)\n",
label, err, errno_name(err), std::strerror(err));
}
static unsigned int max_u32(unsigned int a, unsigned int b)
{
return a > b ? a : b;
}
static bool feature_present(size_t end_offset)
{
return g_rseq_feature_size >= end_offset;
}
static void print_registration_source(void)
{
if (g_own_registration)
std::printf("rseq registration: local syscall registration\n");
else
std::printf("rseq registration: existing libc-owned registration\n");
}
static int setup_rseq(void)
{
g_aux_rseq_feature_size = getauxval(AT_RSEQ_FEATURE_SIZE);
g_aux_rseq_align = getauxval(AT_RSEQ_ALIGN);
g_rseq_feature_size = g_aux_rseq_feature_size ?
static_cast<unsigned int>(g_aux_rseq_feature_size) : 20U;
g_rseq_align = g_aux_rseq_align ?
static_cast<unsigned int>(g_aux_rseq_align) : 32U;
g_rseq_alloc_size = max_u32(g_rseq_feature_size, 32U);
if (&__rseq_size != nullptr && __rseq_size != 0) {
uintptr_t tp = 0;
if (get_thread_pointer(&tp) != 0) {
std::perror("get_thread_pointer");
return -1;
}
g_registered_rseq = reinterpret_cast<struct rseq *>(tp + __rseq_offset);
g_registered_rseq_compat = reinterpret_cast<struct rseq_compat *>(tp + __rseq_offset);
g_own_registration = false;
if (__rseq_size < g_rseq_feature_size)
g_rseq_feature_size = __rseq_size;
if (__rseq_size > g_rseq_alloc_size)
g_rseq_alloc_size = __rseq_size;
return 0;
}
if (g_rseq_alloc_size > sizeof(local_rseq_storage)) {
std::fprintf(stderr,
"local rseq area too small: need %u bytes, have %zu\n",
g_rseq_alloc_size, sizeof(local_rseq_storage));
errno = EOVERFLOW;
return -1;
}
if ((reinterpret_cast<uintptr_t>(local_rseq_storage) % g_rseq_align) != 0) {
std::fprintf(stderr, "local rseq area alignment mismatch: need %u\n",
g_rseq_align);
errno = EINVAL;
return -1;
}
auto *local_rseq = reinterpret_cast<struct rseq *>(local_rseq_storage);
auto *local_rseq_compat = reinterpret_cast<struct rseq_compat *>(local_rseq_storage);
std::memset(local_rseq_storage, 0, sizeof(local_rseq_storage));
local_rseq_compat->cpu_id = RSEQ_CPU_ID_UNINITIALIZED;
if (sys_rseq(local_rseq, g_rseq_alloc_size, 0, RSEQ_SIG) != 0) {
std::perror("rseq register");
return -1;
}
g_registered_rseq = local_rseq;
g_registered_rseq_compat = local_rseq_compat;
g_own_registration = true;
return 0;
}
static void teardown_rseq(void)
{
if (!g_own_registration)
return;
auto *local_rseq = reinterpret_cast<struct rseq *>(local_rseq_storage);
if (sys_rseq(local_rseq, g_rseq_alloc_size, RSEQ_FLAG_UNREGISTER, RSEQ_SIG) != 0)
std::perror("rseq unregister");
}
static prctl_probe_result probe_prctl_get(void)
{
errno = 0;
int rc = prctl(PR_RSEQ_SLICE_EXTENSION, PR_RSEQ_SLICE_EXTENSION_GET,
0UL, 0UL, 0UL);
int saved_errno = errno;
if (rc >= 0)
return { true, rc, 0 };
return { false, -1, saved_errno };
}
static prctl_probe_result probe_prctl_set(unsigned long value)
{
errno = 0;
int rc = prctl(PR_RSEQ_SLICE_EXTENSION, PR_RSEQ_SLICE_EXTENSION_SET,
value, 0UL, 0UL);
int saved_errno = errno;
if (rc >= 0)
return { true, rc, 0 };
return { false, -1, saved_errno };
}
static void print_prctl_result(const char *label, const prctl_probe_result &result)
{
if (result.ok) {
std::printf("%s: ok, value=%d\n", label, result.value);
return;
}
print_errno_status(label, result.err);
std::printf("%s meaning: %s\n", label, prctl_failure_meaning(result.err));
}
static void print_kernel_version(void)
{
struct utsname uts;
if (uname(&uts) != 0) {
std::perror("uname");
return;
}
std::printf("kernel: %s %s %s %s\n",
uts.sysname, uts.release, uts.version, uts.machine);
}
static void print_slice_status_summary(bool has_slice_ctrl, bool flags_available,
const prctl_probe_result &get_result)
{
bool flag_available = flags_available &&
(g_registered_rseq_compat->flags & RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE);
bool flag_enabled = flags_available &&
(g_registered_rseq_compat->flags & RSEQ_CS_FLAG_SLICE_EXT_ENABLED);
bool prctl_enabled = get_result.ok &&
(get_result.value & PR_RSEQ_SLICE_EXT_ENABLE);
std::printf("status: rseq syscall registered: yes\n");
std::printf("status: rseq extensible feature area: %s\n",
yes_no(g_rseq_feature_size > 20U));
std::printf("status: rseq slice_ctrl field present: %s\n",
yes_no(has_slice_ctrl));
std::printf("status: rseq slice extension available flag: %s\n",
flags_available ? set_clear(flag_available) : "unavailable");
std::printf("status: rseq slice extension enabled flag: %s\n",
flags_available ? set_clear(flag_enabled) : "unavailable");
std::printf("status: PR_RSEQ_SLICE_EXTENSION GET usable: %s\n",
yes_no(get_result.ok));
if (get_result.ok) {
std::printf("status: PR_RSEQ_SLICE_EXTENSION enabled: %s\n",
yes_no(prctl_enabled));
std::printf("status: rseq slice extension availability: %s\n",
prctl_enabled || flag_available ? "available" : "available but disabled");
return;
}
if (get_result.err == ENOTSUPP) {
std::printf("status: rseq slice extension availability: not supported by this kernel/arch/config\n");
return;
}
if (get_result.err == EINVAL) {
std::printf("status: rseq slice extension availability: no accepted prctl API on this kernel\n");
return;
}
std::printf("status: rseq slice extension availability: unknown\n");
}
static void probe_slice_extension(void)
{
bool has_slice_ctrl = feature_present(offsetof(struct rseq_compat, slice_ctrl) +
sizeof(g_registered_rseq_compat->slice_ctrl));
bool flags_available = feature_present(offsetof(struct rseq_compat, flags) +
sizeof(g_registered_rseq_compat->flags));
prctl_probe_result prctl_get = probe_prctl_get();
unsigned int cpu = 0;
unsigned int node = 0;
print_kernel_version();
std::printf("AT_RSEQ_FEATURE_SIZE raw: %lu\n", g_aux_rseq_feature_size);
std::printf("AT_RSEQ_ALIGN raw: %lu\n", g_aux_rseq_align);
std::printf("effective rseq feature size: %u\n", g_rseq_feature_size);
std::printf("effective rseq alignment: %u\n", g_rseq_align);
std::printf("registered rseq size: %u\n", g_rseq_alloc_size);
print_registration_source();
if (&__rseq_size != nullptr) {
std::printf("libc __rseq_size=%u __rseq_offset=%td __rseq_flags=0x%x\n",
__rseq_size, __rseq_offset, __rseq_flags);
}
std::printf("registered rseq addr: %p\n", static_cast<void *>(g_registered_rseq));
std::printf("struct rseq has slice_ctrl field available: %s\n",
yes_no(has_slice_ctrl));
if (sys_getcpu(&cpu, &node) == 0)
std::printf("getcpu(): cpu=%u node=%u\n", cpu, node);
std::printf("rseq cpu_id_start=%u cpu_id=%d\n",
g_registered_rseq->cpu_id_start,
static_cast<int32_t>(g_registered_rseq->cpu_id));
if (feature_present(offsetof(struct rseq_compat, node_id) +
sizeof(g_registered_rseq_compat->node_id))) {
std::printf("rseq node_id=%u\n", g_registered_rseq_compat->node_id);
}
if (feature_present(offsetof(struct rseq_compat, mm_cid) +
sizeof(g_registered_rseq_compat->mm_cid))) {
std::printf("rseq mm_cid=%u\n", g_registered_rseq_compat->mm_cid);
}
if (flags_available) {
std::printf("rseq flags=0x%x\n", g_registered_rseq_compat->flags);
std::printf("slice ext available bit: %s\n",
set_clear(g_registered_rseq_compat->flags & RSEQ_CS_FLAG_SLICE_EXT_AVAILABLE));
std::printf("slice ext enabled bit: %s\n",
set_clear(g_registered_rseq_compat->flags & RSEQ_CS_FLAG_SLICE_EXT_ENABLED));
}
if (has_slice_ctrl) {
std::printf("slice_ctrl.request=%u granted=%u raw=0x%x\n",
g_registered_rseq_compat->slice_ctrl.parts.request,
g_registered_rseq_compat->slice_ctrl.parts.granted,
g_registered_rseq_compat->slice_ctrl.all);
}
print_prctl_result("prctl(PR_RSEQ_SLICE_EXTENSION, GET)", prctl_get);
if (prctl_get.ok) {
prctl_probe_result set_enable = probe_prctl_set(PR_RSEQ_SLICE_EXT_ENABLE);
print_prctl_result("prctl(PR_RSEQ_SLICE_EXTENSION, SET enable)",
set_enable);
prctl_probe_result after_enable = probe_prctl_get();
print_prctl_result("prctl(PR_RSEQ_SLICE_EXTENSION, GET after enable)",
after_enable);
prctl_probe_result set_disable = probe_prctl_set(0UL);
print_prctl_result("prctl(PR_RSEQ_SLICE_EXTENSION, SET disable)",
set_disable);
}
print_slice_status_summary(has_slice_ctrl, flags_available, prctl_get);
}
int main()
{
if (setup_rseq() != 0)
return 1;
probe_slice_extension();
teardown_rseq();
return 0;
}
@@ -0,0 +1,15 @@
SUMMARY = "Probe kernel RSeq timeslice extension"
LICENSE = "CLOSED"
SRC_URI = "file://rseqsliceprobe.cpp"
S = "${UNPACKDIR}"
do_compile() {
${CXX} ${CXXFLAGS} ${LDFLAGS} ${S}/rseqsliceprobe.cpp -o rseqsliceprobe
}
do_install() {
install -d ${D}${bindir}
install -m 0755 rseqsliceprobe ${D}${bindir}/rseqsliceprobe
}
@@ -0,0 +1,16 @@
SUMMARY = "Enable Mesa Rusticl llvmpipe OpenCL device in login shells"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://rusticl-llvmpipe.sh"
S = "${UNPACKDIR}"
inherit allarch
do_install() {
install -d ${D}${sysconfdir}/profile.d
install -m 0644 ${UNPACKDIR}/rusticl-llvmpipe.sh ${D}${sysconfdir}/profile.d/
}
FILES:${PN} = "${sysconfdir}/profile.d/rusticl-llvmpipe.sh"
@@ -0,0 +1,4 @@
# Mesa Rusticl lists platforms but no devices until drivers are opted in at
# runtime. llvmpipe uses the CPU as a software gallium OpenCL device (no GPU
# or QEMU graphics device required).
export RUSTICL_ENABLE=llvmpipe
@@ -0,0 +1,29 @@
#!/bin/sh
# Boot salmanoff-image with eth0 bridged onto the host lab LAN (10.42.0.0/24).
#
# Prerequisites on the host:
# 1. A Linux bridge (default: br-smo) whose ports include the NIC on 10.42.0.0/24.
# 2. /etc/qemu/bridge.conf containing: allow br-smo
# 3. qemu-oe-bridge-helper allowed (setuid or root via sudo policy).
#
# Usage (from build/ after sourcing init-build-env):
# ../layers/meta-salmanoff/scripts/runqemu-salmanoff-bridge
# ../layers/meta-salmanoff/scripts/runqemu-salmanoff-bridge br-lab
# ../layers/meta-salmanoff/scripts/runqemu-salmanoff-bridge br-smo 4096
#
# Guest eth0 is configured statically as 10.42.0.16/24 via init-ifupdown.
# Default RAM is 2G: Mesa Rusticl/llvmpipe (clinfo, Salmanoff OpenCL) OOMs at 256M.
set -eu
BRIDGE="${1:-br-smo}"
MEM="${2:-2048}"
if [ ! -f /etc/qemu/bridge.conf ] || ! grep -q "allow ${BRIDGE}" /etc/qemu/bridge.conf 2>/dev/null; then
echo "Host bridge helper is not configured for '${BRIDGE}'." >&2
echo "Create /etc/qemu/bridge.conf with a line: allow ${BRIDGE}" >&2
echo "See: https://docs.yoctoproject.org/dev-manual/qemu.html" >&2
exit 1
fi
exec runqemu salmanoff-image snapshot "bridge=${BRIDGE}" nographic "qemuparams=-m ${MEM}"