Re: [PATCH 15/31] nds32: System calls handling
From: Arnd Bergmann <arnd@arndb.de>
Date: 2017-11-08 09:30:55
Also in:
linux-arch, lkml
On Wed, Nov 8, 2017 at 6:55 AM, Greentime Hu [off-list ref] wrote:
From: Greentime Hu <redacted>
quoted hunk ↗ jump to hunk
+#endif /* __ASM_NDS32_SYSCALLS_H */diff --git a/arch/nds32/include/asm/unistd.h b/arch/nds32/include/asm/unistd.h new file mode 100644 index 0000000..b30adca --- /dev/null +++ b/arch/nds32/include/asm/unistd.h@@ -0,0 +1,21 @@
+#define __ARCH_WANT_SYS_LLSEEK
This gets set from include/asm-generic/unistd.h if you include that file.
+#define __ARCH_WANT_SYS_CLONE
This seems ok, though it would be nice to have the reverse logic and have architectures opt-out of the generic version when they need to provide their own, rather than having most architectures set it.
+#define __ARCH_WANT_SYS_OLD_MMAP
I don't see why you need this, can it be dropped?
quoted hunk ↗ jump to hunk
diff --git a/arch/nds32/include/uapi/asm/unistd.h b/arch/nds32/include/uapi/asm/unistd.h new file mode 100644 index 0000000..01b466d --- /dev/null +++ b/arch/nds32/include/uapi/asm/unistd.h
+#define __NR_ipc (__NR_arch_specific_syscall + 2) +#define __NR_sysfs (__NR_arch_specific_syscall + 3) +#define __NR__llseek __NR_llseek
+__SYSCALL(__NR_cacheflush, sys_cacheflush) +__SYSCALL(__NR_syscall, sys_syscall) +__SYSCALL(__NR_ipc, sys_ipc) +__SYSCALL(__NR_sysfs, sys_sysfs) + +__SYSCALL(__NR_fadvise64_64, sys_fadvise64_64_wrapper) +__SYSCALL(__NR_rt_sigreturn, sys_rt_sigreturn_wrapper) +__SYSCALL(__NR_mmap, sys_old_mmap)
Usually we handle those overrides by defining the macros in asm/unistd.h before including the asm-generic version. Can you do that as well for consistency? I don't see a reason for sys_ipc, sys_sysfs or sys_old_mmap() here in a new architecture. Can you drop those or explain why you need them?
+/* + * Special system call wrappers + * + * $r0 = syscall number + * $r8 = syscall table + */ + .type sys_syscall, #function +ENTRY(sys_syscall) + addi $p1, $r0, #-__NR_syscalls + bgtz $p1, 3f + move $p1, $r0 + move $r0, $r1 + move $r1, $r2 + move $r2, $r3 + move $r3, $r4 + move $r4, $r5 +! add for syscall 6 args + lwi $r5, [$sp + #SP_OFFSET ] + lwi $r5, [$r5] +! ~add for syscall 6 args + + lw $p1, [tbl+$p1<<2] + jr $p1 +3: b sys_ni_syscall +ENDPROC(sys_syscall)
Can you explain what this is used for?
quoted hunk ↗ jump to hunk
--- /dev/null +++ b/arch/nds32/kernel/sys_nds32.c + +long sys_mmap2(unsigned long addr, unsigned long len, + unsigned long prot, unsigned long flags, + unsigned long fd, unsigned long pgoff) +{ + if (pgoff & (~PAGE_MASK >> 12)) + return -EINVAL; + + return sys_mmap_pgoff(addr, len, prot, flags, fd, + pgoff >> (PAGE_SHIFT - 12)); +} + +asmlinkage long sys_fadvise64_64_wrapper(int fd, int advice, loff_t offset, + loff_t len) +{ + return sys_fadvise64_64(fd, offset, len, advice); +}
You should always use SYSCALL_DEFINE*() macros to define entry points
for your own syscalls in C code for consistency. I also wonder if we should
just move those two into common code, a lot of architectures need the first
one in particular.
Arnd