__NR_syscall undefined for arm big endian with eabi support

Geerts Steven Steven.Geerts at thomson.net
Tue Mar 27 09:15:27 UTC 2007


All

I'm having a problem with building uClibc and it fails on an item that
should be solved already, but for me it's still giving problems.

I'm using buildroot to build my toolchain for arm big-endian with eabi
support.  It's failing at the __NR_syscall undefined error because EABI
doesn't support this function.

So I changed my syscall.c to with an extra check to check that ARM_EABI
(see below) is also selected or not, but I wan to be sure if I can do
this?  If I do this, will everything builds and otherwise not.

Extra from syscall.c:

long syscall(long sysnum, long a, long b, long c, long d, long e, long
f)
{
#if !defined(__thumb__) && !defined(__ARM_EABI__)	// I added here
the extra ARM_EABI check!!!!
        register long _r0 __asm__("r0")=(long)(sysnum);
        register long _r6 __asm__("r6")=(long)(f);
        register long _r5 __asm__("r5")=(long)(e);
        register long _r4 __asm__("r4")=(long)(d);
        register long _r3 __asm__("r3")=(long)(c);
        register long _r2 __asm__("r2")=(long)(b);
        register long _r1 __asm__("r1")=(long)(a);
        __asm__ __volatile__(
                        "swi %1"
                        : "=r"(_r0)
                        : "i"(__NR_syscall), "r"(_r0), "r"(_r1),
                        "r"(_r2), "r"(_r3), "r"(_r4), "r"(_r5),
                        "r"(_r6)
                        : "memory");
#else
        register long _r7 __asm__("r7")=(long)(sysnum);
        register long _r5 __asm__("r5")=(long)(f);
        register long _r4 __asm__("r4")=(long)(e);
        register long _r3 __asm__("r3")=(long)(d);
        register long _r2 __asm__("r2")=(long)(c);
        register long _r1 __asm__("r1")=(long)(b);
        register long _r0 __asm__("r0")=(long)(a);
        __asm__ __volatile__(
                        "swi 0"
                        : "=r"(_r0)
                        : "r"(_r0), "r"(_r1), "r"(_r2), "r"(_r3),
                        "r"(_r4), "r"(_r5), "r"(_r7)
                        : "memory");
#endif
        if(_r0 >=(unsigned long) -4095) {
                long err = _r0;
                (*__errno_location())=(-err);
                _r0=(unsigned long) -1;
        }
        return (long) _r0;
}

Is this correct or should I change something else?  If so, what do I
need to check?

Best regards

steven




More information about the uClibc mailing list