~ubuntu-branches/ubuntu/intrepid/xen-3.3/intrepid-proposed

« back to all changes in this revision

Viewing changes to tools/ioemu/tests/hello-mips.c

  • Committer: Bazaar Package Importer
  • Author(s): Chuck Short
  • Date: 2008-08-14 10:28:57 UTC
  • Revision ID: james.westby@ubuntu.com-20080814102857-a832fn5gowurz5do
Tags: upstream-3.3.0
ImportĀ upstreamĀ versionĀ 3.3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
* MIPS o32 Linux syscall example
 
3
*
 
4
* http://www.linux-mips.org/wiki/RISC/os
 
5
* http://www.linux-mips.org/wiki/MIPSABIHistory
 
6
* http://www.linux.com/howtos/Assembly-HOWTO/mips.shtml
 
7
*
 
8
* mipsel-linux-gcc -nostdlib -mno-abicalls -fno-PIC -mabi=32 \
 
9
*                  -O2 -static -o hello-mips hello-mips.c
 
10
*
 
11
*/
 
12
#define __NR_SYSCALL_BASE       4000
 
13
#define __NR_exit                       (__NR_SYSCALL_BASE+  1)
 
14
#define __NR_write                      (__NR_SYSCALL_BASE+  4)
 
15
 
 
16
static inline void exit1(int status)
 
17
{
 
18
    register unsigned long __a0 asm("$4") = (unsigned long) status;
 
19
 
 
20
    __asm__ __volatile__ (
 
21
        "       .set push       \n"
 
22
        "       .set noreorder  \n"
 
23
        "       li      $2, %0  \n"
 
24
        "       syscall         \n"
 
25
        "       .set pop        "
 
26
        :
 
27
        : "i" (__NR_exit), "r" (__a0)
 
28
        : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24",
 
29
          "memory");
 
30
}
 
31
 
 
32
static inline int write(int fd, const char *buf, int len)
 
33
{
 
34
    register unsigned long __a0 asm("$4") = (unsigned long) fd;
 
35
    register unsigned long __a1 asm("$5") = (unsigned long) buf;
 
36
    register unsigned long __a2 asm("$6") = (unsigned long) len;
 
37
    register unsigned long __a3 asm("$7");
 
38
    unsigned long __v0;
 
39
 
 
40
    __asm__ __volatile__ (
 
41
        "       .set push       \n"
 
42
        "       .set noreorder  \n"
 
43
        "       li      $2, %2  \n"
 
44
        "       syscall         \n"
 
45
        "       move    %0, $2  \n"
 
46
        "       .set pop        "
 
47
        : "=r" (__v0), "=r" (__a3)
 
48
        : "i" (__NR_write), "r" (__a0), "r" (__a1), "r" (__a2)
 
49
        : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24",
 
50
          "memory");
 
51
 
 
52
/*    if (__a3 == 0) */
 
53
        return (int) __v0;
 
54
/*
 
55
    errno = __v0;
 
56
    return -1;
 
57
 */
 
58
}
 
59
 
 
60
void __start(void)
 
61
{
 
62
    write (1, "Hello, World!\n", 14);
 
63
    exit1 (42);
 
64
}