Use generic syscall header thus the port is no longer compatible to the old libc. Additionally, remove the duplicated syscall table from entry.S. The table is now generated from the (generic) unistd.h.
TODO: signals Signed-off-by: Michael Walle <mich...@walle.cc> Conflicts: arch/lm32/include/asm/stat.h arch/lm32/kernel/Makefile arch/lm32/kernel/entry.S --- arch/lm32/include/asm/stat.h | 73 +------- arch/lm32/include/asm/syscalls.h | 1 + arch/lm32/include/asm/ucontext.h | 1 + arch/lm32/include/asm/unistd.h | 422 +------------------------------------ arch/lm32/kernel/Makefile | 3 +- arch/lm32/kernel/entry.S | 369 +------------------------------- arch/lm32/kernel/signal.c | 30 ++- arch/lm32/kernel/sys_call_table.c | 12 + arch/lm32/kernel/sys_lm32.c | 104 ++-------- 9 files changed, 70 insertions(+), 945 deletions(-) create mode 100644 arch/lm32/include/asm/syscalls.h create mode 100644 arch/lm32/include/asm/ucontext.h create mode 100644 arch/lm32/kernel/sys_call_table.c diff --git a/arch/lm32/include/asm/stat.h b/arch/lm32/include/asm/stat.h index 8aa73a9..3dc90fa 100644 --- a/arch/lm32/include/asm/stat.h +++ b/arch/lm32/include/asm/stat.h @@ -1,72 +1 @@ -/* - * Based on: - * include/asm-m68k/stat.h - */ - -#ifndef _LM32_ASM_STAT_H -#define _LM32_ASM_STAT_H - -; - -/* TODO: Change ABI and use asm-generic */ - -struct stat { - unsigned short st_dev; - unsigned short __pad1; - unsigned long st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - unsigned short __pad2; - unsigned long st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime; - unsigned long __unused1; - unsigned long st_mtime; - unsigned long __unused2; - unsigned long st_ctime; - unsigned long __unused3; - unsigned long __unused4; - unsigned long __unused5; -}; - -/* This matches struct stat64 in glibc2.1, hence the absolutely - * insane amounts of padding around dev_t's. - */ -struct stat64 { - unsigned long long st_dev; - unsigned char __pad1[4]; - -#define STAT64_HAS_BROKEN_ST_INO 1 - unsigned long __st_ino; - - unsigned int st_mode; - unsigned int st_nlink; - - unsigned long st_uid; - unsigned long st_gid; - - unsigned long long st_rdev; - unsigned char __pad3[4]; - - long long st_size; - unsigned long st_blksize; - - unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ - - unsigned long st_atime; - unsigned long st_atime_nsec; - - unsigned long st_mtime; - unsigned long st_mtime_nsec; - - unsigned long st_ctime; - unsigned long st_ctime_nsec; - - unsigned long long st_ino; -}; - -#endif /* _LM32_ASM_STAT_H */ +#include <asm-generic/stat.h> diff --git a/arch/lm32/include/asm/syscalls.h b/arch/lm32/include/asm/syscalls.h new file mode 100644 index 0000000..8f1cb00 --- /dev/null +++ b/arch/lm32/include/asm/syscalls.h @@ -0,0 +1 @@ +#include <asm-generic/syscalls.h> diff --git a/arch/lm32/include/asm/ucontext.h b/arch/lm32/include/asm/ucontext.h new file mode 100644 index 0000000..9bc07b9 --- /dev/null +++ b/arch/lm32/include/asm/ucontext.h @@ -0,0 +1 @@ +#include <asm-generic/ucontext.h> diff --git a/arch/lm32/include/asm/unistd.h b/arch/lm32/include/asm/unistd.h index 5fa6b12..bd51295 100644 --- a/arch/lm32/include/asm/unistd.h +++ b/arch/lm32/include/asm/unistd.h @@ -1,417 +1,11 @@ -/* - * (C) Copyright 2007 - * Theobroma Systems <www.theobroma-systems.com> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ +#if !defined(_ASM_LM32_UNISTD_H) || defined(__SYSCALL) +#define _ASM_LM32_UNISTD_H -#ifndef __ASM_LM32_UNISTD_H -#define __ASM_LM32_UNISTD_H +#define __ARCH_WANT_SYSCALL_NO_AT +#define __ARCH_WANT_SYSCALL_NO_FLAGS +#define __ARCH_WANT_SYSCALL_OFF_T +#define __ARCH_WANT_SYSCALL_DEPRECATED -#define __NR_SYSCALL_BASE 0 +#include <asm-generic/unistd.h> -/* - * This file contains the system call numbers. - */ - -#define __NR_exit 1 -#define __NR_fork 2 -#define __NR_read 3 -#define __NR_write 4 -#define __NR_open 5 -#define __NR_close 6 - /* 7 __NR_waitpid obsolete */ -#define __NR_creat 8 -#define __NR_link 9 -#define __NR_unlink 10 -#define __NR_execve 11 -#define __NR_chdir 12 -#define __NR_time 13 -#define __NR_mknod 14 -#define __NR_chmod 15 -#define __NR_chown 16 - /* 17 __NR_break obsolete */ - /* 18 __NR_oldstat obsolete */ -#define __NR_lseek 19 -#define __NR_getpid 20 -#define __NR_mount 21 - /* 22 __NR_umount obsolete */ -#define __NR_setuid 23 -#define __NR_getuid 24 -#define __NR_stime 25 -#define __NR_ptrace 26 -#define __NR_alarm 27 - /* 28 __NR_oldfstat obsolete */ -#define __NR_pause 29 - /* 30 __NR_utime obsolete */ - /* 31 __NR_stty obsolete */ - /* 32 __NR_gtty obsolete */ -#define __NR_access 33 -#define __NR_nice 34 - /* 35 __NR_ftime obsolete */ -#define __NR_sync 36 -#define __NR_kill 37 -#define __NR_rename 38 -#define __NR_mkdir 39 -#define __NR_rmdir 40 -#define __NR_dup 41 -#define __NR_pipe 42 -#define __NR_times 43 - /* 44 __NR_prof obsolete */ -#define __NR_brk 45 -#define __NR_setgid 46 -#define __NR_getgid 47 - /* 48 __NR_signal obsolete */ -#define __NR_geteuid 49 -#define __NR_getegid 50 -#define __NR_acct 51 -#define __NR_umount2 52 - /* 53 __NR_lock obsolete */ -#define __NR_ioctl 54 -#define __NR_fcntl 55 - /* 56 __NR_mpx obsolete */ -#define __NR_setpgid 57 - /* 58 __NR_ulimit obsolete */ - /* 59 __NR_oldolduname obsolete */ -#define __NR_umask 60 -#define __NR_chroot 61 -#define __NR_ustat 62 -#define __NR_dup2 63 -#define __NR_getppid 64 -#define __NR_getpgrp 65 -#define __NR_setsid 66 - /* 67 __NR_sigaction obsolete */ -#define __NR_sgetmask 68 -#define __NR_ssetmask 69 -#define __NR_setreuid 70 -#define __NR_setregid 71 - /* 72 __NR_sigsuspend obsolete */ - /* 73 __NR_sigpending obsolete */ -#define __NR_sethostname 74 -#define __NR_setrlimit 75 - /* 76 __NR_old_getrlimit obsolete */ -#define __NR_getrusage 77 -#define __NR_gettimeofday 78 -#define __NR_settimeofday 79 -#define __NR_getgroups 80 -#define __NR_setgroups 81 - /* 82 __NR_select obsolete */ -#define __NR_symlink 83 - /* 84 __NR_oldlstat obsolete */ -#define __NR_readlink 85 - /* 86 __NR_uselib obsolete */ -#define __NR_swapon 87 /* obsolete but needed by generic allocator */ -#define __NR_reboot 88 - /* 89 __NR_readdir obsolete */ - /* 90 __NR_mmap obsolete */ -#define __NR_munmap 91 -#define __NR_truncate 92 -#define __NR_ftruncate 93 -#define __NR_fchmod 94 -#define __NR_fchown 95 -#define __NR_getpriority 96 -#define __NR_setpriority 97 - /* 98 __NR_profil obsolete */ -#define __NR_statfs 99 -#define __NR_fstatfs 100 - /* 101 __NR_ioperm */ - /* 102 __NR_socketcall obsolete */ -#define __NR_syslog 103 -#define __NR_setitimer 104 -#define __NR_getitimer 105 -#define __NR_stat 106 -#define __NR_lstat 107 -#define __NR_fstat 108 - /* 109 __NR_olduname obsolete */ - /* 110 __NR_iopl obsolete */ -#define __NR_vhangup 111 - /* 112 __NR_idle obsolete */ - /* 113 __NR_vm86old */ -#define __NR_wait4 114 - /* 115 __NR_swapoff obsolete */ -#define __NR_sysinfo 116 - /* 117 __NR_ipc oboslete */ -#define __NR_fsync 118 -#define __NR_sigreturn 119 -#define __NR_clone 120 -#define __NR_setdomainname 121 -#define __NR_uname 122 - /* 123 __NR_modify_ldt obsolete */ -#define __NR_adjtimex 124 -#define __NR_mprotect 125 - /* 126 __NR_sigprocmask obsolete */ - /* 127 __NR_create_module obsolete */ -#define __NR_init_module 128 -#define __NR_delete_module 129 - /* 130 __NR_get_kernel_syms obsolete */ -#define __NR_quotactl 131 -#define __NR_getpgid 132 -#define __NR_fchdir 133 -#define __NR_bdflush 134 - /* 135 was sysfs */ -#define __NR_personality 136 - /* 137 __NR_afs_syscall */ -#define __NR_setfsuid 138 -#define __NR_setfsgid 139 -#define __NR__llseek 140 -#define __NR_getdents 141 -#define __NR__newselect 142 -#define __NR_flock 143 - /* 144 __NR_msync obsolete */ -#define __NR_readv 145 -#define __NR_writev 146 -#define __NR_getsid 147 -#define __NR_fdatasync 148 -#define __NR__sysctl 149 - /* 150 __NR_mlock */ - /* 151 __NR_munlock */ - /* 152 __NR_mlockall */ - /* 153 __NR_munlockall */ -#define __NR_sched_setparam 154 -#define __NR_sched_getparam 155 -#define __NR_sched_setscheduler 156 -#define __NR_sched_getscheduler 157 -#define __NR_sched_yield 158 -#define __NR_sched_get_priority_max 159 -#define __NR_sched_get_priority_min 160 -#define __NR_sched_rr_get_interval 161 -#define __NR_nanosleep 162 - /* 163 __NR_mremap */ -#define __NR_setresuid 164 -#define __NR_getresuid 165 - /* 166 __NR_vm86 */ - /* 167 __NR_query_module */ - /* 168 __NR_poll */ - /* 169 __NR_nfsservctl */ -#define __NR_setresgid 170 -#define __NR_getresgid 171 -#define __NR_prctl 172 -#define __NR_rt_sigreturn 173 -#define __NR_rt_sigaction 174 -#define __NR_rt_sigprocmask 175 -#define __NR_rt_sigpending 176 -#define __NR_rt_sigtimedwait 177 -#define __NR_rt_sigqueueinfo 178 -#define __NR_rt_sigsuspend 179 -#define __NR_pread 180 -#define __NR_pwrite 181 -#define __NR_lchown 182 -#define __NR_getcwd 183 -#define __NR_capget 184 -#define __NR_capset 185 -#define __NR_sigaltstack 186 -#define __NR_sendfile 187 - /* 188 __NR_getpmsg */ - /* 189 __NR_putpmsg */ -#define __NR_vfork 190 -#define __NR_getrlimit 191 -#define __NR_mmap2 192 -#define __NR_truncate64 193 -#define __NR_ftruncate64 194 -#define __NR_stat64 195 -#define __NR_lstat64 196 -#define __NR_fstat64 197 -#define __NR_chown32 198 -#define __NR_getuid32 199 -#define __NR_getgid32 200 -#define __NR_geteuid32 201 -#define __NR_getegid32 202 -#define __NR_setreuid32 203 -#define __NR_setregid32 204 -#define __NR_getgroups32 205 -#define __NR_setgroups32 206 -#define __NR_fchown32 207 -#define __NR_setresuid32 208 -#define __NR_getresuid32 209 -#define __NR_setresgid32 210 -#define __NR_getresgid32 211 -#define __NR_lchown32 212 -#define __NR_setuid32 213 -#define __NR_setgid32 214 -#define __NR_setfsuid32 215 -#define __NR_setfsgid32 216 -#define __NR_pivot_root 217 - /* 218 __NR_mincore */ - /* 219 __NR_madvise */ -#define __NR_getdents64 220 -#define __NR_fcntl64 221 - /* 222 reserved for TUX */ - /* 223 reserved for TUX */ -#define __NR_gettid 224 - /* 225 __NR_readahead */ -#define __NR_setxattr 226 -#define __NR_lsetxattr 227 -#define __NR_fsetxattr 228 -#define __NR_getxattr 229 -#define __NR_lgetxattr 230 -#define __NR_fgetxattr 231 -#define __NR_listxattr 232 -#define __NR_llistxattr 233 -#define __NR_flistxattr 234 -#define __NR_removexattr 235 -#define __NR_lremovexattr 236 -#define __NR_fremovexattr 237 -#define __NR_tkill 238 -#define __NR_sendfile64 239 -#define __NR_futex 240 -#define __NR_sched_setaffinity 241 -#define __NR_sched_getaffinity 242 - /* 243 __NR_set_thread_area */ - /* 244 __NR_get_thread_area */ -#define __NR_io_setup 245 -#define __NR_io_destroy 246 -#define __NR_io_getevents 247 -#define __NR_io_submit 248 -#define __NR_io_cancel 249 - /* 250 __NR_alloc_hugepages */ - /* 251 __NR_free_hugepages */ -#define __NR_exit_group 252 -#define __NR_lookup_dcookie 253 - /* 254 spinlock (on bfin) */ -#define __NR_epoll_create 255 -#define __NR_epoll_ctl 256 -#define __NR_epoll_wait 257 - /* 258 __NR_remap_file_pages */ -#define __NR_set_tid_address 259 -#define __NR_timer_create 260 -#define __NR_timer_settime (__NR_timer_create+1) -#define __NR_timer_gettime (__NR_timer_create+2) -#define __NR_timer_getoverrun (__NR_timer_create+3) -#define __NR_timer_delete (__NR_timer_create+4) -#define __NR_clock_settime (__NR_timer_create+5) -#define __NR_clock_gettime (__NR_timer_create+6) -#define __NR_clock_getres (__NR_timer_create+7) -#define __NR_clock_nanosleep (__NR_timer_create+8) -#define __NR_statfs64 269 -#define __NR_fstatfs64 270 -#define __NR_tgkill 271 -#define __NR_utimes 272 -#define __NR_fadvise64_64 273 - /* 274 __NR_vserver */ - /* 275 __NR_mbind */ - /* 276 __NR_get_mempolicy */ - /* 277 __NR_set_mempolicy */ -#define __NR_mq_open 278 -#define __NR_mq_unlink (__NR_mq_open+1) -#define __NR_mq_timedsend (__NR_mq_open+2) -#define __NR_mq_timedreceive (__NR_mq_open+3) -#define __NR_mq_notify (__NR_mq_open+4) -#define __NR_mq_getsetattr (__NR_mq_open+5) - /* 284 __NR_sys_kexec_load */ -#define __NR_waitid 285 -#define __NR_add_key 286 -#define __NR_request_key 287 -#define __NR_keyctl 288 -#define __NR_ioprio_set 289 -#define __NR_ioprio_get 290 -#define __NR_inotify_init 291 -#define __NR_inotify_add_watch 292 -#define __NR_inotify_rm_watch 293 - /* 294 __NR_migrate_pages */ -#define __NR_openat 295 -#define __NR_mkdirat 296 -#define __NR_mknodat 297 -#define __NR_fchownat 298 -#define __NR_futimesat 299 -#define __NR_fstatat64 300 -#define __NR_unlinkat 301 -#define __NR_renameat 302 -#define __NR_linkat 303 -#define __NR_symlinkat 304 -#define __NR_readlinkat 305 -#define __NR_fchmodat 306 -#define __NR_faccessat 307 -#define __NR_pselect6 308 -#define __NR_ppoll 309 -#define __NR_unshare 310 - -/* private syscalls (not implemented) */ -#define __NR_sram_alloc 311 -#define __NR_sram_free 312 -#define __NR_dma_memcpy 313 - -/* socket syscalls */ -#define __NR_accept 314 -#define __NR_bind 315 -#define __NR_connect 316 -#define __NR_getpeername 317 -#define __NR_getsockname 318 -#define __NR_getsockopt 319 -#define __NR_listen 320 -#define __NR_recv 321 -#define __NR_recvfrom 322 -#define __NR_recvmsg 323 -#define __NR_send 324 -#define __NR_sendmsg 325 -#define __NR_sendto 326 -#define __NR_setsockopt 327 -#define __NR_shutdown 328 -#define __NR_socket 329 -#define __NR_socketpair 330 - -#define __NR_splice 331 -#define __NR_sync_file_range2 332 -#define __NR_tee 333 -#define __NR_vmsplice 334 -#define __NR_getcpu 335 - -/* sysv ipc syscalls */ -#define __NR_semctl 336 -#define __NR_semget 337 -#define __NR_semop 338 -#define __NR_msgctl 339 -#define __NR_msgget 340 -#define __NR_msgrcv 341 -#define __NR_msgsnd 342 -#define __NR_shmat 343 -#define __NR_shmctl 344 -#define __NR_shmdt 345 -#define __NR_shmget 346 - -#define __NR_syscall 347 -#define NR_syscalls __NR_syscall - -#ifdef __KERNEL__ -#define __ARCH_WANT_IPC_PARSE_VERSION -#define __ARCH_WANT_STAT64 -#define __ARCH_WANT_SYS_ALARM -#define __ARCH_WANT_SYS_GETHOSTNAME -#define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_SYS_FADVISE64 -#define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_NICE -#define __ARCH_WANT_SYS_SIGPENDING -#define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_SIGNAL - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t_" #x "\n\t.set\t_" #x ",_sys_ni_syscall"); - -#endif /* __KERNEL__ */ - -#endif +#endif /* _ASM_LM32_UNISTD_H */ diff --git a/arch/lm32/kernel/Makefile b/arch/lm32/kernel/Makefile index 2ace8b0..457db15 100644 --- a/arch/lm32/kernel/Makefile +++ b/arch/lm32/kernel/Makefile @@ -3,11 +3,10 @@ # extra-y := head.o init_task.o vmlinux.lds - obj-y := \ sys_lm32.o setup.o traps.o signal.o time.o \ ptrace.o irq.o process.o entry.o dma.o gpio.o \ - flat.o + flat.o sys_call_table.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_MODULES) += module.o diff --git a/arch/lm32/kernel/entry.S b/arch/lm32/kernel/entry.S index f957def..3bd1b56 100644 --- a/arch/lm32/kernel/entry.S +++ b/arch/lm32/kernel/entry.S @@ -139,6 +139,7 @@ ENTRY(system_call) /* r7 always holds the pointer to struct pt_regs */ addi r7, sp, 4 + #addi r4, sp, 4 #ifdef LM32_DEBUG_SYSCALL_CALL /* call debug */ @@ -160,10 +161,10 @@ ENTRY(system_call) /* r8 always holds the syscall number */ /* check if syscall number is valid */ - mvi r9, __NR_syscall + mvi r9, __NR_syscalls bgeu r8, r9, .badsyscall - mvhi r9, hi(_sys_call_table) /* load address of syscall table */ - ori r9, r9, lo(_sys_call_table) + mvhi r9, hi(sys_call_table) /* load address of syscall table */ + ori r9, r9, lo(sys_call_table) sli r10, r8, 2 /* TODO: only works with shifter enabled */ add r9, r9, r10 /* add offset of syscall no to address */ lw r9, (r9+0) /* fetch address of syscall function */ @@ -179,7 +180,6 @@ ENTRY(system_call) /* debug syscall return value */ lw r2, (sp+36) /* get saved syscall no from sp+36 for debug */ addi r3, sp, 4 - calli lm32_debug_syscall_ret /* debug */ #endif bi _restore_and_return_exception @@ -189,7 +189,6 @@ ENTRY(system_call) mvi r1, -ENOSYS mv r2, r8 addi r3, sp, 4 - calli lm32_debug_syscall_ret #endif mvi r1, -ENOSYS @@ -292,17 +291,9 @@ ENTRY(sys_fork) mvi r0, -EINVAL ret -ENTRY(sys_execve_wrapper) - /* save ra to stack */ - addi sp,sp,-4 - sw (sp+4), ra - /* store regs into 4th argument */ +ENTRY(sys_execve) mv r4, r7 - calli sys_execve - /* load ra from stack */ - lw ra, (sp+4) - addi sp,sp,4 - ret + bi lm32_execve ENTRY(sys_rt_sigsuspend_wrapper) /* save ra to kernel stack */ @@ -316,7 +307,7 @@ ENTRY(sys_rt_sigsuspend_wrapper) addi sp,sp,4 ret -ENTRY(sys_vfork_wrapper) +ENTRY(sys_vfork) /* save ra to kernel stack */ addi sp,sp,-4 sw (sp+4), ra @@ -331,7 +322,7 @@ ENTRY(sys_vfork_wrapper) ret /* purpose of this wrapper: put struct pt_regs* into first argument */ -ENTRY(sys_sigreturn_wrapper) +ENTRY(sys_sigreturn) /* save ra to stack */ addi sp,sp,-4 sw (sp+4), ra @@ -343,7 +334,7 @@ ENTRY(sys_sigreturn_wrapper) addi sp,sp,4 ret -ENTRY(sys_clone_wrapper) +ENTRY(sys_clone) /* save ra to stack */ addi sp,sp,-4 sw (sp+4), ra @@ -670,345 +661,3 @@ ENTRY(resume) lw sp, (sp+116) ret - -.align 4 -ENTRY(_sys_call_table) - .long sys_ni_syscall /* 0 - old "setup()" system call*/ - .long sys_exit - .long sys_fork - .long sys_read - .long sys_write - .long sys_open /* 5 */ - .long sys_close - .long sys_ni_syscall /* old waitpid */ - .long sys_creat - .long sys_link - .long sys_unlink /* 10 */ - .long sys_execve_wrapper - .long sys_chdir - .long sys_time - .long sys_mknod - .long sys_chmod /* 15 */ - .long sys_chown /* chown16 */ - .long sys_ni_syscall /* old break syscall holder */ - .long sys_ni_syscall /* old stat */ - .long sys_lseek - .long sys_getpid /* 20 */ - .long sys_mount - .long sys_ni_syscall /* old umount */ - .long sys_setuid - .long sys_getuid - .long sys_stime /* 25 */ - .long sys_ptrace - .long sys_alarm - .long sys_ni_syscall /* old fstat */ - .long sys_pause - .long sys_ni_syscall /* old utime */ /* 30 */ - .long sys_ni_syscall /* old stty syscall holder */ - .long sys_ni_syscall /* old gtty syscall holder */ - .long sys_access - .long sys_nice - .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */ - .long sys_sync - .long sys_kill - .long sys_rename - .long sys_mkdir - .long sys_rmdir /* 40 */ - .long sys_dup - .long sys_pipe - .long sys_times - .long sys_ni_syscall /* old prof syscall holder */ - .long sys_brk /* 45 */ - .long sys_setgid - .long sys_getgid - .long sys_signal - .long sys_geteuid /* geteuid16 */ - .long sys_getegid /* getegid16 */ /* 50 */ - .long sys_ni_syscall /* sys_acct */ - .long sys_umount /* recycled never used phys() */ - .long sys_ni_syscall /* old lock syscall holder */ - .long sys_ioctl - .long sys_fcntl /* 55 */ - .long sys_ni_syscall /* old mpx syscall holder */ - .long sys_setpgid - .long sys_ni_syscall /* old ulimit syscall holder */ - .long sys_ni_syscall /* old old uname */ - .long sys_umask /* 60 */ - .long sys_chroot - .long sys_ustat - .long sys_dup2 - .long sys_getppid - .long sys_getpgrp /* 65 */ - .long sys_setsid - .long sys_sigaction - .long sys_sgetmask - .long sys_ssetmask - .long sys_setreuid /* setreuid16 */ /* 70 */ - .long sys_setregid /* setregid16 */ - .long sys_ni_syscall /* old sys_sigsuspend */ - .long sys_sigpending - .long sys_sethostname - .long sys_setrlimit /* 75 */ - .long sys_ni_syscall /* old getrlimit */ - .long sys_getrusage - .long sys_gettimeofday - .long sys_settimeofday - .long sys_getgroups /* getgroups16 */ /* 80 */ - .long sys_setgroups /* setgroups16 */ - .long sys_select /* backwards compatibility */ - .long sys_symlink - .long sys_ni_syscall /* old lstat */ - .long sys_readlink /* 85 */ - .long sys_uselib - .long sys_ni_syscall /* sys_swapon */ - .long sys_reboot - .long sys_ni_syscall /* old_readdir */ - .long sys_ni_syscall /* sys_mmap */ /* 90 */ - .long sys_munmap - .long sys_truncate - .long sys_ftruncate - .long sys_fchmod - .long sys_fchown /* fchown16 */ /* 95 */ - .long sys_getpriority - .long sys_setpriority - .long sys_ni_syscall /* old profil syscall holder */ - .long sys_statfs - .long sys_fstatfs /* 100 */ - .long sys_ni_syscall - .long sys_ni_syscall /* old sys_socketcall */ - .long sys_syslog - .long sys_setitimer - .long sys_getitimer /* 105 */ - .long sys_newstat - .long sys_newlstat - .long sys_newfstat - .long sys_ni_syscall /* old uname */ - .long sys_ni_syscall /* iopl for i386 */ /* 110 */ - .long sys_vhangup - .long sys_ni_syscall /* obsolete idle() syscall */ - .long sys_ni_syscall /* vm86old for i386 */ - .long sys_wait4 - .long sys_ni_syscall /* 115 */ /* sys_swapoff */ - .long sys_sysinfo - .long sys_ni_syscall /* old sys_ipc */ - .long sys_fsync - .long sys_sigreturn_wrapper - .long sys_clone_wrapper /* 120 */ - .long sys_setdomainname - .long sys_newuname - .long sys_ni_syscall /* old sys_modify_ldt */ - .long sys_adjtimex - .long sys_ni_syscall /* 125 */ /* sys_mprotect */ - .long sys_ni_syscall /* old sys_sigprocmask */ - .long sys_ni_syscall /* old "creat_module" */ - .long sys_init_module - .long sys_delete_module - .long sys_ni_syscall /* 130: old "get_kernel_syms" */ - .long sys_ni_syscall /* sys_quotactl */ - .long sys_getpgid - .long sys_fchdir - .long sys_bdflush - .long sys_ni_syscall /* 135 */ /* sys_sysfs */ - .long sys_personality - .long sys_ni_syscall /* for afs_syscall */ - .long sys_setfsuid /* setfsuid16 */ - .long sys_setfsgid /* setfsgid16 */ - .long sys_llseek /* 140 */ - .long sys_getdents - .long sys_select /* backwards compatibility */ - .long sys_flock - .long sys_ni_syscall /* sys_msync */ - .long sys_readv /* 145 */ - .long sys_writev - .long sys_getsid - .long sys_fdatasync - .long sys_sysctl - .long sys_ni_syscall /* 150 */ /* sys_mlock */ - .long sys_ni_syscall /* sys_munlock */ - .long sys_ni_syscall /* sys_mlockall */ - .long sys_ni_syscall /* sys_munlockall */ - .long sys_sched_setparam - .long sys_sched_getparam /* 155 */ - .long sys_sched_setscheduler - .long sys_sched_getscheduler - .long sys_sched_yield - .long sys_sched_get_priority_max - .long sys_sched_get_priority_min /* 160 */ - .long sys_sched_rr_get_interval - .long sys_nanosleep - .long sys_ni_syscall /* sys_mremap */ - .long sys_setresuid /* setresuid16 */ - .long sys_getresuid /* getresuid16 */ /* 165 */ - .long sys_ni_syscall /* for vm86 */ - .long sys_ni_syscall /* old "query_module" */ - .long sys_poll /* sys_poll */ - .long sys_ni_syscall /* sys_nfsservctl */ - .long sys_setresgid /* setresgid16 */ /* 170 */ - .long sys_getresgid /* getresgid16 */ - .long sys_prctl - .long sys_ni_syscall /* sys_rt_sigreturn */ - .long sys_rt_sigaction - .long sys_rt_sigprocmask /* 175 */ - .long sys_rt_sigpending - .long sys_rt_sigtimedwait - .long sys_rt_sigqueueinfo - .long sys_rt_sigsuspend_wrapper - .long sys_pread64 /* 180 */ - .long sys_pwrite64 - .long sys_lchown /* lchown16 */ - .long sys_getcwd - .long sys_capget - .long sys_capset /* 185 */ - .long sys_sigaltstack - .long sys_sendfile - .long sys_ni_syscall /* streams1 */ - .long sys_ni_syscall /* streams2 */ - .long sys_vfork_wrapper /* 190 */ - .long sys_getrlimit - .long sys_mmap2 - .long sys_truncate64 - .long sys_ftruncate64 - .long sys_stat64 /* 195 */ - .long sys_lstat64 - .long sys_fstat64 - .long sys_chown - .long sys_getuid - .long sys_getgid /* 200 */ - .long sys_geteuid - .long sys_getegid - .long sys_setreuid - .long sys_setregid - .long sys_getgroups /* 205 */ - .long sys_setgroups - .long sys_fchown - .long sys_setresuid - .long sys_getresuid - .long sys_setresgid /* 210 */ - .long sys_getresgid - .long sys_lchown - .long sys_setuid - .long sys_setgid - .long sys_setfsuid /* 215 */ - .long sys_setfsgid - .long sys_pivot_root - .long sys_ni_syscall /* sys_mincore */ - .long sys_ni_syscall /* sys_madvise */ - .long sys_getdents64 /* 220 */ - .long sys_fcntl64 - .long sys_ni_syscall /* reserved for TUX */ - .long sys_ni_syscall - .long sys_gettid - .long sys_ni_syscall /* 225 */ /* sys_readahead */ - .long sys_setxattr - .long sys_lsetxattr - .long sys_fsetxattr - .long sys_getxattr - .long sys_lgetxattr /* 230 */ - .long sys_fgetxattr - .long sys_listxattr - .long sys_llistxattr - .long sys_flistxattr - .long sys_removexattr /* 235 */ - .long sys_lremovexattr - .long sys_fremovexattr - .long sys_tkill - .long sys_sendfile64 - .long sys_futex /* 240 */ - .long sys_sched_setaffinity - .long sys_sched_getaffinity - .long sys_ni_syscall /* sys_set_thread_area */ - .long sys_ni_syscall /* sys_get_thread_area */ - .long sys_io_setup /* 245 */ - .long sys_io_destroy - .long sys_io_getevents - .long sys_io_submit - .long sys_io_cancel - .long sys_ni_syscall /* 250 */ /* sys_alloc_hugepages */ - .long sys_ni_syscall /* sys_freec_hugepages */ - .long sys_exit_group - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_ni_syscall /* 255 */ - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_ni_syscall /* remap_file_pages */ - .long sys_set_tid_address - .long sys_timer_create /* 260 */ - .long sys_timer_settime - .long sys_timer_gettime - .long sys_timer_getoverrun - .long sys_timer_delete - .long sys_clock_settime /* 265 */ - .long sys_clock_gettime - .long sys_clock_getres - .long sys_clock_nanosleep - .long sys_statfs64 - .long sys_fstatfs64 /* 270 */ - .long sys_tgkill - .long sys_utimes - .long sys_fadvise64_64 - .long sys_ni_syscall /* vserver */ - .long sys_ni_syscall /* 275, mbind */ - .long sys_ni_syscall /* get_mempolicy */ - .long sys_ni_syscall /* set_mempolicy */ - .long sys_ni_syscall /* mq */ - .long sys_ni_syscall /* mq */ - .long sys_ni_syscall /* 280 */ /* mq */ - .long sys_ni_syscall /* mq */ - .long sys_ni_syscall /* mq */ - .long sys_ni_syscall /* mq */ - .long sys_ni_syscall /* kexec_load */ - .long sys_waitid /* 285 */ - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_ioprio_set - .long sys_ioprio_get /* 290 */ - .long sys_ni_syscall /* inotify */ - .long sys_ni_syscall /* inotify */ - .long sys_ni_syscall /* inotify */ - .long sys_ni_syscall /* migrate_pages */ - .long sys_openat /* 295 */ - .long sys_mkdirat - .long sys_mknodat - .long sys_fchownat - .long sys_futimesat - .long sys_fstatat64 /* 300 */ - .long sys_unlinkat - .long sys_renameat - .long sys_linkat - .long sys_symlinkat - .long sys_readlinkat /* 305 */ - .long sys_fchmodat - .long sys_faccessat - .long sys_ni_syscall /* sys_pselect6 */ - .long sys_ppoll /* sys_ppoll */ - .long sys_unshare /* 310 */ - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_ni_syscall - .long sys_accept - .long sys_bind /* 315 */ - .long sys_connect - .long sys_getpeername - .long sys_getsockname - .long sys_getsockopt - .long sys_listen /* 320 */ - .long sys_recv - .long sys_recvfrom - .long sys_recvmsg - .long sys_send - .long sys_sendmsg /* 325 */ - .long sys_sendto - .long sys_setsockopt - .long sys_shutdown - .long sys_socket - .long sys_socketpair /* 330 */ - .long sys_splice - .long sys_sync_file_range2 - .long sys_tee - .long sys_vmsplice - .long sys_getcpu /* 335 */ - .rept NR_syscalls-(.-_sys_call_table)/4 - .long sys_ni_syscall - .endr diff --git a/arch/lm32/kernel/signal.c b/arch/lm32/kernel/signal.c index fd81c5a..42c943b 100644 --- a/arch/lm32/kernel/signal.c +++ b/arch/lm32/kernel/signal.c @@ -51,6 +51,7 @@ #include <linux/hardirq.h> #include <asm/uaccess.h> +#include <asm/ucontext.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> #include <asm/thread_info.h> @@ -68,6 +69,7 @@ int do_signal(int retval, struct pt_regs *regs, int* handled); * Atomically swap in the new signal mask, and wait for a signal. */ +#ifdef MW_UNDEFINED asmlinkage int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs) { @@ -94,6 +96,7 @@ sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs) return -EINTR; } } +#endif asmlinkage int sys_sigaction(int sig, const struct old_sigaction *act, @@ -145,12 +148,18 @@ struct sigframe unsigned long tramp[2]; /* signal trampoline */ }; -static int -restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *rval_p) +struct rt_sigframe { + struct siginfo info; + struct ucontext uc; + unsigned long tramp[2]; /* signal trampoline */ +}; + +static int restore_sigcontext(struct pt_regs *regs, + struct sigcontext __user *sc, int *rval_p) { unsigned int err = 0; -#define COPY(x) err |= __get_user(regs->x, &sc->regs.x) +#define COPY(x) {err |= __get_user(regs->x, &sc->regs.x); } COPY(r0); COPY(r1); COPY(r2); COPY(r3); COPY(r4); COPY(r5); COPY(r6); COPY(r7); COPY(r8); COPY(r9); COPY(r10); COPY(r11); @@ -166,9 +175,11 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *rval_p) return err; } -asmlinkage int sys_sigreturn(struct pt_regs *regs) +asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) { - struct sigframe *frame = (struct sigframe *)(current->thread.usp+4); +#if 0 + struct rt_sigframe __user *frame = + (struct rt_sigframe __user *)(current->thread.usp+4); sigset_t set; int rval = 0; @@ -198,6 +209,7 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs) badframe: force_sig(SIGSEGV, current); +#endif return 0; } @@ -210,7 +222,7 @@ setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, { int err = 0; -#define COPY(x) err |= __put_user(regs->x, &sc->regs.x) +#define COPY(x) {err |= __put_user(regs->x, &sc->regs.x); } COPY(r0); COPY(r1); COPY(r2); COPY(r3); COPY(r4); COPY(r5); COPY(r6); COPY(r7); COPY(r8); COPY(r9); COPY(r10); COPY(r11); @@ -229,7 +241,7 @@ setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, /* * Determine which stack to use.. */ -static inline void * +static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) { /* Per default use user stack of userspace process */ @@ -239,7 +251,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) /* use stack set by sigaltstack */ sp = current->sas_ss_sp + current->sas_ss_size; - return (void *)((sp - frame_size) & -8UL); + return (void __user *)((sp - frame_size) & -8UL); } static int setup_frame(int sig, struct k_sigaction *ka, @@ -271,7 +283,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, /* Set up to return from userspace. */ /* mvi r8, __NR_sigreturn = addi r8, r0, __NR_sigreturn */ - err |= __put_user(0x34080000 | __NR_sigreturn, &frame->tramp[0]); + err |= __put_user(0x34080000 | __NR_rt_sigreturn, &frame->tramp[0]); /* scall */ err |= __put_user(0xac000007, &frame->tramp[1]); diff --git a/arch/lm32/kernel/sys_call_table.c b/arch/lm32/kernel/sys_call_table.c new file mode 100644 index 0000000..287369b --- /dev/null +++ b/arch/lm32/kernel/sys_call_table.c @@ -0,0 +1,12 @@ +#include <linux/syscalls.h> +#include <linux/signal.h> +#include <linux/unistd.h> + +#include <asm/syscalls.h> + +#undef __SYSCALL +#define __SYSCALL(nr, call) [nr] = (call), + +void *sys_call_table[__NR_syscalls] = { +#include <asm/unistd.h> +}; diff --git a/arch/lm32/kernel/sys_lm32.c b/arch/lm32/kernel/sys_lm32.c index ed9a9fc..2316e8a 100644 --- a/arch/lm32/kernel/sys_lm32.c +++ b/arch/lm32/kernel/sys_lm32.c @@ -40,6 +40,22 @@ #include <asm/unistd.h> +asmlinkage long +sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, + unsigned long flags, unsigned long fd, unsigned long pgoff) +{ + return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); +} + +asmlinkage long +sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, + unsigned long flags, unsigned long fd, off_t offset) +{ + if (unlikely(offset & ~PAGE_MASK)) + return -EINVAL; + return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); +} + int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]) { register unsigned int r_syscall asm("r8") = __NR_execve; @@ -103,91 +119,3 @@ asmlinkage int sys_lm32_clone( return ret; } -static inline unsigned long -do_mmap2 (unsigned long addr, size_t len, - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff) -{ - struct file * file = NULL; - int ret = -EBADF; - - flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); - if (! (flags & MAP_ANONYMOUS)) { - if (!(file = fget (fd))) - goto out; - } - - down_write (¤t->mm->mmap_sem); - ret = do_mmap_pgoff (file, addr, len, prot, flags, pgoff); - up_write (¤t->mm->mmap_sem); - if (file) - fput (file); -out: - return ret; -} - -unsigned long sys_mmap2 (unsigned long addr, size_t len, - unsigned long prot, unsigned long flags, - unsigned long fd, unsigned long pgoff) -{ - return do_mmap2 (addr, len, prot, flags, fd, pgoff); -} - -asmlinkage void lm32_debug_syscall( - unsigned long p1, - unsigned long p2, - unsigned long p3, - unsigned long p4, - unsigned long p5, - unsigned long p6, - struct pt_regs* regs, - unsigned long syscallno) -{ - switch( syscallno ) { - case __NR_write: - case __NR_read: - case __NR_nanosleep: - case __NR_close: - case __NR_access: - /* do not debug those syscalls */ - break; - - default: - printk("Syscall: %lu (%lx, %lx, %lx, %lx, %lx, %lx) [regs = %lx]\n", - syscallno, p1, p2, p3, p4, p5, p6, (unsigned long)regs); - break; - } -} - -asmlinkage void lm32_debug_syscall_ret(int retval, unsigned long syscallno, struct pt_regs* regs) -{ - switch( syscallno ) { - case __NR_write: - case __NR_read: - case __NR_nanosleep: - case __NR_access: - default: - /* do not debug those syscalls except for errors */ - - /* do not debug ECHILD for wait() */ - if( syscallno == __NR_wait4 && retval == -10 ) - break; - if( retval < 0 ) - printk("ERROR: syscall %lu returned %d\n", syscallno, retval); - break; - - case __NR_close: - /* do not even debug those syscalls for errors because busybox often - * "cleanups" by closing several hundred never opened fd's */ - break; - - case __NR_pause: - printk("syscall %lu returned %d and ea=%lx\n", syscallno, retval, regs->ea); - break; - /* - default: - printk("syscall %lu returned %d\n", syscallno, retval); - break; - */ - } -} -- 1.7.2.3 _______________________________________________ http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org IRC: #milkymist@Freenode Twitter: www.twitter.com/milkymistvj Ideas? http://milkymist.uservoice.com