.. | .. |
---|
40 | 40 | struct pt_regs *regs, |
---|
41 | 41 | int error, long val) |
---|
42 | 42 | { |
---|
43 | | - if (error) |
---|
44 | | - regs->regs[0] = -error; |
---|
45 | | - else |
---|
46 | | - regs->regs[0] = val; |
---|
| 43 | + regs->regs[0] = (long) error ?: val; |
---|
47 | 44 | } |
---|
48 | 45 | |
---|
49 | 46 | static inline void syscall_get_arguments(struct task_struct *task, |
---|
50 | 47 | struct pt_regs *regs, |
---|
51 | | - unsigned int i, unsigned int n, |
---|
52 | 48 | unsigned long *args) |
---|
53 | 49 | { |
---|
54 | | - /* |
---|
55 | | - * Do this simply for now. If we need to start supporting |
---|
56 | | - * fetching arguments from arbitrary indices, this will need some |
---|
57 | | - * extra logic. Presently there are no in-tree users that depend |
---|
58 | | - * on this behaviour. |
---|
59 | | - */ |
---|
60 | | - BUG_ON(i); |
---|
61 | 50 | |
---|
62 | 51 | /* Argument pattern is: R4, R5, R6, R7, R0, R1 */ |
---|
63 | | - switch (n) { |
---|
64 | | - case 6: args[5] = regs->regs[1]; |
---|
65 | | - case 5: args[4] = regs->regs[0]; |
---|
66 | | - case 4: args[3] = regs->regs[7]; |
---|
67 | | - case 3: args[2] = regs->regs[6]; |
---|
68 | | - case 2: args[1] = regs->regs[5]; |
---|
69 | | - case 1: args[0] = regs->regs[4]; |
---|
70 | | - case 0: |
---|
71 | | - break; |
---|
72 | | - default: |
---|
73 | | - BUG(); |
---|
74 | | - } |
---|
| 52 | + args[5] = regs->regs[1]; |
---|
| 53 | + args[4] = regs->regs[0]; |
---|
| 54 | + args[3] = regs->regs[7]; |
---|
| 55 | + args[2] = regs->regs[6]; |
---|
| 56 | + args[1] = regs->regs[5]; |
---|
| 57 | + args[0] = regs->regs[4]; |
---|
75 | 58 | } |
---|
76 | 59 | |
---|
77 | 60 | static inline void syscall_set_arguments(struct task_struct *task, |
---|
78 | 61 | struct pt_regs *regs, |
---|
79 | | - unsigned int i, unsigned int n, |
---|
80 | 62 | const unsigned long *args) |
---|
81 | 63 | { |
---|
82 | | - /* Same note as above applies */ |
---|
83 | | - BUG_ON(i); |
---|
84 | | - |
---|
85 | | - switch (n) { |
---|
86 | | - case 6: regs->regs[1] = args[5]; |
---|
87 | | - case 5: regs->regs[0] = args[4]; |
---|
88 | | - case 4: regs->regs[7] = args[3]; |
---|
89 | | - case 3: regs->regs[6] = args[2]; |
---|
90 | | - case 2: regs->regs[5] = args[1]; |
---|
91 | | - case 1: regs->regs[4] = args[0]; |
---|
92 | | - break; |
---|
93 | | - default: |
---|
94 | | - BUG(); |
---|
95 | | - } |
---|
| 64 | + regs->regs[1] = args[5]; |
---|
| 65 | + regs->regs[0] = args[4]; |
---|
| 66 | + regs->regs[7] = args[3]; |
---|
| 67 | + regs->regs[6] = args[2]; |
---|
| 68 | + regs->regs[5] = args[1]; |
---|
| 69 | + regs->regs[4] = args[0]; |
---|
96 | 70 | } |
---|
97 | 71 | |
---|
98 | | -static inline int syscall_get_arch(void) |
---|
| 72 | +static inline int syscall_get_arch(struct task_struct *task) |
---|
99 | 73 | { |
---|
100 | 74 | int arch = AUDIT_ARCH_SH; |
---|
101 | 75 | |
---|