--- zzzz-none-000/linux-2.6.28.10/arch/mips/include/asm/uaccess.h 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/arch/mips/include/asm/uaccess.h 2009-10-13 15:55:55.000000000 +0000 @@ -658,6 +658,25 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); +#ifdef CONFIG_MACH_FUSIV_MIPS1 +#define __invoke_copy_to_user(to,from,n) \ +({ \ + register void __user *__cu_to_r __asm__ ("$4"); \ + register const void *__cu_from_r __asm__ ("$5"); \ + register long __cu_len_r __asm__ ("$6"); \ + \ + __cu_to_r = (to); \ + __cu_from_r = (from); \ + __cu_len_r = (n); \ + __asm__ __volatile__( \ + __MODULE_JAL(__copy_user) \ + : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ + : \ + : "$8", "$9", "$10", "$11", "$12", "$13","$14", "$15", "$24", "$31", \ + "memory"); \ + __cu_len_r; \ +}) +#else #define __invoke_copy_to_user(to, from, n) \ ({ \ register void __user *__cu_to_r __asm__("$4"); \ @@ -675,7 +694,7 @@ DADDI_SCRATCH, "memory"); \ __cu_len_r; \ }) - +#endif /* * __copy_to_user: - Copy a block of data into user space, with less checking. * @to: Destination address, in user space. @@ -762,6 +781,30 @@ __cu_len; \ }) +#ifdef CONFIG_MACH_FUSIV_MIPS1 +#define __invoke_copy_from_user(to,from,n) \ +({ \ + register void *__cu_to_r __asm__ ("$4"); \ + register const void __user *__cu_from_r __asm__ ("$5"); \ + register long __cu_len_r __asm__ ("$6"); \ + \ + __cu_to_r = (to); \ + __cu_from_r = (from); \ + __cu_len_r = (n); \ + __asm__ __volatile__( \ + ".set\tnoreorder\n\t" \ + __MODULE_JAL(__copy_user) \ + ".set\tnoat\n\t" \ + __UA_ADDU "\t$1, %1, %2\n\t" \ + ".set\tat\n\t" \ + ".set\treorder" \ + : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ + : \ + : "$8", "$9", "$10", "$11", "$12", "$13","$14", "$15", "$24", "$31", \ + "memory"); \ + __cu_len_r; \ +}) +#else #define __invoke_copy_from_user(to, from, n) \ ({ \ register void *__cu_to_r __asm__("$4"); \ @@ -784,7 +827,32 @@ DADDI_SCRATCH, "memory"); \ __cu_len_r; \ }) +#endif +#ifdef CONFIG_MACH_FUSIV_MIPS1 +#define __invoke_copy_from_user_inatomic(to, from, n) \ +({ \ + register void *__cu_to_r __asm__("$4"); \ + register const void __user *__cu_from_r __asm__("$5"); \ + register long __cu_len_r __asm__("$6"); \ + \ + __cu_to_r = (to); \ + __cu_from_r = (from); \ + __cu_len_r = (n); \ + __asm__ __volatile__( \ + ".set\tnoreorder\n\t" \ + __MODULE_JAL(__copy_user_inatomic) \ + ".set\tnoat\n\t" \ + __UA_ADDU "\t$1, %1, %2\n\t" \ + ".set\tat\n\t" \ + ".set\treorder" \ + : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ + : \ + : "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", "$31", \ + DADDI_SCRATCH, "memory"); \ + __cu_len_r; \ +}) +#else #define __invoke_copy_from_user_inatomic(to, from, n) \ ({ \ register void *__cu_to_r __asm__("$4"); \ @@ -807,7 +875,7 @@ DADDI_SCRATCH, "memory"); \ __cu_len_r; \ }) - +#endif /* * __copy_from_user: - Copy a block of data from user space, with less checking. * @to: Destination address, in kernel space.