mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	csky: System Call
This patch adds files related to syscall. Signed-off-by: Guo Ren <ren_guo@c-sky.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
		
							parent
							
								
									081860b970
								
							
						
					
					
						commit
						4859bfca11
					
				
					 5 changed files with 153 additions and 0 deletions
				
			
		
							
								
								
									
										71
									
								
								arch/csky/include/asm/syscall.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								arch/csky/include/asm/syscall.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,71 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __ASM_SYSCALL_H
 | 
				
			||||||
 | 
					#define __ASM_SYSCALL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/sched.h>
 | 
				
			||||||
 | 
					#include <linux/err.h>
 | 
				
			||||||
 | 
					#include <abi/regdef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int
 | 
				
			||||||
 | 
					syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return regs_syscallid(regs);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					syscall_rollback(struct task_struct *task, struct pt_regs *regs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						regs->a0 = regs->orig_a0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline long
 | 
				
			||||||
 | 
					syscall_get_error(struct task_struct *task, struct pt_regs *regs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned long error = regs->a0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return IS_ERR_VALUE(error) ? error : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline long
 | 
				
			||||||
 | 
					syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return regs->a0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
 | 
				
			||||||
 | 
							int error, long val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						regs->a0 = (long) error ?: val;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
 | 
				
			||||||
 | 
							      unsigned int i, unsigned int n, unsigned long *args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						BUG_ON(i + n > 6);
 | 
				
			||||||
 | 
						if (i == 0) {
 | 
				
			||||||
 | 
							args[0] = regs->orig_a0;
 | 
				
			||||||
 | 
							args++;
 | 
				
			||||||
 | 
							i++;
 | 
				
			||||||
 | 
							n--;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						memcpy(args, ®s->a1 + i * sizeof(regs->a1), n * sizeof(args[0]));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					syscall_set_arguments(struct task_struct *task, struct pt_regs *regs,
 | 
				
			||||||
 | 
							      unsigned int i, unsigned int n, const unsigned long *args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						BUG_ON(i + n > 6);
 | 
				
			||||||
 | 
						if (i == 0) {
 | 
				
			||||||
 | 
							regs->orig_a0 = args[0];
 | 
				
			||||||
 | 
							args++;
 | 
				
			||||||
 | 
							i++;
 | 
				
			||||||
 | 
							n--;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						memcpy(®s->a1 + i * sizeof(regs->a1), args, n * sizeof(regs->a0));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif	/* __ASM_SYSCALL_H */
 | 
				
			||||||
							
								
								
									
										15
									
								
								arch/csky/include/asm/syscalls.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								arch/csky/include/asm/syscalls.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __ASM_CSKY_SYSCALLS_H
 | 
				
			||||||
 | 
					#define __ASM_CSKY_SYSCALLS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm-generic/syscalls.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long sys_cacheflush(void __user *, unsigned long, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long sys_set_thread_area(unsigned long addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long sys_csky_fadvise64_64(int fd, int advice, loff_t offset, loff_t len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __ASM_CSKY_SYSCALLS_H */
 | 
				
			||||||
							
								
								
									
										10
									
								
								arch/csky/include/uapi/asm/unistd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								arch/csky/include/uapi/asm/unistd.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __ARCH_WANT_SYS_CLONE
 | 
				
			||||||
 | 
					#include <asm-generic/unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __NR_set_thread_area	(__NR_arch_specific_syscall + 0)
 | 
				
			||||||
 | 
					__SYSCALL(__NR_set_thread_area, sys_set_thread_area)
 | 
				
			||||||
 | 
					#define __NR_cacheflush		(__NR_arch_specific_syscall + 1)
 | 
				
			||||||
 | 
					__SYSCALL(__NR_cacheflush, sys_cacheflush)
 | 
				
			||||||
							
								
								
									
										43
									
								
								arch/csky/kernel/syscall.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								arch/csky/kernel/syscall.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,43 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/syscalls.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct thread_info *ti = task_thread_info(current);
 | 
				
			||||||
 | 
						struct pt_regs *reg = current_pt_regs();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reg->tls = addr;
 | 
				
			||||||
 | 
						ti->tp_value = addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SYSCALL_DEFINE6(mmap2,
 | 
				
			||||||
 | 
						unsigned long, addr,
 | 
				
			||||||
 | 
						unsigned long, len,
 | 
				
			||||||
 | 
						unsigned long, prot,
 | 
				
			||||||
 | 
						unsigned long, flags,
 | 
				
			||||||
 | 
						unsigned long, fd,
 | 
				
			||||||
 | 
						off_t, offset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (unlikely(offset & (~PAGE_MASK >> 12)))
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ksys_mmap_pgoff(addr, len, prot, flags, fd,
 | 
				
			||||||
 | 
								       offset >> (PAGE_SHIFT - 12));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * for abiv1 the 64bits args should be even th, So we need mov the advice
 | 
				
			||||||
 | 
					 * forward.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					SYSCALL_DEFINE4(csky_fadvise64_64,
 | 
				
			||||||
 | 
						int, fd,
 | 
				
			||||||
 | 
						int, advice,
 | 
				
			||||||
 | 
						loff_t, offset,
 | 
				
			||||||
 | 
						loff_t, len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ksys_fadvise64_64(fd, offset, len, advice);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								arch/csky/kernel/syscall_table.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								arch/csky/kernel/syscall_table.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
 | 
					// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/syscalls.h>
 | 
				
			||||||
 | 
					#include <asm/syscalls.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef __SYSCALL
 | 
				
			||||||
 | 
					#define __SYSCALL(nr, call)[nr] = (call),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define sys_fadvise64_64 sys_csky_fadvise64_64
 | 
				
			||||||
 | 
					void * const sys_call_table[__NR_syscalls] __page_aligned_data = {
 | 
				
			||||||
 | 
						[0 ... __NR_syscalls - 1] = sys_ni_syscall,
 | 
				
			||||||
 | 
					#include <asm/unistd.h>
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
		Reference in a new issue