Simple test for mips/mipsel, based on a test by Alexander Voropay.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2246 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									73e14b623f
								
							
						
					
					
						commit
						e4630047e1
					
				| 
						 | 
				
			
			@ -82,6 +82,13 @@ hello-arm: hello-arm.o
 | 
			
		|||
hello-arm.o: hello-arm.c
 | 
			
		||||
	arm-linux-gcc -Wall -g -O2 -c -o $@ $<
 | 
			
		||||
 | 
			
		||||
# MIPS test
 | 
			
		||||
hello-mips: hello-mips.c
 | 
			
		||||
	mips-linux-gnu-gcc -nostdlib -static -mno-abicalls -fno-PIC -mabi=32 -Wall -Wextra -g -O2 -o $@ $<
 | 
			
		||||
 | 
			
		||||
hello-mipsel: hello-mips.c
 | 
			
		||||
	mipsel-linux-gnu-gcc -nostdlib -static -mno-abicalls -fno-PIC -mabi=32 -Wall -Wextra -g -O2 -o $@ $<
 | 
			
		||||
 | 
			
		||||
# XXX: find a way to compile easily a test for each arch
 | 
			
		||||
test2:
 | 
			
		||||
	@for arch in i386 arm armeb sparc ppc mips mipsel; do \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
/*
 | 
			
		||||
* MIPS o32 Linux syscall example
 | 
			
		||||
*
 | 
			
		||||
* http://www.linux-mips.org/wiki/RISC/os
 | 
			
		||||
* http://www.linux-mips.org/wiki/MIPSABIHistory
 | 
			
		||||
* http://www.linux.com/howtos/Assembly-HOWTO/mips.shtml
 | 
			
		||||
*
 | 
			
		||||
* mipsel-linux-gcc -nostdlib -mno-abicalls -fno-PIC -mabi=32 \
 | 
			
		||||
*                  -O2 -static -o hello-mips hello-mips.c
 | 
			
		||||
*
 | 
			
		||||
*/
 | 
			
		||||
#define __NR_SYSCALL_BASE	4000
 | 
			
		||||
#define __NR_exit			(__NR_SYSCALL_BASE+  1)
 | 
			
		||||
#define __NR_write			(__NR_SYSCALL_BASE+  4)
 | 
			
		||||
 | 
			
		||||
static inline void exit1(int status)
 | 
			
		||||
{
 | 
			
		||||
    register unsigned long __a0 asm("$4") = (unsigned long) status;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__ (
 | 
			
		||||
        "	.set push	\n"
 | 
			
		||||
        "	.set noreorder	\n"
 | 
			
		||||
        "	li	$2, %0	\n"
 | 
			
		||||
        "	syscall		\n"
 | 
			
		||||
        "	.set pop	"
 | 
			
		||||
        :
 | 
			
		||||
	: "i" (__NR_exit), "r" (__a0)
 | 
			
		||||
	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24",
 | 
			
		||||
	  "memory");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int write(int fd, const char *buf, int len)
 | 
			
		||||
{
 | 
			
		||||
    register unsigned long __a0 asm("$4") = (unsigned long) fd;
 | 
			
		||||
    register unsigned long __a1 asm("$5") = (unsigned long) buf;
 | 
			
		||||
    register unsigned long __a2 asm("$6") = (unsigned long) len;
 | 
			
		||||
    register unsigned long __a3 asm("$7");
 | 
			
		||||
    unsigned long __v0;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__ (
 | 
			
		||||
        "	.set push	\n"
 | 
			
		||||
        "	.set noreorder	\n"
 | 
			
		||||
        "	li	$2, %2	\n"
 | 
			
		||||
        "	syscall		\n"
 | 
			
		||||
        "	move	%0, $2	\n"
 | 
			
		||||
        "	.set pop	"
 | 
			
		||||
        : "=r" (__v0), "=r" (__a3)
 | 
			
		||||
        : "i" (__NR_write), "r" (__a0), "r" (__a1), "r" (__a2)
 | 
			
		||||
	: "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24",
 | 
			
		||||
	  "memory");
 | 
			
		||||
 | 
			
		||||
/*    if (__a3 == 0) */
 | 
			
		||||
        return (int) __v0;
 | 
			
		||||
/*
 | 
			
		||||
    errno = __v0;
 | 
			
		||||
    return -1;
 | 
			
		||||
 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __start(void)
 | 
			
		||||
{
 | 
			
		||||
    write (1, "Hello, World!\n", 14);
 | 
			
		||||
    exit1 (42);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue