diff options
Diffstat (limited to 'arch/microblaze/lib')
| -rw-r--r-- | arch/microblaze/lib/ashldi3.c | 3 | ||||
| -rw-r--r-- | arch/microblaze/lib/ashrdi3.c | 3 | ||||
| -rw-r--r-- | arch/microblaze/lib/cmpdi2.c | 2 | ||||
| -rw-r--r-- | arch/microblaze/lib/libgcc.h | 7 | ||||
| -rw-r--r-- | arch/microblaze/lib/lshrdi3.c | 3 | ||||
| -rw-r--r-- | arch/microblaze/lib/memcpy.c | 13 | ||||
| -rw-r--r-- | arch/microblaze/lib/memmove.c | 11 | ||||
| -rw-r--r-- | arch/microblaze/lib/memset.c | 2 | ||||
| -rw-r--r-- | arch/microblaze/lib/muldi3.c | 30 | ||||
| -rw-r--r-- | arch/microblaze/lib/uaccess_old.S | 107 | ||||
| -rw-r--r-- | arch/microblaze/lib/ucmpdi2.c | 2 |
11 files changed, 105 insertions, 78 deletions
diff --git a/arch/microblaze/lib/ashldi3.c b/arch/microblaze/lib/ashldi3.c index beb80f31609..1af904cd972 100644 --- a/arch/microblaze/lib/ashldi3.c +++ b/arch/microblaze/lib/ashldi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" @@ -25,5 +25,4 @@ long long __ashldi3(long long u, word_type b) return w.ll; } - EXPORT_SYMBOL(__ashldi3); diff --git a/arch/microblaze/lib/ashrdi3.c b/arch/microblaze/lib/ashrdi3.c index c884a912b66..32c334c05d0 100644 --- a/arch/microblaze/lib/ashrdi3.c +++ b/arch/microblaze/lib/ashrdi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" @@ -27,5 +27,4 @@ long long __ashrdi3(long long u, word_type b) return w.ll; } - EXPORT_SYMBOL(__ashrdi3); diff --git a/arch/microblaze/lib/cmpdi2.c b/arch/microblaze/lib/cmpdi2.c index a708400ea7b..67abc9ac1bd 100644 --- a/arch/microblaze/lib/cmpdi2.c +++ b/arch/microblaze/lib/cmpdi2.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" diff --git a/arch/microblaze/lib/libgcc.h b/arch/microblaze/lib/libgcc.h index 05909d58e2f..ab077ef7e14 100644 --- a/arch/microblaze/lib/libgcc.h +++ b/arch/microblaze/lib/libgcc.h @@ -22,4 +22,11 @@ typedef union { long long ll; } DWunion; +extern long long __ashldi3(long long u, word_type b); +extern long long __ashrdi3(long long u, word_type b); +extern word_type __cmpdi2(long long a, long long b); +extern long long __lshrdi3(long long u, word_type b); +extern long long __muldi3(long long u, long long v); +extern word_type __ucmpdi2(unsigned long long a, unsigned long long b); + #endif /* __ASM_LIBGCC_H */ diff --git a/arch/microblaze/lib/lshrdi3.c b/arch/microblaze/lib/lshrdi3.c index dcf8d6810b7..adcb253f11c 100644 --- a/arch/microblaze/lib/lshrdi3.c +++ b/arch/microblaze/lib/lshrdi3.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" @@ -25,5 +25,4 @@ long long __lshrdi3(long long u, word_type b) return w.ll; } - EXPORT_SYMBOL(__lshrdi3); diff --git a/arch/microblaze/lib/memcpy.c b/arch/microblaze/lib/memcpy.c index 52746e718df..f536e81b816 100644 --- a/arch/microblaze/lib/memcpy.c +++ b/arch/microblaze/lib/memcpy.c @@ -24,13 +24,12 @@ * not any responsibility to update it. */ +#include <linux/export.h> #include <linux/types.h> #include <linux/stddef.h> #include <linux/compiler.h> -#include <linux/module.h> #include <linux/string.h> -#include <asm/system.h> #ifdef __HAVE_ARCH_MEMCPY #ifndef CONFIG_OPT_LIB_FUNCTION @@ -104,12 +103,12 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c) } #else /* Load the holding buffer */ - buf_hold = (*i_src++ & 0xFFFFFF00) >>8; + buf_hold = (*i_src++ & 0xFFFFFF00) >> 8; for (; c >= 4; c -= 4) { value = *i_src++; *i_dst++ = buf_hold | ((value & 0xFF) << 24); - buf_hold = (value & 0xFFFFFF00) >>8; + buf_hold = (value & 0xFFFFFF00) >> 8; } #endif /* Realign the source */ @@ -130,12 +129,12 @@ void *memcpy(void *v_dst, const void *v_src, __kernel_size_t c) } #else /* Load the holding buffer */ - buf_hold = (*i_src++ & 0xFFFF0000 )>>16; + buf_hold = (*i_src++ & 0xFFFF0000) >> 16; for (; c >= 4; c -= 4) { value = *i_src++; - *i_dst++ = buf_hold | ((value & 0xFFFF)<<16); - buf_hold = (value & 0xFFFF0000) >>16; + *i_dst++ = buf_hold | ((value & 0xFFFF) << 16); + buf_hold = (value & 0xFFFF0000) >> 16; } #endif /* Realign the source */ diff --git a/arch/microblaze/lib/memmove.c b/arch/microblaze/lib/memmove.c index 2146c3752a8..3611ce70415 100644 --- a/arch/microblaze/lib/memmove.c +++ b/arch/microblaze/lib/memmove.c @@ -24,10 +24,10 @@ * not any responsibility to update it. */ +#include <linux/export.h> #include <linux/types.h> #include <linux/stddef.h> #include <linux/compiler.h> -#include <linux/module.h> #include <linux/string.h> #ifdef __HAVE_ARCH_MEMMOVE @@ -129,7 +129,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) for (; c >= 4; c -= 4) { value = *--i_src; - *--i_dst = buf_hold | ((value & 0xFFFFFF00)>>8); + *--i_dst = buf_hold | + ((value & 0xFFFFFF00) >> 8); buf_hold = (value & 0xFF) << 24; } #endif @@ -155,7 +156,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) for (; c >= 4; c -= 4) { value = *--i_src; - *--i_dst = buf_hold | ((value & 0xFFFF0000)>>16); + *--i_dst = buf_hold | + ((value & 0xFFFF0000) >> 16); buf_hold = (value & 0xFFFF) << 16; } #endif @@ -181,7 +183,8 @@ void *memmove(void *v_dst, const void *v_src, __kernel_size_t c) for (; c >= 4; c -= 4) { value = *--i_src; - *--i_dst = buf_hold | ((value & 0xFF000000)>> 24); + *--i_dst = buf_hold | + ((value & 0xFF000000) >> 24); buf_hold = (value & 0xFFFFFF) << 8; } #endif diff --git a/arch/microblaze/lib/memset.c b/arch/microblaze/lib/memset.c index ddf67939576..04ea72c8a81 100644 --- a/arch/microblaze/lib/memset.c +++ b/arch/microblaze/lib/memset.c @@ -24,10 +24,10 @@ * not any responsibility to update it. */ +#include <linux/export.h> #include <linux/types.h> #include <linux/stddef.h> #include <linux/compiler.h> -#include <linux/module.h> #include <linux/string.h> #ifdef __HAVE_ARCH_MEMSET diff --git a/arch/microblaze/lib/muldi3.c b/arch/microblaze/lib/muldi3.c index 0585bccb7fa..a3f9a03acdc 100644 --- a/arch/microblaze/lib/muldi3.c +++ b/arch/microblaze/lib/muldi3.c @@ -1,33 +1,29 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" -#define DWtype long long -#define UWtype unsigned long -#define UHWtype unsigned short - #define W_TYPE_SIZE 32 -#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) -#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) -#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) +#define __ll_B ((unsigned long) 1 << (W_TYPE_SIZE / 2)) +#define __ll_lowpart(t) ((unsigned long) (t) & (__ll_B - 1)) +#define __ll_highpart(t) ((unsigned long) (t) >> (W_TYPE_SIZE / 2)) /* If we still don't have umul_ppmm, define it using plain C. */ #if !defined(umul_ppmm) #define umul_ppmm(w1, w0, u, v) \ do { \ - UWtype __x0, __x1, __x2, __x3; \ - UHWtype __ul, __vl, __uh, __vh; \ + unsigned long __x0, __x1, __x2, __x3; \ + unsigned short __ul, __vl, __uh, __vh; \ \ __ul = __ll_lowpart(u); \ __uh = __ll_highpart(u); \ __vl = __ll_lowpart(v); \ __vh = __ll_highpart(v); \ \ - __x0 = (UWtype) __ul * __vl; \ - __x1 = (UWtype) __ul * __vh; \ - __x2 = (UWtype) __uh * __vl; \ - __x3 = (UWtype) __uh * __vh; \ + __x0 = (unsigned long) __ul * __vl; \ + __x1 = (unsigned long) __ul * __vh; \ + __x2 = (unsigned long) __uh * __vl; \ + __x3 = (unsigned long) __uh * __vh; \ \ __x1 += __ll_highpart(__x0); /* this can't give carry */\ __x1 += __x2; /* but this indeed can */ \ @@ -47,14 +43,14 @@ }) #endif -DWtype __muldi3(DWtype u, DWtype v) +long long __muldi3(long long u, long long v) { const DWunion uu = {.ll = u}; const DWunion vv = {.ll = v}; DWunion w = {.ll = __umulsidi3(uu.s.low, vv.s.low)}; - w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high - + (UWtype) uu.s.high * (UWtype) vv.s.low); + w.s.high += ((unsigned long) uu.s.low * (unsigned long) vv.s.high + + (unsigned long) uu.s.high * (unsigned long) vv.s.low); return w.ll; } diff --git a/arch/microblaze/lib/uaccess_old.S b/arch/microblaze/lib/uaccess_old.S index f037266cdaf..0e8cc2710c2 100644 --- a/arch/microblaze/lib/uaccess_old.S +++ b/arch/microblaze/lib/uaccess_old.S @@ -38,15 +38,14 @@ __strncpy_user: addik r3,r7,0 /* temp_count = len */ 1: lbu r4,r6,r0 + beqid r4,2f sb r4,r5,r0 - addik r3,r3,-1 - beqi r3,2f /* break on len */ - addik r5,r5,1 - bneid r4,1b addik r6,r6,1 /* delay slot */ - addik r3,r3,1 /* undo "temp_count--" */ + + addik r3,r3,-1 + bnei r3,1b /* break on len */ 2: rsubk r3,r3,r7 /* temp_count = len - temp_count */ 3: @@ -122,22 +121,22 @@ __strnlen_user: 15: swi r24, r5, 0x0018 + offset; \ 16: swi r25, r5, 0x001C + offset; \ .section __ex_table,"a"; \ - .word 1b, 0f; \ - .word 2b, 0f; \ - .word 3b, 0f; \ - .word 4b, 0f; \ - .word 5b, 0f; \ - .word 6b, 0f; \ - .word 7b, 0f; \ - .word 8b, 0f; \ - .word 9b, 0f; \ - .word 10b, 0f; \ - .word 11b, 0f; \ - .word 12b, 0f; \ - .word 13b, 0f; \ - .word 14b, 0f; \ - .word 15b, 0f; \ - .word 16b, 0f; \ + .word 1b, 33f; \ + .word 2b, 33f; \ + .word 3b, 33f; \ + .word 4b, 33f; \ + .word 5b, 33f; \ + .word 6b, 33f; \ + .word 7b, 33f; \ + .word 8b, 33f; \ + .word 9b, 33f; \ + .word 10b, 33f; \ + .word 11b, 33f; \ + .word 12b, 33f; \ + .word 13b, 33f; \ + .word 14b, 33f; \ + .word 15b, 33f; \ + .word 16b, 33f; \ .text #define COPY_80(offset) \ @@ -190,14 +189,17 @@ w2: sw r4, r5, r3 .align 4 /* Alignment is important to keep icache happy */ page: /* Create room on stack and save registers for storign values */ - addik r1, r1, -32 - swi r19, r1, 4 - swi r20, r1, 8 - swi r21, r1, 12 - swi r22, r1, 16 - swi r23, r1, 20 - swi r24, r1, 24 - swi r25, r1, 28 + addik r1, r1, -40 + swi r5, r1, 0 + swi r6, r1, 4 + swi r7, r1, 8 + swi r19, r1, 12 + swi r20, r1, 16 + swi r21, r1, 20 + swi r22, r1, 24 + swi r23, r1, 28 + swi r24, r1, 32 + swi r25, r1, 36 loop: /* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */ /* Loop unrolling to get performance boost */ COPY_80(0x000); @@ -205,21 +207,44 @@ loop: /* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */ COPY_80(0x100); COPY_80(0x180); /* copy loop */ - addik r6, r6, 0x200 - addik r7, r7, -0x200 - bneid r7, loop - addik r5, r5, 0x200 + addik r6, r6, 0x200 + addik r7, r7, -0x200 + bneid r7, loop + addik r5, r5, 0x200 + /* Restore register content */ - lwi r19, r1, 4 - lwi r20, r1, 8 - lwi r21, r1, 12 - lwi r22, r1, 16 - lwi r23, r1, 20 - lwi r24, r1, 24 - lwi r25, r1, 28 - addik r1, r1, 32 + lwi r5, r1, 0 + lwi r6, r1, 4 + lwi r7, r1, 8 + lwi r19, r1, 12 + lwi r20, r1, 16 + lwi r21, r1, 20 + lwi r22, r1, 24 + lwi r23, r1, 28 + lwi r24, r1, 32 + lwi r25, r1, 36 + addik r1, r1, 40 /* return back */ + addik r3, r0, 0 + rtsd r15, 8 + nop + +/* Fault case - return temp count */ +33: addik r3, r7, 0 + /* Restore register content */ + lwi r5, r1, 0 + lwi r6, r1, 4 + lwi r7, r1, 8 + lwi r19, r1, 12 + lwi r20, r1, 16 + lwi r21, r1, 20 + lwi r22, r1, 24 + lwi r23, r1, 28 + lwi r24, r1, 32 + lwi r25, r1, 36 + addik r1, r1, 40 + /* return back */ rtsd r15, 8 nop diff --git a/arch/microblaze/lib/ucmpdi2.c b/arch/microblaze/lib/ucmpdi2.c index 63ca105b671..d05f1585121 100644 --- a/arch/microblaze/lib/ucmpdi2.c +++ b/arch/microblaze/lib/ucmpdi2.c @@ -1,4 +1,4 @@ -#include <linux/module.h> +#include <linux/export.h> #include "libgcc.h" |
