aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-seattle/README56
-rw-r--r--meta-seattle/recipes-support/32b-env/32b-env_1.0.bb25
-rwxr-xr-xmeta-seattle/recipes-support/32b-env/files/set_32b_env_chroot.sh120
-rwxr-xr-xmeta-seattle/recipes-support/32b-env/files/set_32b_env_qemu.sh113
4 files changed, 314 insertions, 0 deletions
diff --git a/meta-seattle/README b/meta-seattle/README
index 0454cd58..07925703 100644
--- a/meta-seattle/README
+++ b/meta-seattle/README
@@ -112,3 +112,59 @@ Shell> FS0:\Image root=/dev/sda<X> rw console=ttyAMA0,115200n8
References:
1) https://www.kernel.org/doc/Documentation/efi-stub.txt
2) http://www.uefi.org/specifications
+
+III. How to Run 32-bit Applications on aarch64
+==============================================
+
+Since multilib is not yet available for aarch64, this BSP offers some alternatives
+in order to run 32-bit legacy applications on an aarch64.
+
+Each method that helps to setup the environment to run 32-bit applications requires
+a few extra tools. Two of those metods are described in this section, one requiring
+chroot and another one qemu installation.
+
+meta-seattle BSP includes two scripts that help you to setup environment for 32bit
+applications that can be found under following path meta-seattle/recipes-support/32b-env/
+
+III.1 Using chroot tool to run 32-bit applications on aarch64
+=============================================================
+
+This solution requires the chroot tool on the target, a 32b-built rootfs, and
+a build for the seattle machine.
+
+root@seattle:~# scp <user>@<host_ip>:/homes/rootfs32b.tar.gz ./
+
+root@seattle:~# tar -zxf rootfs32.tar.gz
+
+root@seattle:~# set_32b_env_chroot.sh -r ./rootfs32
+
+# 32b environment started
+@seattle:~# ./hello32d
+
+Starting from this point, any 32-bit application can be executed, but not 64-bit
+applications which will fail due to wrong path to 32-bit libraries. To run a 64-bit
+application, chroot mode must be quit by using the "exit" command.
+
+III.2 Using qemu to run 32-bit applications on aarch64
+======================================================
+
+This example requires an existing 32b-built rootfs and a build for the seattle machine.
+It is also expected that qemu-arm is already installed!!!
+
+root@seattle:~# scp <user>@<host_ip>:/homes/rootfs32b.tar.gz ./
+
+root@seattle:~# source /usr/bin/set_32b_env_qemu.sh -r ./rootfs32
+
+Starting from this point, any 32-bit or 64-bit application can be executed.
+
+IV. Limitations
+===============
+In order to enable 32-bit support in the aarch64 kernel, COMPAT mode is enabled
+(CONFIG_COMPAT=y), page size set to 4K, and VirtualAddress set to 48-bit.
+
+It might be possible to use 64K page sizes and 42-bit VirtualAddress if it is possible
+to rebuild the 32-bit application using binutils version 2.25.
+
+If 32-bit support is not required, COMPAT mode can be disabled (CONFIG_COMPAT=n) and
+page sizes set to 64K and VirtualAddress to 42-bit. Any change of the kernel
+confguration requires of course a kernel rebuild.
diff --git a/meta-seattle/recipes-support/32b-env/32b-env_1.0.bb b/meta-seattle/recipes-support/32b-env/32b-env_1.0.bb
new file mode 100644
index 00000000..e518b2a4
--- /dev/null
+++ b/meta-seattle/recipes-support/32b-env/32b-env_1.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "A simple set of shell scripts used for enabling support for \
+dynamic linked 32b application on AMD Seattle."
+DESCRIPTION = "The 32b-env package installs the set_32b_env_chroot.sh \
+and set_32b_env_qemu.sh shell scripts which enables support for dynamic \
+linked 32b application on Seattle until the multilib support \
+will be available for armv8 architecture."
+
+SRC_URI = "file://set_32b_env_chroot.sh \
+ file://set_32b_env_qemu.sh"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690"
+
+inherit allarch
+
+do_install () {
+ install -d ${D}${bindir}/
+ install -m 755 ${WORKDIR}/set_32b_env_chroot.sh ${D}${bindir}/
+ install -m 755 ${WORKDIR}/set_32b_env_qemu.sh ${D}${bindir}/
+}
+
+do_patch[noexec] = "1"
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+do_build[noexec] = "1"
diff --git a/meta-seattle/recipes-support/32b-env/files/set_32b_env_chroot.sh b/meta-seattle/recipes-support/32b-env/files/set_32b_env_chroot.sh
new file mode 100755
index 00000000..499b5802
--- /dev/null
+++ b/meta-seattle/recipes-support/32b-env/files/set_32b_env_chroot.sh
@@ -0,0 +1,120 @@
+#!/bin/sh
+
+help()
+{
+ echo " The scope of this script is to setup an environment for 32b legacy applications."
+ echo " This is a replacement for MULTILIB mechanism which is not available yet for aarch64."
+ echo " chroot is used to setup an isolated environment for 32b applications"
+ echo " "
+ echo " Prerequisites:"
+ echo " - user must build a 32b amrv7 rootfs (e.q. build a image for qemuarm)"
+ echo " - user must copy 32b armv7 rootfs under 64b rootfs (e.q. /mnt/rootfs32)"
+ echo " - user must copy 32b application under 32b rootfs (e.q. /mnt/rootfs32/myapp)"
+ echo ""
+ echo " Run setup script to prepare the environment for 32b applications"
+ echo " > set_32b_env_chroot -r /mnt/rootfs32"
+ echo ""
+ echo " Run 32b applications"
+ echo " @> ./myapp/myexec"
+ echo ""
+ echo " In order to return to default root just type <exit>"
+ echo " @> exit"
+ exit
+}
+
+usage()
+{
+ echo "set_32b_env_chroot OPTIONS"
+ echo "OPTIONS:"
+ echo ""
+ echo " -r <32b_rootfs> : path to a 32b rootfs."
+ echo " -h : display help"
+ echo ""
+ exit
+}
+
+if [[ $# -eq 0 ]] ; then
+ echo "[ERR]: Missing script parameters!"
+ echo ""
+ usage
+fi
+
+while getopts "hr:" OPTION;
+do
+ case $OPTION in
+
+ r)
+ ROOTFS32b_PATH="$OPTARG"
+ ;;
+
+ ?)
+ help
+ ;;
+
+ esac
+done
+
+ABS_PATH=`cd "${ROOTFS32b_PATH}"; pwd`
+ROOTFS32b_PATH=${ABS_PATH}
+
+if [[ ! -d ${ROOTFS32b_PATH} ]] ; then
+ usage
+fi
+
+if [[ ! -d ${ROOTFS32b_PATH}/dev ]] ; then
+ mkdir ${ROOTFS32b_PATH}/dev
+fi
+
+if [[ ! -d ${ROOTFS32b_PATH}/proc ]] ; then
+ mkdir ${ROOTFS32b_PATH}/proc
+fi
+
+if [[ ! -d ${ROOTFS32b_PATH}/sys ]] ; then
+ mkdir ${ROOTFS32b_PATH}/sys
+fi
+
+if [[ ! -d ${ROOTFS32b_PATH}/etc ]] ; then
+ mkdir ${ROOTFS32b_PATH}/etc
+fi
+
+umount ${ROOTFS32b_PATH}/dev/pts 2>/dev/null
+umount ${ROOTFS32b_PATH}/dev 2>/dev/null
+mount --bind /dev ${ROOTFS32b_PATH}/dev
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to mount /dev folder"
+ exit
+fi
+
+umount ${ROOTFS32b_PATH}/proc 2>/dev/null
+mount --bind /proc ${ROOTFS32b_PATH}/proc
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to mount /proc folder"
+ exit
+fi
+
+umount ${ROOTFS32b_PATH}/sys 2>/dev/null
+mount --bind /sys ${ROOTFS32b_PATH}/sys
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to mount /sys folder"
+ exit
+fi
+
+mount --bind /dev/pts ${ROOTFS32b_PATH}/dev/pts
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to mount /dev/pts folder"
+ exit
+fi
+
+cp /etc/resolv.conf ${ROOTFS32b_PATH}/etc/resolv.conf
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to copy resolv.conf file"
+ exit
+fi
+
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+
+echo "New root will be ${ROOTFS32b_PATH}/ type \"exit\" to return to /"
+chroot ${ROOTFS32b_PATH}/ /bin/sh
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to start chroot!"
+fi
diff --git a/meta-seattle/recipes-support/32b-env/files/set_32b_env_qemu.sh b/meta-seattle/recipes-support/32b-env/files/set_32b_env_qemu.sh
new file mode 100755
index 00000000..3a165025
--- /dev/null
+++ b/meta-seattle/recipes-support/32b-env/files/set_32b_env_qemu.sh
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+help()
+{
+ echo " The scope of this script is to setup an environment for 32b legacy applications."
+ echo " This is a replacement for MULTILIB mechanism which is not available yet for aarch64."
+ echo " qemu-arm(user mode) is used to set access to 32b libraries instead of the host's libs"
+ echo " "
+ echo " Prerequisites:"
+ echo " - user must build a 32b amrv7 rootfs (e.q. build a image for qemuarm)"
+ echo " - user must copy 32b armv7 rootfs under 64b rootfs (e.q. /mnt/rootfs32)"
+ echo " - user must copy 32b application under 32b rootfs (e.q. /mnt/rootfs32/myapp)"
+ echo " - user must configure properly the smart package manager in order to access"
+ echo " <qemu-arm> and <kernel-module-binfmt-misc> packages otherwise it is"
+ echo " expected that those packages are already installed"
+ echo ""
+ echo " Run setup script to prepare the environment for 32b applications( -l param is optional )"
+ echo " > set_32b_env_qemu -r /mnt/rootfs32 -l /usr/local/extlib:/usr/local/mylib"
+ echo ""
+ echo " After that user should be able to run any 32b application as usual!"
+ echo " >./myapp"
+ break
+}
+
+usage()
+{
+ echo "Setup environment to run 32b dynamically linked applications using qemu."
+ echo "Prerequisites:"
+ echo " It is expected that qemu and kernel-module-binfmt-misc packages are installed"
+ echo " It is expected that 32bit rootfs is already installed!"
+ echo ""
+ echo "set_32b_env_qemu -r <path to 32b rootfs> -l <ext_libs1:ext_libs2:...>"
+ echo " -r : [mandatory] path to 32b rootfs"
+ echo " -l : [optional] list of paths for nonstandard lib folders, paths must be relative to 32b rootfs"
+ echo " -h : [optional] display help"
+ echo ""
+ echo "Example: set_32b_env_qemu -r ./rootfs32b -l /usr/local/mylib:/usr/local/mylib2"
+ break
+}
+
+if [[ $# -eq 0 ]] ; then
+ echo "[ERR]: Missing script parameters!"
+ echo ""
+ usage
+fi
+
+while getopts "hr:l:" OPTION;
+do
+ case $OPTION in
+
+ r)
+ ROOTFS32b_PATH="$OPTARG"
+ ;;
+
+ l)
+ LIBS_PATH="$OPTARG"
+ ;;
+
+ h)
+ usage
+ ;;
+
+ ?)
+ help
+ ;;
+
+ esac
+done
+
+ABS_PATH=`cd "${ROOTFS32b_PATH}"; pwd`
+ROOTFS32b_PATH=${ABS_PATH}
+
+if [[ ! -d ${ROOTFS32b_PATH} ]] ; then
+ usage
+fi
+
+echo "Please wait..."
+echo ""
+QEMU_EXISTS=`which qemu-arm`
+if [[ "${QEMU_EXISTS}" == "" ]] ; then
+ echo "Please make sure smart package manager is configured !"
+ echo "Otherwise make sure <qemu> and <kernel-module-binfmt-misc> are installed!"
+ smart --quiet update
+ smart --quiet install qemu
+ smart --quiet install kernel-module-binfmt-misc
+fi
+
+echo "."
+mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
+if [[ "$?" != "0" ]] ; then
+ echo "Failed to install binfmt_misc or the setup was already prepared for 32b"
+ echo ""
+ echo "Please, make sure the module is available into system"
+ echo "How to install the binfmt_misc package:"
+ echo " smart install binfmt_misc"
+ break
+fi
+
+BINFMT_INSTALLED=`cat /proc/sys/fs/binfmt_misc/status`
+if [[ "${BINFMT_INSTALLED}" != "enabled" ]] ; then
+ echo "binfmt_misc not enabled!!"
+ break
+fi
+
+echo ".."
+# configure qemu to run 32b armv7 applications
+echo ":arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:" > /proc/sys/fs/binfmt_misc/register
+
+export QEMU_LD_PREFIX=${ROOTFS32b_PATH}
+export QEMU_SET_ENV="LD_LIBRARY_PATH=${LIBS_PATH}"
+
+echo "Done!"
+echo "Environment was set to run 32b applications!"