syscall.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file "COPYING" in the main directory of this archive
  4. * for more details.
  5. *
  6. * Copyright (C) 2001 - 2007 Tensilica Inc.
  7. * Copyright (C) 2018 Cadence Design Systems Inc.
  8. */
  9. #ifndef _ASM_SYSCALL_H
  10. #define _ASM_SYSCALL_H
  11. #include <linux/err.h>
  12. #include <asm/ptrace.h>
  13. #include <uapi/linux/audit.h>
  14. static inline int syscall_get_arch(struct task_struct *task)
  15. {
  16. return AUDIT_ARCH_XTENSA;
  17. }
  18. typedef void (*syscall_t)(void);
  19. extern syscall_t sys_call_table[];
  20. static inline long syscall_get_nr(struct task_struct *task,
  21. struct pt_regs *regs)
  22. {
  23. return regs->syscall;
  24. }
  25. static inline void syscall_set_nr(struct task_struct *task,
  26. struct pt_regs *regs,
  27. int nr)
  28. {
  29. regs->syscall = nr;
  30. }
  31. static inline void syscall_rollback(struct task_struct *task,
  32. struct pt_regs *regs)
  33. {
  34. /* Do nothing. */
  35. }
  36. static inline long syscall_get_error(struct task_struct *task,
  37. struct pt_regs *regs)
  38. {
  39. /* 0 if syscall succeeded, otherwise -Errorcode */
  40. return IS_ERR_VALUE(regs->areg[2]) ? regs->areg[2] : 0;
  41. }
  42. static inline long syscall_get_return_value(struct task_struct *task,
  43. struct pt_regs *regs)
  44. {
  45. return regs->areg[2];
  46. }
  47. static inline void syscall_set_return_value(struct task_struct *task,
  48. struct pt_regs *regs,
  49. int error, long val)
  50. {
  51. regs->areg[2] = (long) error ? error : val;
  52. }
  53. #define XTENSA_SYSCALL_ARGUMENT_REGS {6, 3, 4, 5, 8, 9}
  54. static inline void syscall_get_arguments(struct task_struct *task,
  55. struct pt_regs *regs,
  56. unsigned long *args)
  57. {
  58. static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
  59. unsigned int i;
  60. for (i = 0; i < 6; ++i)
  61. args[i] = regs->areg[reg[i]];
  62. }
  63. static inline void syscall_set_arguments(struct task_struct *task,
  64. struct pt_regs *regs,
  65. const unsigned long *args)
  66. {
  67. static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
  68. unsigned int i;
  69. for (i = 0; i < 6; ++i)
  70. regs->areg[reg[i]] = args[i];
  71. }
  72. asmlinkage long xtensa_rt_sigreturn(void);
  73. asmlinkage long xtensa_shmat(int, char __user *, int);
  74. asmlinkage long xtensa_fadvise64_64(int, int,
  75. unsigned long long, unsigned long long);
  76. #endif