aboutsummaryrefslogtreecommitdiff
path: root/ia64-syscall.S
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-04-29 21:10:09 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-04-29 21:10:09 +0000
commit0d3301964df6d36c72dfa95ba5ae5e3b789cd1f8 (patch)
treecbf681930f4cae73619ef1571a421d6ad2e9fa9d /ia64-syscall.S
parentfe1e3ce3e97f08d9b18b3444831a69b4666eb6b5 (diff)
ia64 support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@115 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'ia64-syscall.S')
-rw-r--r--ia64-syscall.S32
1 files changed, 32 insertions, 0 deletions
diff --git a/ia64-syscall.S b/ia64-syscall.S
new file mode 100644
index 0000000000..ab073f22b9
--- /dev/null
+++ b/ia64-syscall.S
@@ -0,0 +1,32 @@
+/* derived from glibc sysdeps/unix/sysv/linux/ia64/sysdep.S */
+
+#define __ASSEMBLY__
+
+#include <asm/asmmacro.h>
+#include <asm/unistd.h>
+
+ENTRY(__syscall_error)
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)
+ alloc r33=ar.pfs, 0, 4, 0, 0
+ mov r32=rp
+ .body
+ mov r35=r8
+ mov r34=r1
+ ;;
+ br.call.sptk.many b0 = __errno_location
+.Lret0: /* force new bundle */
+ st4 [r8]=r35
+ mov r1=r34
+ mov rp=r32
+ mov r8=-1
+ mov ar.pfs=r33
+ br.ret.sptk.few b0
+END(__syscall_error)
+
+GLOBAL_ENTRY(__ia64_syscall)
+ mov r15=r37 /* syscall number */
+ break __BREAK_SYSCALL
+ cmp.eq p6,p0=-1,r10 /* r10 = -1 on error */
+(p6) br.cond.spnt.few __syscall_error
+ br.ret.sptk.few b0
+.endp __ia64_syscall