2010-08-03 01:56:04 +00:00
|
|
|
#
|
|
|
|
# This class contains functions for recipes that need QEMU or test for its
|
2012-03-22 10:05:59 +00:00
|
|
|
# existence.
|
2010-08-03 01:56:04 +00:00
|
|
|
#
|
|
|
|
|
|
|
|
def qemu_target_binary(data):
|
2013-02-07 13:34:27 +00:00
|
|
|
target_arch = data.getVar("TARGET_ARCH_MULTILIB_ORIGINAL", True)
|
|
|
|
if not target_arch:
|
|
|
|
target_arch = data.getVar("TARGET_ARCH", True)
|
2012-07-11 17:33:43 +00:00
|
|
|
if target_arch in ("i486", "i586", "i686"):
|
|
|
|
target_arch = "i386"
|
|
|
|
elif target_arch == "powerpc":
|
|
|
|
target_arch = "ppc"
|
2012-07-22 23:54:16 +00:00
|
|
|
elif target_arch == "powerpc64":
|
|
|
|
target_arch = "ppc64"
|
2010-08-03 01:56:04 +00:00
|
|
|
|
2012-07-11 17:33:43 +00:00
|
|
|
return "qemu-" + target_arch
|
2012-12-20 13:15:38 +00:00
|
|
|
#
|
|
|
|
# Next function will return a string containing the command that is needed to
|
|
|
|
# to run a certain binary through qemu. For example, in order to make a certain
|
|
|
|
# postinstall scriptlet run at do_rootfs time and running the postinstall is
|
|
|
|
# architecture dependent, we can run it through qemu. For example, in the
|
|
|
|
# postinstall scriptlet, we could use the following:
|
|
|
|
#
|
|
|
|
# ${@qemu_run_binary(d, '$D', '/usr/bin/test_app')} [test_app arguments]
|
|
|
|
#
|
|
|
|
def qemu_run_binary(data, rootfs_path, binary):
|
2013-01-31 08:27:22 +00:00
|
|
|
qemu_binary = qemu_target_binary(data)
|
|
|
|
if qemu_binary == "qemu-allarch":
|
|
|
|
qemu_binary = "qemuwrapper"
|
|
|
|
|
postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts
The intercept scripts fail to run on 32 bit hosts. Apparently, the
current approach worked on 64 bit hosts due to the larger virtual address
space (probably). On 32 bit hosts, however, calling the target binary like:
qemu-arm ld-linux.so --library-path /lib:/usr/lib arm_binary
fails with:
arm_binary: error while loading shared libraries: arm_binary: failed to
map segment from shared object: Operation not permitted
When run like this, qemu-arm fails to map the arm_binary executable in
memory because it's hitting the lower limit of
/proc/sys/vm/mmap_min_addr. That's because it loads the
ld-linux.so binary successfully, taking into account mmap_min_addr, runs
it, and then ld-linux.so will map the arm_binary at a fixed address but this
will fail because it is below mmap_min_addr. The qemu's guest base probing,
apparently, doesn't work fine when a program runs inside other.
One way around this would be to set mmap_min_addr to 0 (on recent
distributions is set to 65536 to avoid "kernel NULL pointer dereference"
defects) but this approach is not safe.
The other way is to call the binary directly but providing qemu with a
prefix (-L option) in order to find the elf interpreter correctly. This
way, both the target binary and dynamic loader are mapped into memory
under qemu's control and, only after, the dynamic loader is started.
[YOCTO #4179]
(From OE-Core rev: 78f91e08c8a7b0f0c831a087f7c89e2c76047e7a)
Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2013-04-05 16:12:26 +00:00
|
|
|
return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
|