| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * linux/arch/m68knommu/kernel/sys_m68k.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file contains various random system calls that | 
					
						
							|  |  |  |  * have a non-standard calling sequence on the Linux/m68k | 
					
						
							|  |  |  |  * platform. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/errno.h>
 | 
					
						
							|  |  |  | #include <linux/sched.h>
 | 
					
						
							|  |  |  | #include <linux/mm.h>
 | 
					
						
							|  |  |  | #include <linux/smp.h>
 | 
					
						
							|  |  |  | #include <linux/sem.h>
 | 
					
						
							|  |  |  | #include <linux/msg.h>
 | 
					
						
							|  |  |  | #include <linux/shm.h>
 | 
					
						
							|  |  |  | #include <linux/stat.h>
 | 
					
						
							|  |  |  | #include <linux/syscalls.h>
 | 
					
						
							|  |  |  | #include <linux/mman.h>
 | 
					
						
							|  |  |  | #include <linux/file.h>
 | 
					
						
							| 
									
										
										
										
											2007-10-16 23:29:24 -07:00
										 |  |  | #include <linux/ipc.h>
 | 
					
						
							| 
									
										
										
										
											2007-08-24 09:26:12 +10:00
										 |  |  | #include <linux/fs.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <asm/setup.h>
 | 
					
						
							|  |  |  | #include <asm/uaccess.h>
 | 
					
						
							|  |  |  | #include <asm/cachectl.h>
 | 
					
						
							|  |  |  | #include <asm/traps.h>
 | 
					
						
							|  |  |  | #include <asm/cacheflush.h>
 | 
					
						
							| 
									
										
										
										
											2006-10-02 02:18:34 -07:00
										 |  |  | #include <asm/unistd.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* sys_cacheflush -- flush (part of) the processor cache.  */ | 
					
						
							|  |  |  | asmlinkage int | 
					
						
							|  |  |  | sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	flush_cache_all(); | 
					
						
							|  |  |  | 	return(0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | asmlinkage int sys_getpagesize(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PAGE_SIZE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-02 02:18:34 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Do a system call from kernel instead of calling sys_execve so we | 
					
						
							|  |  |  |  * end up with proper pt_regs. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	register long __res asm ("%d0") = __NR_execve; | 
					
						
							|  |  |  | 	register long __a asm ("%d1") = (long)(filename); | 
					
						
							|  |  |  | 	register long __b asm ("%d2") = (long)(argv); | 
					
						
							|  |  |  | 	register long __c asm ("%d3") = (long)(envp); | 
					
						
							|  |  |  | 	asm volatile ("trap  #0" : "+d" (__res) | 
					
						
							|  |  |  | 			: "d" (__a), "d" (__b), "d" (__c)); | 
					
						
							|  |  |  | 	return __res; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-06 10:08:14 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | asmlinkage unsigned long sys_get_thread_area(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return current_thread_info()->tp_value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | asmlinkage int sys_set_thread_area(unsigned long tp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	current_thread_info()->tp_value = tp; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This syscall gets its arguments in A0 (mem), D2 (oldval) and
 | 
					
						
							|  |  |  |    D1 (newval).  */ | 
					
						
							|  |  |  | asmlinkage int | 
					
						
							|  |  |  | sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5, | 
					
						
							|  |  |  | 		      unsigned long __user * mem) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct mm_struct *mm = current->mm; | 
					
						
							|  |  |  | 	unsigned long mem_value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	down_read(&mm->mmap_sem); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mem_value = *mem; | 
					
						
							|  |  |  | 	if (mem_value == oldval) | 
					
						
							|  |  |  | 		*mem = newval; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	up_read(&mm->mmap_sem); | 
					
						
							|  |  |  | 	return mem_value; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | asmlinkage int sys_atomic_barrier(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* no code needed for uniprocs */ | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } |