syscall-ppc.h 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #define __NR_io_setup 227
  2. #define __NR_io_destroy 228
  3. #define __NR_io_getevents 229
  4. #define __NR_io_submit 230
  5. #define __NR_io_cancel 231
  6. /* On powerpc a system call basically clobbers the same registers like a
  7. * function call, with the exception of LR (which is needed for the
  8. * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
  9. * an error return status).
  10. */
  11. #define __syscall_nr(nr, type, name, args...) \
  12. unsigned long __sc_ret, __sc_err; \
  13. { \
  14. register unsigned long __sc_0 __asm__ ("r0"); \
  15. register unsigned long __sc_3 __asm__ ("r3"); \
  16. register unsigned long __sc_4 __asm__ ("r4"); \
  17. register unsigned long __sc_5 __asm__ ("r5"); \
  18. register unsigned long __sc_6 __asm__ ("r6"); \
  19. register unsigned long __sc_7 __asm__ ("r7"); \
  20. register unsigned long __sc_8 __asm__ ("r8"); \
  21. \
  22. __sc_loadargs_##nr(name, args); \
  23. __asm__ __volatile__ \
  24. ("sc \n\t" \
  25. "mfcr %0 " \
  26. : "=&r" (__sc_0), \
  27. "=&r" (__sc_3), "=&r" (__sc_4), \
  28. "=&r" (__sc_5), "=&r" (__sc_6), \
  29. "=&r" (__sc_7), "=&r" (__sc_8) \
  30. : __sc_asm_input_##nr \
  31. : "cr0", "ctr", "memory", \
  32. "r9", "r10","r11", "r12"); \
  33. __sc_ret = __sc_3; \
  34. __sc_err = __sc_0; \
  35. } \
  36. if (__sc_err & 0x10000000) return -((int)__sc_ret); \
  37. return (type) __sc_ret
  38. #define __sc_loadargs_0(name, dummy...) \
  39. __sc_0 = __NR_##name
  40. #define __sc_loadargs_1(name, arg1) \
  41. __sc_loadargs_0(name); \
  42. __sc_3 = (unsigned long) (arg1)
  43. #define __sc_loadargs_2(name, arg1, arg2) \
  44. __sc_loadargs_1(name, arg1); \
  45. __sc_4 = (unsigned long) (arg2)
  46. #define __sc_loadargs_3(name, arg1, arg2, arg3) \
  47. __sc_loadargs_2(name, arg1, arg2); \
  48. __sc_5 = (unsigned long) (arg3)
  49. #define __sc_loadargs_4(name, arg1, arg2, arg3, arg4) \
  50. __sc_loadargs_3(name, arg1, arg2, arg3); \
  51. __sc_6 = (unsigned long) (arg4)
  52. #define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5) \
  53. __sc_loadargs_4(name, arg1, arg2, arg3, arg4); \
  54. __sc_7 = (unsigned long) (arg5)
  55. #define __sc_asm_input_0 "0" (__sc_0)
  56. #define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
  57. #define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
  58. #define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
  59. #define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
  60. #define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
  61. #define io_syscall1(type,fname,sname,type1,arg1) \
  62. type fname(type1 arg1) \
  63. { \
  64. __syscall_nr(1, type, sname, arg1); \
  65. }
  66. #define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
  67. type fname(type1 arg1, type2 arg2) \
  68. { \
  69. __syscall_nr(2, type, sname, arg1, arg2); \
  70. }
  71. #define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
  72. type fname(type1 arg1, type2 arg2, type3 arg3) \
  73. { \
  74. __syscall_nr(3, type, sname, arg1, arg2, arg3); \
  75. }
  76. #define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
  77. type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
  78. { \
  79. __syscall_nr(4, type, sname, arg1, arg2, arg3, arg4); \
  80. }
  81. #define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
  82. type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
  83. { \
  84. __syscall_nr(5, type, sname, arg1, arg2, arg3, arg4, arg5); \
  85. }