Patchwork How do I build mips64-linux-user?

login
register
mail settings
Submitter Rob Landley
Date March 26, 2010, 11:58 p.m.
Message ID <201003261858.55017.rob@landley.net>
Download mbox | patch
Permalink /patch/48734/
State New
Headers show

Comments

Rob Landley - March 26, 2010, 11:58 p.m.
On Thursday 25 March 2010 19:04:46 Rob Landley wrote:
> If I do the standard "./configure --disable-werror", it builds qemu-mips
> and qemu-system-mips64, but no qemu-mips64.  If I tell it "./configure
> --disable- werror --target-list-mips64-linux-user", configure completes but
> the build breaks because it can't set up the dependencies for that
> directory.
>
> How do I beat a qemu-mips64 out of the qemu source?  Apparently, gentoo
> manages to build one, but I'm not sure how....

Answer:

Gentoo's qemu ebuild file is here:

http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-
emulation/qemu/qemu-0.11.1.ebuild?rev=1.2&view=log

Which has these bits:

IUSE_SOFTMMU_TARGETS="${COMMON_TARGETS} ppcemb"
IUSE_USER_TARGETS="${COMMON_TARGETS} alpha armeb ppc64abi32 sparc64 
sparc32plus"

src_prepare() {
	# avoid fdt till an updated release appears
	sed -i -e 's:fdt="yes":fdt="no":' configure
	# prevent docs to get automatically installed
	sed -i '/$(DESTDIR)$(docdir)/d' Makefile
	# Alter target makefiles to accept CFLAGS set via flag-o
	sed -i 's/^\(C\|OP_C\|HELPER_C\)FLAGS=/\1FLAGS+=/' \
		Makefile Makefile.target tests/Makefile
	[[ -x /sbin/paxctl ]] && \
		sed -i 's/^VL_LDFLAGS=$/VL_LDFLAGS=-Wl,-z,execheap/' \
			Makefile.target
	# Append CFLAGS while linking
	sed -i 's/$(LDFLAGS)/$(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS)/' rules.mak
	epatch "${FILESDIR}/qemu-0.11.0-mips64-user-fix.patch"
}

Most of which isn't very interesting.  Presumably they're getting mips64 from 
"COMMON_TARGETS", which looks like some kind of ebuild standard plumbing.

Gentoo also has a patch directory for qemu:

http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-emulation/qemu/files/

And their mips64 patch is here:

http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-
emulation/qemu/files/qemu-0.11.0-mips64-user-fix.patch?rev=1.1&view=markup

Which isn't much:


And that's it.  Ok, let's try that out...

  ./configure --target-list=mips64-linux-user --disable-werror
  make -j 2

And it died:

>   GEN   config-host.h
> Makefile:7: config-devices.mak: No such file or directory
> make[1]: *** No rule to make target `config-devices.mak'.  Stop.
> make: *** [subdir-mips64-linux-user] Error 2

But since the 32 bit version of that file is just a comment, I'm pretty happy 
doing this:

  touch mips64-linux-user/config-devices.mak

(Dunno where the makefile thinks it should get this from...)

So with that, it compiles, with this warning:

  CC    mips64-linux-user/signal.o
/home/landley/qemu/git/linux-user/signal.c:2262:3: warning: #warning signal 
handling not implemented

But it's not complaining about system calls.  And it gives me a qemu-mips64.  
Right.

Which segfaults immediately running a statically linked "hello world".  
Running a dynamically linked version it does indeed complain that /lib/ld-
uClibc.so.0 isn't there (correct), but the statically linked one segfaults 
with no output.

Huh.  Ok, let's scp that to gentoo and try it there...

qemu-mips64 ./mips64-hello
qemu: uncaught target signal 4 (Illegal instruction) - exiting

And running that same hello world binary under system-image-mips64...  Works 
fine.

Right, Gentoo includes a qemu-mips64 that _doesn't_work_.  (At least not for 
me.)  They fixed the build break, but that's it.  False alarm, my bad...

Rob

Patch

--- qemu-0.11.0.orig/linux-user/main.c	2009-10-23 02:19:57.000000000 +0200
+++ qemu-0.11.0/linux-user/main.c	2009-10-23 02:47:09.000000000 +0200
@@ -1469,6 +1469,8 @@ 
 
 #ifdef TARGET_MIPS
 
+#define TARGET_QEMU_ESIGRETURN 255
+
 #define MIPS_SYS(name, args) args,
 
 static const uint8_t mips_syscall_args[] = {