sys_m68k.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * linux/arch/m68knommu/kernel/sys_m68k.c
  3. *
  4. * This file contains various random system calls that
  5. * have a non-standard calling sequence on the Linux/m68k
  6. * platform.
  7. */
  8. #include <linux/errno.h>
  9. #include <linux/sched.h>
  10. #include <linux/mm.h>
  11. #include <linux/smp.h>
  12. #include <linux/sem.h>
  13. #include <linux/msg.h>
  14. #include <linux/shm.h>
  15. #include <linux/stat.h>
  16. #include <linux/syscalls.h>
  17. #include <linux/mman.h>
  18. #include <linux/file.h>
  19. #include <linux/ipc.h>
  20. #include <linux/fs.h>
  21. #include <asm/setup.h>
  22. #include <asm/uaccess.h>
  23. #include <asm/cachectl.h>
  24. #include <asm/traps.h>
  25. #include <asm/cacheflush.h>
  26. #include <asm/unistd.h>
  27. /* sys_cacheflush -- flush (part of) the processor cache. */
  28. asmlinkage int
  29. sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
  30. {
  31. flush_cache_all();
  32. return(0);
  33. }
  34. asmlinkage int sys_getpagesize(void)
  35. {
  36. return PAGE_SIZE;
  37. }
  38. /*
  39. * Do a system call from kernel instead of calling sys_execve so we
  40. * end up with proper pt_regs.
  41. */
  42. int kernel_execve(const char *filename, char *const argv[], char *const envp[])
  43. {
  44. register long __res asm ("%d0") = __NR_execve;
  45. register long __a asm ("%d1") = (long)(filename);
  46. register long __b asm ("%d2") = (long)(argv);
  47. register long __c asm ("%d3") = (long)(envp);
  48. asm volatile ("trap #0" : "+d" (__res)
  49. : "d" (__a), "d" (__b), "d" (__c));
  50. return __res;
  51. }
  52. asmlinkage unsigned long sys_get_thread_area(void)
  53. {
  54. return current_thread_info()->tp_value;
  55. }
  56. asmlinkage int sys_set_thread_area(unsigned long tp)
  57. {
  58. current_thread_info()->tp_value = tp;
  59. return 0;
  60. }
  61. /* This syscall gets its arguments in A0 (mem), D2 (oldval) and
  62. D1 (newval). */
  63. asmlinkage int
  64. sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
  65. unsigned long __user * mem)
  66. {
  67. struct mm_struct *mm = current->mm;
  68. unsigned long mem_value;
  69. down_read(&mm->mmap_sem);
  70. mem_value = *mem;
  71. if (mem_value == oldval)
  72. *mem = newval;
  73. up_read(&mm->mmap_sem);
  74. return mem_value;
  75. }
  76. asmlinkage int sys_atomic_barrier(void)
  77. {
  78. /* no code needed for uniprocs */
  79. return 0;
  80. }