On Tue, Nov 18, 2008 at 09:14:22AM +0100, Martin Michlmayr wrote: > * Riku Voipio <[EMAIL PROTECTED]> [2008-09-05 20:30]: > > I see the arm EABI support has been added to dietlibc cvs, would you > > have time to update the package to include these changes? > > Are those changes relatively self-contained? I wonder if the patch > could be backported to the version in Debian for inclusion in lenny.
I'm not sure. In upstream cvs, it seems to be a single commit, see attachment, can you try it out? Regards, Gerrit.
>From 12af4842a698b4cd909c185846a41427f9b6c329 Mon Sep 17 00:00:00 2001 From: leitner <leitner> Date: Fri, 5 Sep 2008 15:13:29 +0000 Subject: [PATCH] ARM EABI --- CHANGES | 1 + arm/Makefile.add | 3 + arm/accept.S | 7 +++ arm/bind.S | 7 +++ arm/clone.S | 71 +++++++++++++++++++++++++ arm/connect.S | 7 +++ arm/getpeername.S | 7 +++ arm/getsockname.S | 7 +++ arm/listen.S | 7 +++ arm/md5asm.S | 6 ++- arm/mmap.S | 13 +++++ arm/recv.S | 7 +++ arm/recvfrom.S | 7 +++ arm/recvmsg.S | 7 +++ arm/send.S | 7 +++ arm/sendmsg.S | 7 +++ arm/sendto.S | 7 +++ arm/setjmp.S | 2 +- arm/setsockopt.S | 7 +++ arm/shutdown.S | 7 +++ arm/socket.S | 7 +++ arm/socketpair.S | 7 +++ arm/start.S | 40 +++++++++++++- arm/syscalls.h | 152 +++++++++++++++++++++++++++++++++++++++++++++------- arm/unified.S | 28 +++++++++- arm/waitpid.S | 4 ++ diet.c | 4 ++ include/elf.h | 1 + x86_64/strcpy.S | 2 +- 29 files changed, 412 insertions(+), 27 deletions(-) create mode 100644 arm/accept.S create mode 100644 arm/bind.S create mode 100644 arm/connect.S create mode 100644 arm/getpeername.S create mode 100644 arm/getsockname.S create mode 100644 arm/listen.S create mode 100644 arm/recv.S create mode 100644 arm/recvfrom.S create mode 100644 arm/recvmsg.S create mode 100644 arm/send.S create mode 100644 arm/sendmsg.S create mode 100644 arm/sendto.S create mode 100644 arm/setsockopt.S create mode 100644 arm/shutdown.S create mode 100644 arm/socket.S create mode 100644 arm/socketpair.S diff --git a/CHANGES b/CHANGES index 91d9ea9..856aaa7 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ (Enrico Scholz) fix utmp, add utmpx support (R.L. Horn) fix the dynamic library for the ARM architecture (Gernot Tenchio) + get ARM port to work with EABI (Tristan Newby) fix of scanf with negative floats (Andre Oliveira) 0.31: diff --git a/arm/Makefile.add b/arm/Makefile.add index f725532..f6126ec 100644 --- a/arm/Makefile.add +++ b/arm/Makefile.add @@ -1,5 +1,8 @@ LIBOBJ+=$(OBJDIR)/md5asm.o $(OBJDIR)/__aeabi_unwind_cpp.o CFLAGS+=-Os -fomit-frame-pointer -fstrict-aliasing +#ifdef __ARM_EABI__ +CFLAGS+=-mabi=aapcs-linux -mfloat-abi=soft -mno-thumb-interwork +#endif VPATH:=arm:syscalls.s:$(VPATH) LIBGMON_OBJS+=$(OBJDIR)/mcount.o diff --git a/arm/accept.S b/arm/accept.S new file mode 100644 index 0000000..1c4b223 --- /dev/null +++ b/arm/accept.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(accept,accept) + +#endif diff --git a/arm/bind.S b/arm/bind.S new file mode 100644 index 0000000..5c88e0c --- /dev/null +++ b/arm/bind.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(bind,bind) + +#endif diff --git a/arm/clone.S b/arm/clone.S index 86e2f35..4a4b2f4 100644 --- a/arm/clone.S +++ b/arm/clone.S @@ -10,6 +10,76 @@ @ Some slightly tricky stuff here... edit with care :-) @ + +#ifdef __ARM_EABI__ + +#define CLONE_VM 0x00000100 +#define CLONE_THREAD 0x00010000 + +@ ; don't do this yet [EMAIL PROTECTED] RESET_PID + + +clone: +__clone: + @ ; start with a sanity check + cmp r0, #0 + cmpne r1, #0 + mvneq r0, #-EINVAL + beq __unified_syscall @ handle as if error was returned by the syscall + + @ ; insert args into stack + str r3, [r1, #-4]! + str r0, [r1, #-4]! + + @ ; do the system call + @ ; get the flags + mov r0, r2 +#ifdef RESET_PID + mov ip, r2 +#endif + @ ; child sp is already in r1 + stmfd sp!, {r4, r7} + @stmdb sp!, {r4, r7} + ldr r2, [sp, #8] + ldr r3, [sp, #12] + ldr r4, [sp, #16] + ldr r7, =__NR_clone + swi 0 + + cmp r0, #0 + beq 1f + ldmfd sp!, {r4, r7} + blt __unified_syscall @ (return code < 0): handle as an error + bx lr +1: +#ifdef RESET_PID + tst ip, #CLONE_THREAD + bne 3f + + mov r0, #0xffff0fff + mov lr, pc + sub pc, r0, #31 + mov r1, r0 + tst ip, #CLONE_VM + movne r0, #-1 + ldr r7, =__NR_getpid + swi 0 + str r0, [r1, #PID_OFFSET] @ ; not defined yet ?? + str r0, [r1, #TID_OFFSET] @ ; not defined yet ?? +3: +#endif + @ ; pick the function arg and call address off the stack and execute + ldr r0, [sp, #4] + mov lr, pc + ldr pc, [sp], #8 + + @ ; and we're done, passing return value through r0 + b _exit @ branch to _exit (PIC safe) + + +#else + clone: __clone: movs r12, r0 @ check function pointer @@ -32,3 +102,4 @@ __clone: 1: b _exit @ branch to _exit (PIC safe) +#endif diff --git a/arm/connect.S b/arm/connect.S new file mode 100644 index 0000000..118404f --- /dev/null +++ b/arm/connect.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(connect,connect) + +#endif diff --git a/arm/getpeername.S b/arm/getpeername.S new file mode 100644 index 0000000..fd2d911 --- /dev/null +++ b/arm/getpeername.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(getpeername,getpeername) + +#endif diff --git a/arm/getsockname.S b/arm/getsockname.S new file mode 100644 index 0000000..6d6594d --- /dev/null +++ b/arm/getsockname.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(getsockname,getsockname) + +#endif diff --git a/arm/listen.S b/arm/listen.S new file mode 100644 index 0000000..29d0cc1 --- /dev/null +++ b/arm/listen.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(listen,listen) + +#endif diff --git a/arm/md5asm.S b/arm/md5asm.S index 422b992..370b503 100644 --- a/arm/md5asm.S +++ b/arm/md5asm.S @@ -57,8 +57,12 @@ .global MD5Update .text +#ifdef __ARM_EABI__ + .align 4 +#else .align 2 - +#endif + @ -- @ void MD5Init (MD5_CTX* context); @ -- diff --git a/arm/mmap.S b/arm/mmap.S index 522a9cd..db3aa9e 100644 --- a/arm/mmap.S +++ b/arm/mmap.S @@ -15,6 +15,18 @@ .global mmap +#ifdef __ARM_EABI__ + +mmap: + mov ip, r7 + mov r7, #__NR_mmap2 + svc 0x00000000 + mov r7, ip + cmn r0, #4096 + mov pc, lr @ return + +#else + mmap: stmdb sp!, {r0, r1, r2, r3} mov r0, sp @@ -22,3 +34,4 @@ mmap: add sp, sp, #16 b __unified_syscall +#endif diff --git a/arm/recv.S b/arm/recv.S new file mode 100644 index 0000000..bcb8014 --- /dev/null +++ b/arm/recv.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(recv,recv) + +#endif diff --git a/arm/recvfrom.S b/arm/recvfrom.S new file mode 100644 index 0000000..757110e --- /dev/null +++ b/arm/recvfrom.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(recvfrom,recvfrom) + +#endif diff --git a/arm/recvmsg.S b/arm/recvmsg.S new file mode 100644 index 0000000..12ecb62 --- /dev/null +++ b/arm/recvmsg.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(recvmsg,recvmsg) + +#endif diff --git a/arm/send.S b/arm/send.S new file mode 100644 index 0000000..5ecbb09 --- /dev/null +++ b/arm/send.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(send,send) + +#endif diff --git a/arm/sendmsg.S b/arm/sendmsg.S new file mode 100644 index 0000000..b1c196c --- /dev/null +++ b/arm/sendmsg.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(sendmsg,sendmsg) + +#endif diff --git a/arm/sendto.S b/arm/sendto.S new file mode 100644 index 0000000..c080577 --- /dev/null +++ b/arm/sendto.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(sendto,sendto) + +#endif diff --git a/arm/setjmp.S b/arm/setjmp.S index 0d7e365..6b850d4 100644 --- a/arm/setjmp.S +++ b/arm/setjmp.S @@ -12,6 +12,6 @@ sigsetjmp: sfm f4, 4, [r0], #48 #endif stmia r0, {r4-r11, sp, lr} - sub r0, r0, #30 + sub r0, r0, #48 b __sigjmp_save diff --git a/arm/setsockopt.S b/arm/setsockopt.S new file mode 100644 index 0000000..d56581b --- /dev/null +++ b/arm/setsockopt.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(setsockopt,setsockopt) + +#endif diff --git a/arm/shutdown.S b/arm/shutdown.S new file mode 100644 index 0000000..eecac1b --- /dev/null +++ b/arm/shutdown.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(shutdown,shutdown) + +#endif diff --git a/arm/socket.S b/arm/socket.S new file mode 100644 index 0000000..f997fd0 --- /dev/null +++ b/arm/socket.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(socket,socket) + +#endif diff --git a/arm/socketpair.S b/arm/socketpair.S new file mode 100644 index 0000000..9e1f7ed --- /dev/null +++ b/arm/socketpair.S @@ -0,0 +1,7 @@ +#ifdef __ARM_EABI__ + +#include "syscalls.h" + +syscall(socketpair,socketpair) + +#endif diff --git a/arm/start.S b/arm/start.S index fcd3d7c..ccbac48 100644 --- a/arm/start.S +++ b/arm/start.S @@ -3,12 +3,48 @@ #include "syscalls.h" .text +#ifdef __ARM_EABI__ + .align 4 +#else .align 2 - +#endif + .global _start .weak exit .global _exit + +#ifdef __ARM_EABI__ + +_start: + + mov fp, #0 @ clear the frame pointer + ldr a1, [sp], #4 @ argc + mov a2, sp @ argv + ldr ip, .L3 + add a3, a2, a1, lsl #2 @ &argv[argc] + add a3, a3, #4 @ envp + str a3, [ip, #0] @ environ = envp + bl main + +@ +@ The exit status from main() is already in r0. +@ We need to branch to 'exit' in case we have linked with 'atexit'. +@ + bl exit + +exit: +_exit: + + mov r7, #__NR_exit + swi 0 @ never returns. + +.L3: .word environ + + +#else + + _start: #ifdef WANT_DYNAMIC @@ -72,4 +108,4 @@ _exit: #endif - +#endif diff --git a/arm/syscalls.h b/arm/syscalls.h index 52be4dc..70d410c 100644 --- a/arm/syscalls.h +++ b/arm/syscalls.h @@ -1,8 +1,16 @@ #ifndef _ARM_SYSCALL_H #define _ARM_SYSCALL_H 1 -#define __NR_SYSCALL_BASE 0x900000 +#define __NR_OABI_SYSCALL_BASE 0x900000 +#if defined(__thumb__) || defined(__ARM_EABI__) +#define __NR_SYSCALL_BASE 0 +#else +#define __NR_SYSCALL_BASE __NR_OABI_SYSCALL_BASE +#endif + + +#define __NR_restart_syscall (__NR_SYSCALL_BASE+ 0) #define __NR_exit (__NR_SYSCALL_BASE+ 1) #define __NR_fork (__NR_SYSCALL_BASE+ 2) #define __NR_read (__NR_SYSCALL_BASE+ 3) @@ -129,10 +137,10 @@ #define __NR_adjtimex (__NR_SYSCALL_BASE+124) #define __NR_mprotect (__NR_SYSCALL_BASE+125) #define __NR_sigprocmask (__NR_SYSCALL_BASE+126) -#define __NR_create_module (__NR_SYSCALL_BASE+127) + /* 127 was sys_create_module */ #define __NR_init_module (__NR_SYSCALL_BASE+128) #define __NR_delete_module (__NR_SYSCALL_BASE+129) -#define __NR_get_kernel_syms (__NR_SYSCALL_BASE+130) + /* 130 was sys_get_kernel_syms */ #define __NR_quotactl (__NR_SYSCALL_BASE+131) #define __NR_getpgid (__NR_SYSCALL_BASE+132) #define __NR_fchdir (__NR_SYSCALL_BASE+133) @@ -169,7 +177,7 @@ #define __NR_setresuid (__NR_SYSCALL_BASE+164) #define __NR_getresuid (__NR_SYSCALL_BASE+165) /* 166 was sys_vm86 */ -#define __NR_query_module (__NR_SYSCALL_BASE+167) + /* 167 was sys_query_module */ #define __NR_poll (__NR_SYSCALL_BASE+168) #define __NR_nfsservctl (__NR_SYSCALL_BASE+169) #define __NR_setresgid (__NR_SYSCALL_BASE+170) @@ -182,8 +190,8 @@ #define __NR_rt_sigtimedwait (__NR_SYSCALL_BASE+177) #define __NR_rt_sigqueueinfo (__NR_SYSCALL_BASE+178) #define __NR_rt_sigsuspend (__NR_SYSCALL_BASE+179) -#define __NR_pread (__NR_SYSCALL_BASE+180) -#define __NR_pwrite (__NR_SYSCALL_BASE+181) +#define __NR_pread64 (__NR_SYSCALL_BASE+180) +#define __NR_pwrite64 (__NR_SYSCALL_BASE+181) #define __NR_chown (__NR_SYSCALL_BASE+182) #define __NR_getcwd (__NR_SYSCALL_BASE+183) #define __NR_capget (__NR_SYSCALL_BASE+184) @@ -272,7 +280,7 @@ #define __NR_fstatfs64 (__NR_SYSCALL_BASE+267) #define __NR_tgkill (__NR_SYSCALL_BASE+268) #define __NR_utimes (__NR_SYSCALL_BASE+269) -#define __NR_fadvise64 (__NR_SYSCALL_BASE+270) +#define __NR_arm_fadvise64_64 (__NR_SYSCALL_BASE+270) #define __NR_pciconfig_iobase (__NR_SYSCALL_BASE+271) #define __NR_pciconfig_read (__NR_SYSCALL_BASE+272) #define __NR_pciconfig_write (__NR_SYSCALL_BASE+273) @@ -283,10 +291,38 @@ #define __NR_mq_notify (__NR_SYSCALL_BASE+278) #define __NR_mq_getsetattr (__NR_SYSCALL_BASE+279) #define __NR_waitid (__NR_SYSCALL_BASE+280) - +#define __NR_socket (__NR_SYSCALL_BASE+281) +#define __NR_bind (__NR_SYSCALL_BASE+282) +#define __NR_connect (__NR_SYSCALL_BASE+283) +#define __NR_listen (__NR_SYSCALL_BASE+284) +#define __NR_accept (__NR_SYSCALL_BASE+285) +#define __NR_getsockname (__NR_SYSCALL_BASE+286) +#define __NR_getpeername (__NR_SYSCALL_BASE+287) +#define __NR_socketpair (__NR_SYSCALL_BASE+288) +#define __NR_send (__NR_SYSCALL_BASE+289) +#define __NR_sendto (__NR_SYSCALL_BASE+290) +#define __NR_recv (__NR_SYSCALL_BASE+291) +#define __NR_recvfrom (__NR_SYSCALL_BASE+292) +#define __NR_shutdown (__NR_SYSCALL_BASE+293) +#define __NR_setsockopt (__NR_SYSCALL_BASE+294) +#define __NR_getsockopt (__NR_SYSCALL_BASE+295) +#define __NR_sendmsg (__NR_SYSCALL_BASE+296) +#define __NR_recvmsg (__NR_SYSCALL_BASE+297) +#define __NR_semop (__NR_SYSCALL_BASE+298) +#define __NR_semget (__NR_SYSCALL_BASE+299) +#define __NR_semctl (__NR_SYSCALL_BASE+300) +#define __NR_msgsnd (__NR_SYSCALL_BASE+301) +#define __NR_msgrcv (__NR_SYSCALL_BASE+302) +#define __NR_msgget (__NR_SYSCALL_BASE+303) +#define __NR_msgctl (__NR_SYSCALL_BASE+304) +#define __NR_shmat (__NR_SYSCALL_BASE+305) +#define __NR_shmdt (__NR_SYSCALL_BASE+306) +#define __NR_shmget (__NR_SYSCALL_BASE+307) +#define __NR_shmctl (__NR_SYSCALL_BASE+308) #define __NR_add_key (__NR_SYSCALL_BASE+309) #define __NR_request_key (__NR_SYSCALL_BASE+310) #define __NR_keyctl (__NR_SYSCALL_BASE+311) +#define __NR_semtimedop (__NR_SYSCALL_BASE+312) #define __NR_vserver (__NR_SYSCALL_BASE+313) #define __NR_ioprio_set (__NR_SYSCALL_BASE+314) #define __NR_ioprio_get (__NR_SYSCALL_BASE+315) @@ -316,18 +352,11 @@ #define __NR_get_robust_list (__NR_SYSCALL_BASE+339) #define __NR_splice (__NR_SYSCALL_BASE+340) #define __NR_arm_sync_file_range (__NR_SYSCALL_BASE+341) -#define __NR_sync_file_range2 __NR_arm_sync_file_range #define __NR_tee (__NR_SYSCALL_BASE+342) #define __NR_vmsplice (__NR_SYSCALL_BASE+343) #define __NR_move_pages (__NR_SYSCALL_BASE+344) #define __NR_getcpu (__NR_SYSCALL_BASE+345) /* 346 for epoll_pwait */ -#define __NR_kexec_load (__NR_SYSCALL_BASE+347) -#define __NR_utimensat (__NR_SYSCALL_BASE+348) -#define __NR_signalfd (__NR_SYSCALL_BASE+349) -#define __NR_timerfd (__NR_SYSCALL_BASE+350) -#define __NR_eventfd (__NR_SYSCALL_BASE+351) -#define __NR_fallocate (__NR_SYSCALL_BASE+352) /* * The following SWIs are ARM private. @@ -339,6 +368,25 @@ #define __ARM_NR_usr32 (__ARM_NR_BASE+4) #define __ARM_NR_set_tls (__ARM_NR_BASE+5) +/* + * The following syscalls are obsolete and no longer available for EABI. + */ +#if defined(__ARM_EABI__) && !defined(__KERNEL__) +#undef __NR_time +#undef __NR_umount +#undef __NR_stime +#undef __NR_alarm +#undef __NR_utime +#undef __NR_getrlimit +#undef __NR_select +#undef __NR_readdir +#undef __NR_mmap +#undef __NR_socketcall +#undef __NR_syscall +#undef __NR_ipc +#endif + + /* ok the next few values are for the optimization of the unified syscalls * on arm. * If the syscall has #arguments @@ -632,6 +680,35 @@ #define __ARGS_mq_getsetattr 0 #define __ARGS_waitid 0 +#define __ARGS_socket 0 +#define __ARGS_bind 0 +#define __ARGS_connect 0 +#define __ARGS_listen 0 +#define __ARGS_accept 0 +#define __ARGS_getsockname 0 +#define __ARGS_getpeername 0 +#define __ARGS_socketpair 0 +#define __ARGS_send 0 +#define __ARGS_sendto 0 +#define __ARGS_recv 0 +#define __ARGS_recvfrom 0 +#define __ARGS_shutdown 0 +#define __ARGS_setsockopt 0 +#define __ARGS_getsockopt 0 +#define __ARGS_sendmsg 0 +#define __ARGS_recvmsg 0 +#define __ARGS_semop 0 +#define __ARGS_semget 0 +#define __ARGS_semctl 0 +#define __ARGS_msgsnd 0 +#define __ARGS_msgrcv 0 +#define __ARGS_msgget 0 +#define __ARGS_msgctl 0 +#define __ARGS_shmat 0 +#define __ARGS_shmdt 0 +#define __ARGS_shmget 0 +#define __ARGS_shmctl 0 + #define __ARGS_add_key 1 #define __ARGS_request_key 1 #define __ARGS_keyctl 0 @@ -671,15 +748,46 @@ #define __ARGS_move_pages 1 #define __ARGS_getcpu 0 /* 346 for epoll_pwait */ -#define __ARGS_kexec_load 0 -#define __ARGS_utimensat 0 -#define __ARGS_signalfd 0 -#define __ARGS_timerfd 0 -#define __ARGS_eventfd 0 -#define __ARGS_fallocate 0 #ifdef __ASSEMBLER__ + +#ifdef __ARM_EABI__ + +#define syscall_weak(name,wsym,sym) __syscall_weak __NR_##name, wsym, sym, __ARGS_##name +.macro __syscall_weak name wsym sym typ +.text +.type \wsym,function +.weak \wsym +\wsym: +.type \sym,function +.global \sym +\sym: + stmfd sp!,{r4,r5,r7,lr} + ldr r4, [sp,#16] + ldr r5, [sp,#20] + ldr r7, =\name + swi 0 + b __unified_syscall +.endm + + +#define syscall(name,sym) __syscall __NR_##name, sym, __ARGS_##name +.macro __syscall name sym typ +.text +.type \sym,function +.global \sym +\sym: + stmfd sp!,{r4,r5,r7,lr} + ldr r4, [sp,#16] + ldr r5, [sp,#20] + ldr r7, =\name + swi 0 + b __unified_syscall +.endm + +#else + #define syscall_weak(name,wsym,sym) __syscall_weak $__NR_##name, wsym, sym, __ARGS_##name .macro __syscall_weak name wsym sym typ .text @@ -723,3 +831,5 @@ #endif #endif + +#endif diff --git a/arm/unified.S b/arm/unified.S index 5e5ec6e..3023032 100644 --- a/arm/unified.S +++ b/arm/unified.S @@ -2,11 +2,35 @@ #include <dietfeatures.h> .text +#ifdef __ARM_EABI__ + .align 4 +#else .align 2 - +#endif .global __unified_syscall .global __unified_syscall4 + +#ifdef __ARM_EABI__ + +__unified_syscall4: +__unified_syscall: + + cmn r0, #4096 + rsbcs r2, r0, #0 + ldrcs r3, 1f + mvncs r0, #0 + strcs r2, [r3] + ldmfd sp!,{r4,r5,r7,pc} + .balign 4 +1: + .word errno + +/* here we go and "reuse" the return for weak-void functions */ +#include "dietuglyweaks.h" + +#else + __unified_syscall4: ldmia sp!, {r4, r5, r6} __unified_syscall: @@ -32,3 +56,5 @@ __unified_syscall: #ifndef WANT_THREAD_SAFE .L0: .long errno #endif + +#endif diff --git a/arm/waitpid.S b/arm/waitpid.S index d090e49..2c3a75b 100644 --- a/arm/waitpid.S +++ b/arm/waitpid.S @@ -1,5 +1,9 @@ .text +#ifdef __ARM_EABI__ +.align 4 +#else .align 2 +#endif .weak waitpid .type waitpid, %function waitpid: diff --git a/diet.c b/diet.c index 9864a2c..7a9c05f 100644 --- a/diet.c +++ b/diet.c @@ -32,7 +32,11 @@ static const char* Os[] = { "sparc","-Os","-mcpu=supersparc",0, "sparc64","-Os","-m64","-mhard-quad-float",0, "alpha","-Os","-fomit-frame-pointer",0, +#ifdef __ARM_EABI__ + "arm","-Os","-fomit-frame-pointer","-mfloat-abi=soft","-meabi=4",0, +#else "arm","-Os","-fomit-frame-pointer",0, +#endif "mips","-Os","-fomit-frame-pointer","-mno-abicalls","-fno-pic","-G","0",0, "mipsel","-Os","-fomit-frame-pointer","-mno-abicalls","-fno-pic","-G","0",0, "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, diff --git a/include/elf.h b/include/elf.h index a79d948..6bfd3d6 100644 --- a/include/elf.h +++ b/include/elf.h @@ -2078,6 +2078,7 @@ typedef Elf32_Addr Elf32_Conflict; #define EF_ARM_EABI_UNKNOWN 0x00000000 #define EF_ARM_EABI_VER1 0x01000000 #define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER4 0x04000000 /* Additional symbol types for Thumb */ #define STT_ARM_TFUNC 0xd diff --git a/x86_64/strcpy.S b/x86_64/strcpy.S index 1b78d90..90c013c 100644 --- a/x86_64/strcpy.S +++ b/x86_64/strcpy.S @@ -7,8 +7,8 @@ strcpy: .Lloop: lodsb + test %al, %al stosb - or %al, %al jnz .Lloop mov %rdx,%rax -- 1.6.0