forked from Minki/linux
1394f03221
This adds support for the Analog Devices Blackfin processor architecture, and currently supports the BF533, BF532, BF531, BF537, BF536, BF534, and BF561 (Dual Core) devices, with a variety of development platforms including those avaliable from Analog Devices (BF533-EZKit, BF533-STAMP, BF537-STAMP, BF561-EZKIT), and Bluetechnix! Tinyboards. The Blackfin architecture was jointly developed by Intel and Analog Devices Inc. (ADI) as the Micro Signal Architecture (MSA) core and introduced it in December of 2000. Since then ADI has put this core into its Blackfin processor family of devices. The Blackfin core has the advantages of a clean, orthogonal,RISC-like microprocessor instruction set. It combines a dual-MAC (Multiply/Accumulate), state-of-the-art signal processing engine and single-instruction, multiple-data (SIMD) multimedia capabilities into a single instruction-set architecture. The Blackfin architecture, including the instruction set, is described by the ADSP-BF53x/BF56x Blackfin Processor Programming Reference http://blackfin.uclinux.org/gf/download/frsrelease/29/2549/Blackfin_PRM.pdf The Blackfin processor is already supported by major releases of gcc, and there are binary and source rpms/tarballs for many architectures at: http://blackfin.uclinux.org/gf/project/toolchain/frs There is complete documentation, including "getting started" guides available at: http://docs.blackfin.uclinux.org/ which provides links to the sources and patches you will need in order to set up a cross-compiling environment for bfin-linux-uclibc This patch, as well as the other patches (toolchain, distribution, uClibc) are actively supported by Analog Devices Inc, at: http://blackfin.uclinux.org/ We have tested this on LTP, and our test plan (including pass/fails) can be found at: http://docs.blackfin.uclinux.org/doku.php?id=testing_the_linux_kernel [m.kozlowski@tuxland.pl: balance parenthesis in blackfin header files] Signed-off-by: Bryan Wu <bryan.wu@analog.com> Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl> Signed-off-by: Aubrey Li <aubrey.li@analog.com> Signed-off-by: Jie Zhang <jie.zhang@analog.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
105 lines
2.8 KiB
C
105 lines
2.8 KiB
C
#ifndef _BLACKFIN_STRING_H_
|
|
#define _BLACKFIN_STRING_H_
|
|
|
|
#ifdef __KERNEL__ /* only set these up for kernel code */
|
|
|
|
#define __HAVE_ARCH_STRCPY
|
|
extern inline char *strcpy(char *dest, const char *src)
|
|
{
|
|
char *xdest = dest;
|
|
char temp = 0;
|
|
|
|
__asm__ __volatile__
|
|
("1:\t%2 = B [%1++] (Z);\n\t"
|
|
"B [%0++] = %2;\n\t"
|
|
"CC = %2;\n\t"
|
|
"if cc jump 1b (bp);\n"
|
|
: "+&a" (dest), "+&a" (src), "=&d" (temp)
|
|
::"memory", "CC");
|
|
return xdest;
|
|
}
|
|
|
|
#define __HAVE_ARCH_STRNCPY
|
|
extern inline char *strncpy(char *dest, const char *src, size_t n)
|
|
{
|
|
char *xdest = dest;
|
|
char temp = 0;
|
|
|
|
if (n == 0)
|
|
return xdest;
|
|
|
|
__asm__ __volatile__
|
|
("1:\t%3 = B [%1++] (Z);\n\t"
|
|
"B [%0++] = %3;\n\t"
|
|
"CC = %3;\n\t"
|
|
"if ! cc jump 2f;\n\t"
|
|
"%2 += -1;\n\t"
|
|
"CC = %2 == 0;\n\t"
|
|
"if ! cc jump 1b (bp);\n"
|
|
"2:\n"
|
|
: "+&a" (dest), "+&a" (src), "+&da" (n), "=&d" (temp)
|
|
::"memory", "CC");
|
|
return xdest;
|
|
}
|
|
|
|
#define __HAVE_ARCH_STRCMP
|
|
extern inline int strcmp(const char *cs, const char *ct)
|
|
{
|
|
char __res1, __res2;
|
|
|
|
__asm__
|
|
("1:\t%2 = B[%0++] (Z);\n\t" /* get *cs */
|
|
"%3 = B[%1++] (Z);\n\t" /* get *ct */
|
|
"CC = %2 == %3;\n\t" /* compare a byte */
|
|
"if ! cc jump 2f;\n\t" /* not equal, break out */
|
|
"CC = %2;\n\t" /* at end of cs? */
|
|
"if cc jump 1b (bp);\n\t" /* no, keep going */
|
|
"jump.s 3f;\n" /* strings are equal */
|
|
"2:\t%2 = %2 - %3;\n" /* *cs - *ct */
|
|
"3:\n"
|
|
: "+&a" (cs), "+&a" (ct), "=&d" (__res1), "=&d" (__res2)
|
|
: : "CC");
|
|
|
|
return __res1;
|
|
}
|
|
|
|
#define __HAVE_ARCH_STRNCMP
|
|
extern inline int strncmp(const char *cs, const char *ct, size_t count)
|
|
{
|
|
char __res1, __res2;
|
|
|
|
if (!count)
|
|
return 0;
|
|
__asm__
|
|
("1:\t%3 = B[%0++] (Z);\n\t" /* get *cs */
|
|
"%4 = B[%1++] (Z);\n\t" /* get *ct */
|
|
"CC = %3 == %4;\n\t" /* compare a byte */
|
|
"if ! cc jump 3f;\n\t" /* not equal, break out */
|
|
"CC = %3;\n\t" /* at end of cs? */
|
|
"if ! cc jump 4f;\n\t" /* yes, all done */
|
|
"%2 += -1;\n\t" /* no, adjust count */
|
|
"CC = %2 == 0;\n\t"
|
|
"if ! cc jump 1b;\n" /* more to do, keep going */
|
|
"2:\t%3 = 0;\n\t" /* strings are equal */
|
|
"jump.s 4f;\n"
|
|
"3:\t%3 = %3 - %4;\n" /* *cs - *ct */
|
|
"4:"
|
|
: "+&a" (cs), "+&a" (ct), "+&da" (count), "=&d" (__res1), "=&d" (__res2)
|
|
: : "CC");
|
|
return __res1;
|
|
}
|
|
|
|
#define __HAVE_ARCH_MEMSET
|
|
extern void *memset(void *s, int c, size_t count);
|
|
#define __HAVE_ARCH_MEMCPY
|
|
extern void *memcpy(void *d, const void *s, size_t count);
|
|
#define __HAVE_ARCH_MEMCMP
|
|
extern int memcmp(const void *, const void *, __kernel_size_t);
|
|
#define __HAVE_ARCH_MEMCHR
|
|
extern void *memchr(const void *s, int c, size_t n);
|
|
#define __HAVE_ARCH_MEMMOVE
|
|
extern void *memmove(void *dest, const void *src, size_t count);
|
|
|
|
#endif /*__KERNEL__*/
|
|
#endif /* _BLACKFIN_STRING_H_ */
|