| .. | .. |
|---|
| 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 | |
|---|