[PATCH] libgloss/arm: Add linux syscall interface.
Jeff Johnston
jjohnstn@redhat.com
Wed May 10 16:06:00 GMT 2006
I have a question. Why didn't you add a machine/arm subdirectory to
libc/sys/linux? This gives you full functionality for relatively
low-effort and maximizes code sharing among the various platforms. It
doesn't make sense to write all that code from scratch again or copy it
into two different places.
-- Jeff J.
Shaun Jackman wrote:
> On 3/28/06, Shaun Jackman <sjackman@gmail.com> wrote:
>
>> This patch adds a Linux syscall interface to libgloss/arm. It's
>> written in assembler, for the most part, to make the interface as
>> small and as thin as possible. For example in Thumb mode, each
>> additional system call only takes an additional four bytes. This patch
>> only implements the subset of Linux system calls that I use, but the
>> intention is to add system calls fairly liberally as they're requested
>> by users.
>>
>> Cheers,
>> Shaun
>
>
> This patch is a minor update to my previous patch of 2006-03-28. Ping!
>
> Cheers,
> Shaun
>
> 2006-05-05 Shaun Jackman <sjackman@gmail.com>
>
> * arm/Makefile.in: Add Linux syscall interface.
> * arm/linux-crt0.S: New file.
> * arm/linux-syscall.h: New file.
> * arm/linux-syscalls0.S: New file.
> * arm/linux-syscalls1.c: New file.
>
> Index: arm/Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/libgloss/arm/Makefile.in,v
> retrieving revision 1.6
> diff -u -r1.6 Makefile.in
> --- arm/Makefile.in 13 Apr 2005 00:01:40 -0000 1.6
> +++ arm/Makefile.in 5 May 2006 21:54:34 -0000
> @@ -53,6 +53,12 @@
> @BUILD_CRT0_FALSE@CRT0 =
> @BUILD_CRT0_FALSE@CRT0_INSTALL =
>
> +LINUX_CRT0 = linux-crt0.o
> +LINUX_BSP = libgloss-linux.a
> +LINUX_OBJS = linux-syscalls0.o linux-syscalls1.o
> +LINUX_SCRIPTS = linux.specs
> +LINUX_INSTALL = install-linux
> +
> REDBOOT_CRT0 = redboot-crt0.o
> REDBOOT_OBJS = redboot-syscalls.o
> REDBOOT_SCRIPTS = redboot.ld redboot.specs
> @@ -87,7 +93,7 @@
> # build a test program for each target board. Just trying to get
> # it to link is a good test, so we ignore all the errors for now.
> #
> -all: ${CRT0} ${REDBOOT_CRT0} ${REDBOOT_OBJS} ${RDPMON_CRT0}
> ${RDPMON_BSP} ${RDIMON_CRT0} ${RDIMON_BSP}
> +all: ${CRT0} ${LINUX_CRT0} ${LINUX_BSP} ${REDBOOT_CRT0}
> ${REDBOOT_OBJS} ${RDPMON_CRT0} ${RDPMON_BSP} ${RDIMON_CRT0}
> ${RDIMON_BSP}
>
> #
> # here's where we build the test programs for each target
> @@ -115,6 +121,10 @@
> rdimon-libcfunc.o: libcfunc.c
> $(CC) $(CFLAGS_FOR_TARGET) $(INCLUDES) -DARM_RDI_MONITOR -o $@ -c $<
>
> +$(LINUX_BSP): $(LINUX_OBJS)
> + ${AR} ${ARFLAGS} $@ $^
> + ${RANLIB} $@
> +
> $(RDPMON_BSP): $(RDPMON_OBJS)
> ${AR} ${ARFLAGS} $@ $^
> ${RANLIB} $@
> @@ -130,11 +140,15 @@
> rm -f Makefile config.status *~
>
> .PHONY: install info install-info clean-info
> -install: ${CRT0_INSTALL} ${REDBOOT_INSTALL} ${RDPMON_INSTALL}
> ${RDIMON_INSTALL} ${IQ80310_INSTALL} ${PID_INSTALL}
> +install: ${CRT0_INSTALL} ${LINUX_INSTALL} ${REDBOOT_INSTALL}
> ${RDPMON_INSTALL} ${RDIMON_INSTALL} ${IQ80310_INSTALL} ${PID_INSTALL}
>
> install-crt0:
> ${INSTALL_DATA} ${CRT0} $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x
>
> +install-linux:
> + set -e; for x in ${LINUX_CRT0} ${LINUX_BSP}; do ${INSTALL_DATA} $$x
> $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
> + set -e; for x in ${LINUX_SCRIPTS}; do ${INSTALL_DATA}
> ${srcdir}/${objtype}$$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x;
> done
> +
> install-redboot:
> set -e; for x in ${REDBOOT_CRT0} ${REDBOOT_OBJS}; do ${INSTALL_DATA}
> $$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
> set -e; for x in ${REDBOOT_SCRIPTS}; do ${INSTALL_DATA}
> ${srcdir}/${objtype}$$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x;
> done
> --- /dev/null 2006-05-04 16:06:26.438914112 -0600
> +++ arm/linux-crt0.S 2006-03-28 16:32:28.000000000 -0700
> @@ -0,0 +1,46 @@
> +/** Linux startup code for the ARM processor.
> + * Written by Shaun Jackman <sjackman@gmail.com>.
> + * Copyright 2006 Pathway Connectivity
> + *
> + * Permission to use, copy, modify, and distribute this software
> + * is freely granted, provided that this notice is preserved.
> + */
> +
> +.global _start
> +.type _start, %function
> +_start:
> +#if __thumb__
> + /* Switch to Thumb mode. */
> + adr r0, _start_thumb+1
> + bx r0
> +.size _start, .-_start
> +.global _start_thumb
> +.thumb_func
> +_start_thumb:
> +#endif
> +
> +#if 0
> + /* Clear the BSS. This task is normally handled by the kernel. */
> + ldr r0, =__bss_start
> + mov r1, #0
> + ldr r2, =_end
> + sub r2, r2, r0
> + bl memset
> +#endif
> +
> + pop {r0} @ argc
> + mov r1, sp @ argv
> + lsl r2, r0, #2
> + add r2, r1
> + add r2, #4 @ envp
> + ldr r3, =environ
> + str r2, [r3]
> + bl main
> + bl exit
> + b .
> +
> +#if __thumb__
> +.size _start_thumb, .-_start_thumb
> +#else
> +.size _start, .-_start
> +#endif
> --- /dev/null 2006-05-04 16:06:26.438914112 -0600
> +++ arm/linux-syscall.h 2006-03-27 15:19:55.000000000 -0700
> @@ -0,0 +1,318 @@
> +/** Linux system call numbers for the ARM processor.
> + * Written by Shaun Jackman <sjackman@gmail.com>
> + * Copyright 2006 Pathway Connectivity
> + *
> + * Permission to use, copy, modify, and distribute this software
> + * is freely granted, provided that this notice is preserved.
> + */
> +
> +#ifndef _LIBGLOSS_ARM_LINUX_UNISTD_H
> +#define _LIBGLOSS_ARM_LINUX_UNISTD_H
> +
> +#if __thumb__
> +# define SYS_BASE 0
> +#else
> +# define SYS_BASE 0x900000
> +#endif
> +
> +#define SYS_restart_syscall (SYS_BASE+ 0)
> +#define SYS_exit (SYS_BASE+ 1)
> +#define SYS_fork (SYS_BASE+ 2)
> +#define SYS_read (SYS_BASE+ 3)
> +#define SYS_write (SYS_BASE+ 4)
> +#define SYS_open (SYS_BASE+ 5)
> +#define SYS_close (SYS_BASE+ 6)
> +/* SYS_waitpid was 7 */
> +#define SYS_creat (SYS_BASE+ 8)
> +#define SYS_link (SYS_BASE+ 9)
> +#define SYS_unlink (SYS_BASE+ 10)
> +#define SYS_execve (SYS_BASE+ 11)
> +#define SYS_chdir (SYS_BASE+ 12)
> +#define SYS_time (SYS_BASE+ 13)
> +#define SYS_mknod (SYS_BASE+ 14)
> +#define SYS_chmod (SYS_BASE+ 15)
> +#define SYS_lchown (SYS_BASE+ 16)
> +/* SYS_break was 17 */
> +/* SYS_stat was 18 */
> +#define SYS_lseek (SYS_BASE+ 19)
> +#define SYS_getpid (SYS_BASE+ 20)
> +#define SYS_mount (SYS_BASE+ 21)
> +#define SYS_umount (SYS_BASE+ 22)
> +#define SYS_setuid (SYS_BASE+ 23)
> +#define SYS_getuid (SYS_BASE+ 24)
> +#define SYS_stime (SYS_BASE+ 25)
> +#define SYS_ptrace (SYS_BASE+ 26)
> +#define SYS_alarm (SYS_BASE+ 27)
> +/* SYS_fstat was 28 */
> +#define SYS_pause (SYS_BASE+ 29)
> +#define SYS_utime (SYS_BASE+ 30)
> +/* SYS_stty was 31 */
> +/* SYS_gtty was 32 */
> +#define SYS_access (SYS_BASE+ 33)
> +#define SYS_nice (SYS_BASE+ 34)
> +/* SYS_ftime was 35 */
> +#define SYS_sync (SYS_BASE+ 36)
> +#define SYS_kill (SYS_BASE+ 37)
> +#define SYS_rename (SYS_BASE+ 38)
> +#define SYS_mkdir (SYS_BASE+ 39)
> +#define SYS_rmdir (SYS_BASE+ 40)
> +#define SYS_dup (SYS_BASE+ 41)
> +#define SYS_pipe (SYS_BASE+ 42)
> +#define SYS_times (SYS_BASE+ 43)
> +/* SYS_prof was 44 */
> +#define SYS_brk (SYS_BASE+ 45)
> +#define SYS_setgid (SYS_BASE+ 46)
> +#define SYS_getgid (SYS_BASE+ 47)
> +/* SYS_signal was 48 */
> +#define SYS_geteuid (SYS_BASE+ 49)
> +#define SYS_getegid (SYS_BASE+ 50)
> +#define SYS_acct (SYS_BASE+ 51)
> +#define SYS_umount2 (SYS_BASE+ 52)
> +/* SYS_lock was 53 */
> +#define SYS_ioctl (SYS_BASE+ 54)
> +#define SYS_fcntl (SYS_BASE+ 55)
> +/* SYS_mpx was 56 */
> +#define SYS_setpgid (SYS_BASE+ 57)
> +/* SYS_ulimit was 58 */
> +/* SYS_olduname was 59 */
> +#define SYS_umask (SYS_BASE+ 60)
> +#define SYS_chroot (SYS_BASE+ 61)
> +#define SYS_ustat (SYS_BASE+ 62)
> +#define SYS_dup2 (SYS_BASE+ 63)
> +#define SYS_getppid (SYS_BASE+ 64)
> +#define SYS_getpgrp (SYS_BASE+ 65)
> +#define SYS_setsid (SYS_BASE+ 66)
> +#define SYS_sigaction (SYS_BASE+ 67)
> +/* SYS_sgetmask was 68 */
> +/* SYS_ssetmask was 69 */
> +#define SYS_setreuid (SYS_BASE+ 70)
> +#define SYS_setregid (SYS_BASE+ 71)
> +#define SYS_sigsuspend (SYS_BASE+ 72)
> +#define SYS_sigpending (SYS_BASE+ 73)
> +#define SYS_sethostname (SYS_BASE+ 74)
> +#define SYS_setrlimit (SYS_BASE+ 75)
> +#define SYS_getrlimit (SYS_BASE+ 76)
> +#define SYS_getrusage (SYS_BASE+ 77)
> +#define SYS_gettimeofday (SYS_BASE+ 78)
> +#define SYS_settimeofday (SYS_BASE+ 79)
> +#define SYS_getgroups (SYS_BASE+ 80)
> +#define SYS_setgroups (SYS_BASE+ 81)
> +#define SYS_select (SYS_BASE+ 82)
> +#define SYS_symlink (SYS_BASE+ 83)
> +/* SYS_lstat was 84 */
> +#define SYS_readlink (SYS_BASE+ 85)
> +#define SYS_uselib (SYS_BASE+ 86)
> +#define SYS_swapon (SYS_BASE+ 87)
> +#define SYS_reboot (SYS_BASE+ 88)
> +#define SYS_readdir (SYS_BASE+ 89)
> +#define SYS_mmap (SYS_BASE+ 90)
> +#define SYS_munmap (SYS_BASE+ 91)
> +#define SYS_truncate (SYS_BASE+ 92)
> +#define SYS_ftruncate (SYS_BASE+ 93)
> +#define SYS_fchmod (SYS_BASE+ 94)
> +#define SYS_fchown (SYS_BASE+ 95)
> +#define SYS_getpriority (SYS_BASE+ 96)
> +#define SYS_setpriority (SYS_BASE+ 97)
> +/* SYS_profil was 98 */
> +#define SYS_statfs (SYS_BASE+ 99)
> +#define SYS_fstatfs (SYS_BASE+100)
> +/* SYS_ioperm was 101 */
> +#define SYS_socketcall (SYS_BASE+102)
> +#define SYS_syslog (SYS_BASE+103)
> +#define SYS_setitimer (SYS_BASE+104)
> +#define SYS_getitimer (SYS_BASE+105)
> +#define SYS_stat (SYS_BASE+106)
> +#define SYS_lstat (SYS_BASE+107)
> +#define SYS_fstat (SYS_BASE+108)
> +/* SYS_uname was 109 */
> +/* SYS_iopl was 110 */
> +#define SYS_vhangup (SYS_BASE+111)
> +/* SYS_idle was 112 */
> +#define SYS_syscall (SYS_BASE+113)
> +#define SYS_wait4 (SYS_BASE+114)
> +#define SYS_swapoff (SYS_BASE+115)
> +#define SYS_sysinfo (SYS_BASE+116)
> +#define SYS_ipc (SYS_BASE+117)
> +#define SYS_fsync (SYS_BASE+118)
> +#define SYS_sigreturn (SYS_BASE+119)
> +#define SYS_clone (SYS_BASE+120)
> +#define SYS_setdomainname (SYS_BASE+121)
> +#define SYS_uname (SYS_BASE+122)
> +/* SYS_modify_ldt was 123 */
> +#define SYS_adjtimex (SYS_BASE+124)
> +#define SYS_mprotect (SYS_BASE+125)
> +#define SYS_sigprocmask (SYS_BASE+126)
> +/* SYS_create_module was 127 */
> +#define SYS_init_module (SYS_BASE+128)
> +#define SYS_delete_module (SYS_BASE+129)
> +/* SYS_get_kernel_syms was 130 */
> +#define SYS_quotactl (SYS_BASE+131)
> +#define SYS_getpgid (SYS_BASE+132)
> +#define SYS_fchdir (SYS_BASE+133)
> +#define SYS_bdflush (SYS_BASE+134)
> +#define SYS_sysfs (SYS_BASE+135)
> +#define SYS_personality (SYS_BASE+136)
> +/* SYS_afs_syscall was 137 */
> +#define SYS_setfsuid (SYS_BASE+138)
> +#define SYS_setfsgid (SYS_BASE+139)
> +#define SYS__llseek (SYS_BASE+140)
> +#define SYS_getdents (SYS_BASE+141)
> +#define SYS__newselect (SYS_BASE+142)
> +#define SYS_flock (SYS_BASE+143)
> +#define SYS_msync (SYS_BASE+144)
> +#define SYS_readv (SYS_BASE+145)
> +#define SYS_writev (SYS_BASE+146)
> +#define SYS_getsid (SYS_BASE+147)
> +#define SYS_fdatasync (SYS_BASE+148)
> +#define SYS__sysctl (SYS_BASE+149)
> +#define SYS_mlock (SYS_BASE+150)
> +#define SYS_munlock (SYS_BASE+151)
> +#define SYS_mlockall (SYS_BASE+152)
> +#define SYS_munlockall (SYS_BASE+153)
> +#define SYS_sched_setparam (SYS_BASE+154)
> +#define SYS_sched_getparam (SYS_BASE+155)
> +#define SYS_sched_setscheduler (SYS_BASE+156)
> +#define SYS_sched_getscheduler (SYS_BASE+157)
> +#define SYS_sched_yield (SYS_BASE+158)
> +#define SYS_sched_get_priority_max (SYS_BASE+159)
> +#define SYS_sched_get_priority_min (SYS_BASE+160)
> +#define SYS_sched_rr_get_interval (SYS_BASE+161)
> +#define SYS_nanosleep (SYS_BASE+162)
> +#define SYS_mremap (SYS_BASE+163)
> +#define SYS_setresuid (SYS_BASE+164)
> +#define SYS_getresuid (SYS_BASE+165)
> +/* SYS_vm86 was 166 */
> +/* SYS_query_module was 167 */
> +#define SYS_poll (SYS_BASE+168)
> +#define SYS_nfsservctl (SYS_BASE+169)
> +#define SYS_setresgid (SYS_BASE+170)
> +#define SYS_getresgid (SYS_BASE+171)
> +#define SYS_prctl (SYS_BASE+172)
> +#define SYS_rt_sigreturn (SYS_BASE+173)
> +#define SYS_rt_sigaction (SYS_BASE+174)
> +#define SYS_rt_sigprocmask (SYS_BASE+175)
> +#define SYS_rt_sigpending (SYS_BASE+176)
> +#define SYS_rt_sigtimedwait (SYS_BASE+177)
> +#define SYS_rt_sigqueueinfo (SYS_BASE+178)
> +#define SYS_rt_sigsuspend (SYS_BASE+179)
> +#define SYS_pread64 (SYS_BASE+180)
> +#define SYS_pwrite64 (SYS_BASE+181)
> +#define SYS_chown (SYS_BASE+182)
> +#define SYS_getcwd (SYS_BASE+183)
> +#define SYS_capget (SYS_BASE+184)
> +#define SYS_capset (SYS_BASE+185)
> +#define SYS_sigaltstack (SYS_BASE+186)
> +#define SYS_sendfile (SYS_BASE+187)
> +/* reserved 188 */
> +/* reserved 189 */
> +#define SYS_vfork (SYS_BASE+190)
> +#define SYS_ugetrlimit (SYS_BASE+191)
> +#define SYS_mmap2 (SYS_BASE+192)
> +#define SYS_truncate64 (SYS_BASE+193)
> +#define SYS_ftruncate64 (SYS_BASE+194)
> +#define SYS_stat64 (SYS_BASE+195)
> +#define SYS_lstat64 (SYS_BASE+196)
> +#define SYS_fstat64 (SYS_BASE+197)
> +#define SYS_lchown32 (SYS_BASE+198)
> +#define SYS_getuid32 (SYS_BASE+199)
> +#define SYS_getgid32 (SYS_BASE+200)
> +#define SYS_geteuid32 (SYS_BASE+201)
> +#define SYS_getegid32 (SYS_BASE+202)
> +#define SYS_setreuid32 (SYS_BASE+203)
> +#define SYS_setregid32 (SYS_BASE+204)
> +#define SYS_getgroups32 (SYS_BASE+205)
> +#define SYS_setgroups32 (SYS_BASE+206)
> +#define SYS_fchown32 (SYS_BASE+207)
> +#define SYS_setresuid32 (SYS_BASE+208)
> +#define SYS_getresuid32 (SYS_BASE+209)
> +#define SYS_setresgid32 (SYS_BASE+210)
> +#define SYS_getresgid32 (SYS_BASE+211)
> +#define SYS_chown32 (SYS_BASE+212)
> +#define SYS_setuid32 (SYS_BASE+213)
> +#define SYS_setgid32 (SYS_BASE+214)
> +#define SYS_setfsuid32 (SYS_BASE+215)
> +#define SYS_setfsgid32 (SYS_BASE+216)
> +#define SYS_getdents64 (SYS_BASE+217)
> +#define SYS_pivot_root (SYS_BASE+218)
> +#define SYS_mincore (SYS_BASE+219)
> +#define SYS_madvise (SYS_BASE+220)
> +#define SYS_fcntl64 (SYS_BASE+221)
> +/* SYS_tux reserved 222 */
> +/* unused 223 */
> +#define SYS_gettid (SYS_BASE+224)
> +#define SYS_readahead (SYS_BASE+225)
> +#define SYS_setxattr (SYS_BASE+226)
> +#define SYS_lsetxattr (SYS_BASE+227)
> +#define SYS_fsetxattr (SYS_BASE+228)
> +#define SYS_getxattr (SYS_BASE+229)
> +#define SYS_lgetxattr (SYS_BASE+230)
> +#define SYS_fgetxattr (SYS_BASE+231)
> +#define SYS_listxattr (SYS_BASE+232)
> +#define SYS_llistxattr (SYS_BASE+233)
> +#define SYS_flistxattr (SYS_BASE+234)
> +#define SYS_removexattr (SYS_BASE+235)
> +#define SYS_lremovexattr (SYS_BASE+236)
> +#define SYS_fremovexattr (SYS_BASE+237)
> +#define SYS_tkill (SYS_BASE+238)
> +#define SYS_sendfile64 (SYS_BASE+239)
> +#define SYS_futex (SYS_BASE+240)
> +#define SYS_sched_setaffinity (SYS_BASE+241)
> +#define SYS_sched_getaffinity (SYS_BASE+242)
> +#define SYS_io_setup (SYS_BASE+243)
> +#define SYS_io_destroy (SYS_BASE+244)
> +#define SYS_io_getevents (SYS_BASE+245)
> +#define SYS_io_submit (SYS_BASE+246)
> +#define SYS_io_cancel (SYS_BASE+247)
> +#define SYS_exit_group (SYS_BASE+248)
> +#define SYS_lookup_dcookie (SYS_BASE+249)
> +#define SYS_epoll_create (SYS_BASE+250)
> +#define SYS_epoll_ctl (SYS_BASE+251)
> +#define SYS_epoll_wait (SYS_BASE+252)
> +#define SYS_remap_file_pages (SYS_BASE+253)
> +/* SYS_set_thread_area reserved 254 */
> +/* SYS_get_thread_area reserved 255 */
> +#define SYS_set_tid_address (SYS_BASE+256)
> +#define SYS_timer_create (SYS_BASE+257)
> +#define SYS_timer_settime (SYS_BASE+258)
> +#define SYS_timer_gettime (SYS_BASE+259)
> +#define SYS_timer_getoverrun (SYS_BASE+260)
> +#define SYS_timer_delete (SYS_BASE+261)
> +#define SYS_clock_settime (SYS_BASE+262)
> +#define SYS_clock_gettime (SYS_BASE+263)
> +#define SYS_clock_getres (SYS_BASE+264)
> +#define SYS_clock_nanosleep (SYS_BASE+265)
> +#define SYS_statfs64 (SYS_BASE+266)
> +#define SYS_fstatfs64 (SYS_BASE+267)
> +#define SYS_tgkill (SYS_BASE+268)
> +#define SYS_utimes (SYS_BASE+269)
> +#define SYS_arm_fadvise64_64 (SYS_BASE+270)
> +#define SYS_pciconfig_iobase (SYS_BASE+271)
> +#define SYS_pciconfig_read (SYS_BASE+272)
> +#define SYS_pciconfig_write (SYS_BASE+273)
> +#define SYS_mq_open (SYS_BASE+274)
> +#define SYS_mq_unlink (SYS_BASE+275)
> +#define SYS_mq_timedsend (SYS_BASE+276)
> +#define SYS_mq_timedreceive (SYS_BASE+277)
> +#define SYS_mq_notify (SYS_BASE+278)
> +#define SYS_mq_getsetattr (SYS_BASE+279)
> +#define SYS_waitid (SYS_BASE+280)
> +
> +#define SYS_SOCKET 1
> +#define SYS_BIND 2
> +#define SYS_CONNECT 3
> +#define SYS_LISTEN 4
> +#define SYS_ACCEPT 5
> +#define SYS_GETSOCKNAME 6
> +#define SYS_GETPEERNAME 7
> +#define SYS_SOCKETPAIR 8
> +#define SYS_SEND 9
> +#define SYS_RECV 10
> +#define SYS_SENDTO 11
> +#define SYS_RECVFROM 12
> +#define SYS_SHUTDOWN 13
> +#define SYS_SETSOCKOPT 14
> +#define SYS_GETSOCKOPT 15
> +#define SYS_SENDMSG 16
> +#define SYS_RECVMSG 17
> +
> +#endif /* _LIBGLOSS_ARM_LINUX_UNISTD_H */
> --- /dev/null 2006-05-04 16:06:26.438914112 -0600
> +++ arm/linux-syscalls0.S 2006-05-05 15:15:57.000000000 -0600
> @@ -0,0 +1,193 @@
> +/** Linux system call interface for the ARM processor.
> + * Written by Shaun Jackman <sjackman@gmail.com>.
> + * Copyright 2006 Pathway Connectivity
> + *
> + * Permission to use, copy, modify, and distribute this software
> + * is freely granted, provided that this notice is preserved.
> + */
> +
> +#include "linux-syscall.h"
> +
> +#if __thumb__
> +# define FUNC(name) .type name, %function; .thumb_func; name:
> +# define SET .thumb_set
> +#else
> +# define FUNC(name) .type name, %function; name:
> +# define SET .set
> +#endif
> +
> +#define GLOBAL(name) .global name; FUNC(name)
> +#define SIZE(name) .size name, .-name
> +
> +#if __thumb__
> +
> +# define SYSCALL0(name) \
> + GLOBAL(_ ## name); \
> + mov r3, r7; \
> + mov r7, #SYS_ ## name; \
> + swi; \
> + mov r7, r3; \
> + b _set_errno; \
> + SIZE(_ ## name)
> +
> +/* static int _syscall3(int a, int b, int c, int number); */
> +FUNC(_syscall3)
> + push { r7 }
> + mov r7, r3
> + swi
> + pop { r7 }
> + b _set_errno
> + SIZE(_syscall3)
> +
> +# define SYSCALL3(name) \
> + GLOBAL(_ ## name); \
> + mov r3, #SYS_ ## name; \
> + b _syscall3; \
> + SIZE(_ ## name)
> +
> +# define SYSCALL6(name) \
> + GLOBAL(_ ## name); \
> + push { r4 - r5, r7 }; \
> + ldr r4, [sp, #12]; \
> + ldr r5, [sp, #16]; \
> + mov r7, #SYS_ ## name; \
> + swi; \
> + pop { r4 - r5, r7 }; \
> + b _set_errno; \
> + SIZE(_ ## name)
> +
> +# define SYSCALL4(name) SYSCALL6(name)
> +
> +#else /* __thumb__ */
> +
> +# define SYSCALL4(name) \
> + GLOBAL(_ ## name); \
> + swi #SYS_ ## name; \
> + b _set_errno; \
> + SIZE(_ ## name)
> +
> +# define SYSCALL6(name) \
> + GLOBAL(_ ## name); \
> + push { r4 - r5 }; \
> + ldr r4, [sp, #8]; \
> + ldr r5, [sp, #12]; \
> + swi #SYS_ ## name; \
> + pop { r4 - r5 }; \
> + b _set_errno; \
> + SIZE(_ ## name)
> +
> +#define SYSCALL0(name) SYSCALL3(name)
> +#define SYSCALL3(name) SYSCALL4(name)
> +
> +#endif /* __thumb__ */
> +
> +#define SYSCALL1(name) SYSCALL3(name)
> +#define SYSCALL2(name) SYSCALL3(name)
> +#define SYSCALL5(name) SYSCALL6(name)
> +
> +SYSCALL1(alarm)
> +SYSCALL1(brk)
> +SYSCALL1(chdir)
> +SYSCALL2(chmod)
> +SYSCALL3(chown)
> +SYSCALL1(close)
> +SYSCALL1(dup)
> +SYSCALL2(dup2)
> +SYSCALL3(execve)
> +SYSCALL1(exit)
> +SYSCALL2(fstat)
> +SYSCALL3(getdents)
> +SYSCALL0(getpid)
> +SYSCALL2(gettimeofday)
> +SYSCALL3(ioctl)
> +SYSCALL2(kill)
> +SYSCALL2(link)
> +SYSCALL3(lseek)
> +SYSCALL2(lstat)
> +SYSCALL2(mkdir)
> +SYSCALL3(mknod)
> +SYSCALL2(nanosleep)
> +SYSCALL3(open)
> +SYSCALL3(read)
> +SYSCALL3(readlink)
> +SYSCALL1(rmdir)
> +SYSCALL5(select)
> +SYSCALL2(socketcall)
> +SYSCALL2(stat)
> +SYSCALL1(stime)
> +SYSCALL2(symlink)
> +SYSCALL1(sysinfo)
> +SYSCALL1(times)
> +SYSCALL2(truncate)
> +SYSCALL1(umask)
> +SYSCALL1(unlink)
> +SYSCALL2(utime)
> +SYSCALL0(vfork)
> +SYSCALL4(wait4)
> +SYSCALL3(write)
> +
> +#define ALIAS(name) .GLOBAL name; SET name, _ ## name
> +
> +ALIAS(alarm)
> +ALIAS(chdir)
> +ALIAS(chmod)
> +ALIAS(chown)
> +ALIAS(dup)
> +ALIAS(dup2)
> +ALIAS(getdents)
> +ALIAS(ioctl)
> +ALIAS(lstat)
> +ALIAS(mkdir)
> +ALIAS(mknod)
> +ALIAS(nanosleep)
> +ALIAS(readlink)
> +ALIAS(rmdir)
> +ALIAS(select)
> +ALIAS(stime)
> +ALIAS(symlink)
> +ALIAS(sysinfo)
> +ALIAS(truncate)
> +ALIAS(umask)
> +ALIAS(utime)
> +ALIAS(vfork)
> +ALIAS(wait4)
> +
> +# define SOCKETCALL(name, NAME) \
> + GLOBAL(name); \
> + push { r0 - r3 }; \
> + mov r0, #SYS_ ## NAME; \
> + b _socketcall_tail; \
> + SIZE(name)
> +
> +FUNC(_socketcall_tail)
> + mov r1, sp
> + push { lr }
> + bl _socketcall
> + pop { r3 }
> + add sp, #16
> + bx r3
> + SIZE(_socketcall_tail)
> +
> +#define SOCKETCALL2(name, NAME) SOCKETCALL(name, NAME)
> +#define SOCKETCALL3(name, NAME) SOCKETCALL(name, NAME)
> +#define SOCKETCALL4(name, NAME) SOCKETCALL(name, NAME)
> +#define SOCKETCALL5(name, NAME) SOCKETCALL(name, NAME)
> +#define SOCKETCALL6(name, NAME) SOCKETCALL(name, NAME)
> +
> +SOCKETCALL3(accept, ACCEPT)
> +SOCKETCALL3(bind, BIND)
> +SOCKETCALL3(connect, CONNECT)
> +SOCKETCALL3(getpeername, GETPEERNAME)
> +SOCKETCALL3(getsockname, GETSOCKNAME)
> +SOCKETCALL5(getsockopt, GETSOCKOPT)
> +SOCKETCALL2(listen, LISTEN)
> +SOCKETCALL4(recv, RECV)
> +SOCKETCALL6(recvfrom, RECVFROM)
> +SOCKETCALL3(recvmsg, RECVMSG)
> +SOCKETCALL4(send, SEND)
> +SOCKETCALL3(sendmsg, SENDMSG)
> +SOCKETCALL6(sendto, SENDTO)
> +SOCKETCALL5(setsockopt, SETSOCKOPT)
> +SOCKETCALL2(shutdown, SHUTDOWN)
> +SOCKETCALL3(socket, SOCKET)
> +SOCKETCALL4(socketpair, SOCKETPAIR)
> --- /dev/null 2006-05-04 16:06:26.438914112 -0600
> +++ arm/linux-syscalls1.c 2006-05-05 15:27:32.000000000 -0600
> @@ -0,0 +1,64 @@
> +/** Linux system call interface.
> + * Written by Shaun Jackman <sjackman@gmail.com>.
> + * Copyright 2006 Pathway Connectivity
> + *
> + * Permission to use, copy, modify, and distribute this software
> + * is freely granted, provided that this notice is preserved.
> + */
> +
> +#include <errno.h>
> +#include <stdint.h>
> +
> +extern char _end[];
> +static void *curbrk = _end;
> +
> +extern void *_brk(void *addr);
> +
> +int brk(void *addr)
> +{
> + void *newbrk;
> + if (curbrk == addr)
> + return 0;
> + newbrk = _brk(addr);
> + curbrk = newbrk;
> + if (newbrk < addr) {
> + errno = ENOMEM;
> + return -1;
> + }
> + return 0;
> +}
> +
> +void *_sbrk(intptr_t incr)
> +{
> + void *oldbrk = curbrk;
> + if (brk(oldbrk + incr) == -1)
> + return (void *)-1;
> + return oldbrk;
> +}
> +
> +void *sbrk(intptr_t incr) __attribute__((alias("_sbrk")));
> +
> +int _set_errno(int n)
> +{
> + if (n < 0) {
> + errno = -n;
> + return -1;
> + }
> + return n;
> +}
> +
> +#include <sys/wait.h>
> +
> +struct rusage;
> +
> +pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
> +
> +pid_t wait(int *status)
> +{
> + return wait4(-1, status, 0, NULL);
> +}
> +
> +pid_t waitpid(pid_t pid, int *status, int options)
> +{
> + return wait4(pid, status, options, NULL);
> +}
More information about the Newlib
mailing list