139 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
#!/sbin/openrc-run
 | 
						|
# Copyright 1999-2016 Gentoo Foundation
 | 
						|
# Distributed under the terms of the GNU General Public License v2
 | 
						|
 | 
						|
# enable automatic i386/ARM/M68K/MIPS/SPARC/PPC/s390 program execution by the kernel
 | 
						|
 | 
						|
# Defaulting to OC should be safe because it comes down to:
 | 
						|
#  - do we trust the interp itself to not be malicious?  yes; we built it.
 | 
						|
#  - do we trust the programs we're running?  ish; same permission as native
 | 
						|
#    binaries apply.  so if user can do bad stuff natively, cross isn't worse.
 | 
						|
: ${QEMU_BINFMT_FLAGS:=OC}
 | 
						|
 | 
						|
depend() {
 | 
						|
    after procfs
 | 
						|
}
 | 
						|
 | 
						|
start() {
 | 
						|
   ebegin "Registering qemu-user binaries (flags: ${QEMU_BINFMT_FLAGS})"
 | 
						|
 | 
						|
   if [ ! -d /proc/sys/fs/binfmt_misc ] ; then
 | 
						|
      modprobe -q binfmt_misc
 | 
						|
   fi
 | 
						|
 | 
						|
   if [ ! -d /proc/sys/fs/binfmt_misc ] ; then
 | 
						|
       eend $? "You need support for 'misc binaries' in your kernel!" || return
 | 
						|
   fi
 | 
						|
 | 
						|
   if [ ! -f /proc/sys/fs/binfmt_misc/register ] ; then
 | 
						|
      mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc >/dev/null 2>&1
 | 
						|
      eend $? || return
 | 
						|
   fi
 | 
						|
 | 
						|
   # probe cpu type
 | 
						|
   cpu=`uname -m`
 | 
						|
   case "$cpu" in
 | 
						|
      i386|i486|i586|i686|i86pc|BePC|x86_64)
 | 
						|
         cpu="i386"
 | 
						|
         ;;
 | 
						|
      m68k)
 | 
						|
         cpu="m68k"
 | 
						|
         ;;
 | 
						|
      mips*)
 | 
						|
         cpu="mips"
 | 
						|
      ;;
 | 
						|
      "Power Macintosh"|ppc|ppc64)
 | 
						|
         cpu="ppc"
 | 
						|
      ;;
 | 
						|
      armv[4-9]*)
 | 
						|
         cpu="arm"
 | 
						|
      ;;
 | 
						|
      sparc*)
 | 
						|
         cpu="sparc"
 | 
						|
      ;;
 | 
						|
   esac
 | 
						|
 | 
						|
   # register the interpreter for each cpu except for the native one
 | 
						|
   if [ $cpu != "i386" -a -x "/usr/bin/qemu-i386" ] ; then
 | 
						|
      echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
      echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "alpha" -a -x "/usr/bin/qemu-alpha" ] ; then
 | 
						|
      echo ':alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-alpha:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "arm" -a -x "/usr/bin/qemu-arm" ] ; then
 | 
						|
      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\x00\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "arm" -a -x "/usr/bin/qemu-armeb" ] ; then
 | 
						|
      echo   ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "aarch64" -a -x "/usr/bin/qemu-aarch64" ] ; then
 | 
						|
      echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "sparc" -a -x "/usr/bin/qemu-sparc" ] ; then
 | 
						|
      echo   ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "ppc" -a -x "/usr/bin/qemu-ppc" ] ; then
 | 
						|
      echo   ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "m68k" -a -x "/usr/bin/qemu-m68k" ] ; then
 | 
						|
      #echo   'Please check cpu value and header information for m68k!'
 | 
						|
      echo   ':m68k:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-m68k:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mips" ] ; then
 | 
						|
      # FIXME: We could use the other endianness on a MIPS host.
 | 
						|
      echo   ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mipsel" ] ; then
 | 
						|
      echo   ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mipsn32" ] ; then
 | 
						|
      echo   ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mipsn32el" ] ; then
 | 
						|
      echo   ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsn32el:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mips64" ] ; then
 | 
						|
      echo   ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "mips" -a -x "/usr/bin/qemu-mips64el" ] ; then
 | 
						|
      echo   ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "sh" -a -x "/usr/bin/qemu-sh4" ] ; then
 | 
						|
      echo    ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "sh" -a -x "/usr/bin/qemu-sh4eb" ] ; then
 | 
						|
      echo    ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   if [ $cpu != "s390x" -a -x "/usr/bin/qemu-s390x" ] ; then
 | 
						|
      echo   ':s390x:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-s390x:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
 | 
						|
   fi
 | 
						|
   eend $?
 | 
						|
}
 | 
						|
 | 
						|
stop() {
 | 
						|
   ebegin "Unregistering qemu-user binaries"
 | 
						|
   local arches
 | 
						|
 | 
						|
   arches="${arches} i386 i486"
 | 
						|
   arches="${arches} alpha"
 | 
						|
   arches="${arches} arm armeb"
 | 
						|
   arches="${arches} aarch64"
 | 
						|
   arches="${arches} sparc"
 | 
						|
   arches="${arches} ppc"
 | 
						|
   arches="${arches} m68k"
 | 
						|
   arches="${arches} mips mipsel mipsn32 mipsn32el mips64 mips64el"
 | 
						|
   arches="${arches} sh4 sh4eb"
 | 
						|
   arches="${arches} s390x"
 | 
						|
 | 
						|
   for a in ${arches}; do
 | 
						|
      if [ -f /proc/sys/fs/binfmt_misc/$a ] ; then
 | 
						|
         echo '-1' > /proc/sys/fs/binfmt_misc/$a
 | 
						|
      fi
 | 
						|
   done
 | 
						|
 | 
						|
   eend $?
 | 
						|
}
 | 
						|
 | 
						|
# vim: ts=4 :
 |