| .. | .. |
|---|
| 26 | 26 | case 4: \ |
|---|
| 27 | 27 | __get_user_asm(x, ptr, retval, "l"); \ |
|---|
| 28 | 28 | break; \ |
|---|
| 29 | + case 8: \ |
|---|
| 30 | + __get_user_u64(x, ptr, retval); \ |
|---|
| 31 | + break; \ |
|---|
| 29 | 32 | default: \ |
|---|
| 30 | 33 | __get_user_unknown(); \ |
|---|
| 31 | 34 | break; \ |
|---|
| .. | .. |
|---|
| 66 | 69 | |
|---|
| 67 | 70 | extern void __get_user_unknown(void); |
|---|
| 68 | 71 | |
|---|
| 72 | +#if defined(CONFIG_CPU_LITTLE_ENDIAN) |
|---|
| 73 | +#define __get_user_u64(x, addr, err) \ |
|---|
| 74 | +({ \ |
|---|
| 75 | +__asm__ __volatile__( \ |
|---|
| 76 | + "1:\n\t" \ |
|---|
| 77 | + "mov.l %2,%R1\n\t" \ |
|---|
| 78 | + "mov.l %T2,%S1\n\t" \ |
|---|
| 79 | + "2:\n" \ |
|---|
| 80 | + ".section .fixup,\"ax\"\n" \ |
|---|
| 81 | + "3:\n\t" \ |
|---|
| 82 | + "mov #0,%R1\n\t" \ |
|---|
| 83 | + "mov #0,%S1\n\t" \ |
|---|
| 84 | + "mov.l 4f, %0\n\t" \ |
|---|
| 85 | + "jmp @%0\n\t" \ |
|---|
| 86 | + " mov %3, %0\n\t" \ |
|---|
| 87 | + ".balign 4\n" \ |
|---|
| 88 | + "4: .long 2b\n\t" \ |
|---|
| 89 | + ".previous\n" \ |
|---|
| 90 | + ".section __ex_table,\"a\"\n\t" \ |
|---|
| 91 | + ".long 1b, 3b\n\t" \ |
|---|
| 92 | + ".long 1b + 2, 3b\n\t" \ |
|---|
| 93 | + ".previous" \ |
|---|
| 94 | + :"=&r" (err), "=&r" (x) \ |
|---|
| 95 | + :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) |
|---|
| 96 | +#else |
|---|
| 97 | +#define __get_user_u64(x, addr, err) \ |
|---|
| 98 | +({ \ |
|---|
| 99 | +__asm__ __volatile__( \ |
|---|
| 100 | + "1:\n\t" \ |
|---|
| 101 | + "mov.l %2,%S1\n\t" \ |
|---|
| 102 | + "mov.l %T2,%R1\n\t" \ |
|---|
| 103 | + "2:\n" \ |
|---|
| 104 | + ".section .fixup,\"ax\"\n" \ |
|---|
| 105 | + "3:\n\t" \ |
|---|
| 106 | + "mov #0,%S1\n\t" \ |
|---|
| 107 | + "mov #0,%R1\n\t" \ |
|---|
| 108 | + "mov.l 4f, %0\n\t" \ |
|---|
| 109 | + "jmp @%0\n\t" \ |
|---|
| 110 | + " mov %3, %0\n\t" \ |
|---|
| 111 | + ".balign 4\n" \ |
|---|
| 112 | + "4: .long 2b\n\t" \ |
|---|
| 113 | + ".previous\n" \ |
|---|
| 114 | + ".section __ex_table,\"a\"\n\t" \ |
|---|
| 115 | + ".long 1b, 3b\n\t" \ |
|---|
| 116 | + ".long 1b + 2, 3b\n\t" \ |
|---|
| 117 | + ".previous" \ |
|---|
| 118 | + :"=&r" (err), "=&r" (x) \ |
|---|
| 119 | + :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) |
|---|
| 120 | +#endif |
|---|
| 121 | + |
|---|
| 69 | 122 | #define __put_user_size(x,ptr,size,retval) \ |
|---|
| 70 | 123 | do { \ |
|---|
| 71 | 124 | retval = 0; \ |
|---|