aboutsummaryrefslogtreecommitdiffstats
path: root/meta-seattle
diff options
context:
space:
mode:
authorAdrian Calianu <adrian.calianu@enea.com>2016-02-16 09:44:14 +0100
committerDrew Moseley <drew_moseley@mentor.com>2016-02-16 13:36:54 -0500
commit3f2ccc67923417d6f9bcee78c009a84f04208e57 (patch)
treeaa904c0a2cb44fb4d02852774beabcda4d648eff /meta-seattle
parentad47267e7a8f7fc5304d29cf3391ca3a25a32898 (diff)
downloadmeta-amd-3f2ccc67923417d6f9bcee78c009a84f04208e57.tar.gz
meta-amd-3f2ccc67923417d6f9bcee78c009a84f04208e57.tar.bz2
meta-amd-3f2ccc67923417d6f9bcee78c009a84f04208e57.zip
support to run 32b applications
Since MULTILIB is not yet available for aarch64 add two solutions to run 32b application on aarch64. One solution is using chroot while other requires qemu-arm. Signed-off-by: Adrian Calianu <adrian.calianu@enea.com>
Diffstat (limited to 'meta-seattle')
-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!"