PageRenderTime 15ms CodeModel.GetById 8ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/Ethereal-msm8939-beta9/arch/microblaze/include/asm/syscall.h

https://bitbucket.org/MilosStamenkovic95/etherealos
C Header | 102 lines | 88 code | 12 blank | 2 comment | 5 complexity | 3369c67083a5388c0f2c900e3593dd8e MD5 | raw file
  1#ifndef __ASM_MICROBLAZE_SYSCALL_H
  2#define __ASM_MICROBLAZE_SYSCALL_H
  3
  4#include <linux/kernel.h>
  5#include <linux/sched.h>
  6#include <asm/ptrace.h>
  7
  8/* The system call number is given by the user in R12 */
  9static inline long syscall_get_nr(struct task_struct *task,
 10				  struct pt_regs *regs)
 11{
 12	return regs->r12;
 13}
 14
 15static inline void syscall_rollback(struct task_struct *task,
 16				    struct pt_regs *regs)
 17{
 18	/* TODO.  */
 19}
 20
 21static inline long syscall_get_error(struct task_struct *task,
 22				     struct pt_regs *regs)
 23{
 24	return IS_ERR_VALUE(regs->r3) ? regs->r3 : 0;
 25}
 26
 27static inline long syscall_get_return_value(struct task_struct *task,
 28					    struct pt_regs *regs)
 29{
 30	return regs->r3;
 31}
 32
 33static inline void syscall_set_return_value(struct task_struct *task,
 34					    struct pt_regs *regs,
 35					    int error, long val)
 36{
 37	if (error)
 38		regs->r3 = -error;
 39	else
 40		regs->r3 = val;
 41}
 42
 43static inline microblaze_reg_t microblaze_get_syscall_arg(struct pt_regs *regs,
 44							  unsigned int n)
 45{
 46	switch (n) {
 47	case 5: return regs->r10;
 48	case 4: return regs->r9;
 49	case 3: return regs->r8;
 50	case 2: return regs->r7;
 51	case 1: return regs->r6;
 52	case 0: return regs->r5;
 53	default:
 54		BUG();
 55	}
 56	return ~0;
 57}
 58
 59static inline void microblaze_set_syscall_arg(struct pt_regs *regs,
 60					      unsigned int n,
 61					      unsigned long val)
 62{
 63	switch (n) {
 64	case 5:
 65		regs->r10 = val;
 66	case 4:
 67		regs->r9 = val;
 68	case 3:
 69		regs->r8 = val;
 70	case 2:
 71		regs->r7 = val;
 72	case 1:
 73		regs->r6 = val;
 74	case 0:
 75		regs->r5 = val;
 76	default:
 77		BUG();
 78	}
 79}
 80
 81static inline void syscall_get_arguments(struct task_struct *task,
 82					 struct pt_regs *regs,
 83					 unsigned int i, unsigned int n,
 84					 unsigned long *args)
 85{
 86	while (n--)
 87		*args++ = microblaze_get_syscall_arg(regs, i++);
 88}
 89
 90static inline void syscall_set_arguments(struct task_struct *task,
 91					 struct pt_regs *regs,
 92					 unsigned int i, unsigned int n,
 93					 const unsigned long *args)
 94{
 95	while (n--)
 96		microblaze_set_syscall_arg(regs, i++, *args++);
 97}
 98
 99asmlinkage long do_syscall_trace_enter(struct pt_regs *regs);
100asmlinkage void do_syscall_trace_leave(struct pt_regs *regs);
101
102#endif /* __ASM_MICROBLAZE_SYSCALL_H */