summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorMarcus Brinkmann <marcus@gnu.org>2000-07-23 00:34:12 +0000
committerMarcus Brinkmann <marcus@gnu.org>2000-07-23 00:34:12 +0000
commit91933a41184cd816cb8ce4d96cf8764ebd7dde8c (patch)
tree18d263f9e1f1a851a1cd13851a2acba48b2e1fe6 /linux
parent92976e1b4ab184ff6cf70d7bd9944ae5050c4fc3 (diff)
2000-07-04 Marcus Brinkmann <marcus@gnu.org>
* debian/changelog: Add entry for new Debian upload. * linux/dev/drivers/scsi/seagate.c (WRITE_CONTROL, WRITE_DATA): Added from linux 2.2.15. (__asm__ constructs): Replace with equivalent C code from linux 2.2.15 to support gcc-2.95. * linux/src/drivers/scsi/in2000.h: Update asm code to linux 2.2.15. * linux/src/drivers/scsi/ppa.c: Replace asm code with equivalent C code from linux 2.2.15. 2000-02-06 Stefan Weil <stefan.weil@de.heidelberg.com> * device/subrs.c: Fixed compiler warning. * ddb/db_output.c, kern/bootstrap.c, kern/debug.c, kern/printf.c: Replaced varargs.h by stdarg.h. Fixed prototypes (const char *fmt). * ddb/db_output.h: Use prototype for db_printf. * i386/Files: removed varargs.h. * i386/i386/pit.h: Fixed compiler warning. * i386/i386at/model_dep.c: Tried to fix compiler warning. * i386/include/mach/sa/sys/varargs.h: Removed. * i386/linux/Makefile.in: Removed delay.S, added delay.c. * linux/dev/include/asm-i386/segment.h: Support gcc-2.95. * linux/dev/include/asm-i386/string.h, linux/src/include/asm-i386/string.h: Update from linux-2.2.14. * linux/dev/lib/vsprintf.c: Fixed compiler warning. * linux/src/include/asm-i386/delay.h: Update from linux-2.2.14. * linux/src/arch/i386/lib/delay.c: Copy from linux-2.2.14. * linux/src/include/asm-i386/string.h: Update from linux-2.2.14.
Diffstat (limited to 'linux')
-rw-r--r--linux/Files2
-rw-r--r--linux/dev/drivers/scsi/seagate.c178
-rw-r--r--linux/dev/include/asm-i386/segment.h24
-rw-r--r--linux/dev/include/asm-i386/string.h314
-rw-r--r--linux/dev/lib/vsprintf.c18
-rw-r--r--linux/src/drivers/scsi/in2000.h23
-rw-r--r--linux/src/drivers/scsi/ppa.c129
-rw-r--r--linux/src/include/asm-i386/delay.h63
-rw-r--r--linux/src/include/asm-i386/string.h318
9 files changed, 301 insertions, 768 deletions
diff --git a/linux/Files b/linux/Files
index f18408a..0fdc016 100644
--- a/linux/Files
+++ b/linux/Files
@@ -413,7 +413,7 @@ linux/src/kernel/softirq.c
linux/src/kernel/dma.c
linux/src/arch/i386/kernel/irq.c
linux/src/arch/i386/kernel/bios32.c
-linux/src/arch/i386/lib/delay.S
+linux/src/arch/i386/lib/delay.c
linux/src/arch/i386/lib/semaphore.S
linux/src/lib/ctype.c
linux/src/lib/vsprintf.c
diff --git a/linux/dev/drivers/scsi/seagate.c b/linux/dev/drivers/scsi/seagate.c
index a5acbee..c7321ea 100644
--- a/linux/dev/drivers/scsi/seagate.c
+++ b/linux/dev/drivers/scsi/seagate.c
@@ -142,6 +142,8 @@ static unsigned char irq = IRQ;
#define STATUS (*(volatile unsigned char *) st0x_cr_sr)
#define CONTROL STATUS
#define DATA (*(volatile unsigned char *) st0x_dr)
+#define WRITE_CONTROL(d) { writeb((d), st0x_cr_sr); }
+#define WRITE_DATA(d) { writeb((d), st0x_dr); }
void st0x_setup (char *str, int *ints) {
controller_type = SEAGATE;
@@ -1097,24 +1099,19 @@ if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
SCint->transfersize, len, data);
#endif
- __asm__("
- cld;
-"
+ {
#ifdef FAST32
-" shr $2, %%ecx;
-1: lodsl;
- movl %%eax, (%%edi);
-"
+ unsigned int *iop = phys_to_virt (st0x_dr);
+ const unsigned int *dp = (unsigned int *) data;
+ int xferlen = transfersize >> 2;
#else
-"1: lodsb;
- movb %%al, (%%edi);
-"
+ unsigned char *iop = phys_to_virt (st0x_dr);
+ const unsigned char *dp = data;
+ int xferlen = transfersize;
#endif
-" loop 1b;" : :
- /* input */
- "D" (st0x_dr), "S" (data), "c" (SCint->transfersize) :
- /* clobbered */
- "eax", "ecx", "esi" );
+ for (; xferlen; --xferlen)
+ *iop = *dp++;
+ }
len -= transfersize;
data += transfersize;
@@ -1133,55 +1130,20 @@ if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
* We loop as long as we are in a data out phase, there is data to send,
* and BSY is still active.
*/
- __asm__ (
-
-/*
- Local variables :
- len = ecx
- data = esi
- st0x_cr_sr = ebx
- st0x_dr = edi
-
- Test for any data here at all.
-*/
- "\torl %%ecx, %%ecx
- jz 2f
-
- cld
-
- movl " SYMBOL_NAME_STR(st0x_cr_sr) ", %%ebx
- movl " SYMBOL_NAME_STR(st0x_dr) ", %%edi
-
-1: movb (%%ebx), %%al\n"
-/*
- Test for BSY
-*/
-
- "\ttest $1, %%al
- jz 2f\n"
-/*
- Test for data out phase - STATUS & REQ_MASK should be REQ_DATAOUT, which is 0.
-*/
- "\ttest $0xe, %%al
- jnz 2f \n"
-/*
- Test for REQ
-*/
- "\ttest $0x10, %%al
- jz 1b
- lodsb
- movb %%al, (%%edi)
- loop 1b
-
-2:
- ":
-/* output */
-"=S" (data), "=c" (len) :
-/* input */
-"0" (data), "1" (len) :
-/* clobbered */
-"eax", "ebx", "edi");
+ while (len)
+ {
+ unsigned char stat;
+
+ stat = STATUS;
+ if (!(stat & STAT_BSY) || ((stat & REQ_MASK) != REQ_DATAOUT))
+ break;
+ if (stat & STAT_REQ)
+ {
+ WRITE_DATA (*data++);
+ --len;
+ }
+ }
}
if (!len && nobuffs) {
@@ -1223,25 +1185,19 @@ if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
" len = %d, data = %08x\n", hostno, SCint->underflow,
SCint->transfersize, len, data);
#endif
- __asm__("
- cld;
-"
+ {
#ifdef FAST32
-" shr $2, %%ecx;
-1: movl (%%esi), %%eax;
- stosl;
-"
+ const unsigned int *iop = phys_to_virt (st0x_dr);
+ unsigned int *dp = (unsigned int *) data;
+ int xferlen = len >> 2;
#else
-"1: movb (%%esi), %%al;
- stosb;
-"
+ const unsigned char *iop = phys_to_virt (st0x_dr);
+ unsigned char *dp = data;
+ int xferlen = len;
#endif
-
-" loop 1b;" : :
- /* input */
- "S" (st0x_dr), "D" (data), "c" (SCint->transfersize) :
- /* clobbered */
- "eax", "ecx", "edi");
+ for (; xferlen; --xferlen)
+ *dp++ = *iop;
+ }
len -= transfersize;
data += transfersize;
@@ -1271,57 +1227,19 @@ if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
* and BSY is still active
*/
- __asm__ (
-/*
- Local variables :
- ecx = len
- edi = data
- esi = st0x_cr_sr
- ebx = st0x_dr
-
- Test for room to read
-*/
- "\torl %%ecx, %%ecx
- jz 2f
-
- cld
- movl " SYMBOL_NAME_STR(st0x_cr_sr) ", %%esi
- movl " SYMBOL_NAME_STR(st0x_dr) ", %%ebx
-
-1: movb (%%esi), %%al\n"
-/*
- Test for BSY
-*/
-
- "\ttest $1, %%al
- jz 2f\n"
-
-/*
- Test for data in phase - STATUS & REQ_MASK should be REQ_DATAIN, = STAT_IO, which is 4.
-*/
- "\tmovb $0xe, %%ah
- andb %%al, %%ah
- cmpb $0x04, %%ah
- jne 2f\n"
-
-/*
- Test for REQ
-*/
- "\ttest $0x10, %%al
- jz 1b
-
- movb (%%ebx), %%al
- stosb
- loop 1b\n"
-
-"2:\n"
- :
-/* output */
-"=D" (data), "=c" (len) :
-/* input */
-"0" (data), "1" (len) :
-/* clobbered */
-"eax","ebx", "esi");
+ while (len)
+ {
+ unsigned char stat;
+
+ stat = STATUS;
+ if (!(stat & STAT_BSY) || ((stat & REQ_MASK) != REQ_DATAIN))
+ break;
+ if (stat & STAT_REQ)
+ {
+ *data++ = DATA;
+ --len;
+ }
+ }
#if (DEBUG & PHASE_DATAIN)
printk("scsi%d: transfered -= %d\n", hostno, len);
diff --git a/linux/dev/include/asm-i386/segment.h b/linux/dev/include/asm-i386/segment.h
index 73952b0..db06caa 100644
--- a/linux/dev/include/asm-i386/segment.h
+++ b/linux/dev/include/asm-i386/segment.h
@@ -92,6 +92,7 @@ static inline unsigned long __get_user(const void * y, int size)
}
}
+#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)
static inline void __generic_memcpy_tofs(void * to, const void * from, unsigned long n)
{
__asm__ volatile
@@ -272,6 +273,29 @@ __asm__("cld\n\t" \
__constant_memcpy_tofs((to),(from),(n)) : \
__generic_memcpy_tofs((to),(from),(n)))
+
+#else /* code for gcc-2.95.x and newer follows */
+
+static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
+{
+ char *d = (char *)to;
+ const char *s = (const char *)from;
+ while (n-- > 0) {
+ *d++ = __get_user(s++, 1);
+ }
+}
+
+static inline void memcpy_tofs(void * to, const void * from, unsigned long n)
+{
+ char *d = (char *)to;
+ const char *s = (const char *)from;
+ while (n-- > 0) {
+ __put_user(*s++, d++, 1);
+ }
+}
+
+#endif /* not gcc-2.95 */
+
/*
* These are deprecated..
*
diff --git a/linux/dev/include/asm-i386/string.h b/linux/dev/include/asm-i386/string.h
index 144e86e..8417d4a 100644
--- a/linux/dev/include/asm-i386/string.h
+++ b/linux/dev/include/asm-i386/string.h
@@ -23,26 +23,29 @@
* set, making the functions fast and clean. String instructions have been
* used through-out, making for "slightly" unclear code :-)
*
- * Copyright (C) 1991, 1992 Linus Torvalds
+ * NO Copyright (C) 1991, 1992 Linus Torvalds,
+ * consider these trivial functions to be PD.
*/
#define __HAVE_ARCH_STRCPY
extern inline char * strcpy(char * dest,const char *src)
{
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n"
"1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
- : /* no output */
- :"S" (src),"D" (dest):"si","di","ax","memory");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2)
+ :"0" (src),"1" (dest) : "memory");
return dest;
}
#define __HAVE_ARCH_STRNCPY
extern inline char * strncpy(char * dest,const char *src,size_t count)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n"
"1:\tdecl %2\n\t"
@@ -54,14 +57,15 @@ __asm__ __volatile__(
"rep\n\t"
"stosb\n"
"2:"
- : /* no output */
- :"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory");
+ : "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
+ :"0" (src),"1" (dest),"2" (count) : "memory");
return dest;
}
#define __HAVE_ARCH_STRCAT
extern inline char * strcat(char * dest,const char * src)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n\t"
"repne\n\t"
@@ -71,20 +75,21 @@ __asm__ __volatile__(
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
- : /* no output */
- :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+ : "0" (src), "1" (dest), "2" (0), "3" (0xffffffff):"memory");
return dest;
}
#define __HAVE_ARCH_STRNCAT
extern inline char * strncat(char * dest,const char * src,size_t count)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n\t"
"repne\n\t"
"scasb\n\t"
"decl %1\n\t"
- "movl %4,%3\n"
+ "movl %8,%3\n"
"1:\tdecl %3\n\t"
"js 2f\n\t"
"lodsb\n\t"
@@ -93,15 +98,16 @@ __asm__ __volatile__(
"jne 1b\n"
"2:\txorl %2,%2\n\t"
"stosb"
- : /* no output */
- :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
- :"si","di","ax","cx","memory");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+ : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+ : "memory");
return dest;
}
#define __HAVE_ARCH_STRCMP
extern inline int strcmp(const char * cs,const char * ct)
{
+int d0, d1;
register int __res;
__asm__ __volatile__(
"cld\n"
@@ -113,9 +119,10 @@ __asm__ __volatile__(
"xorl %%eax,%%eax\n\t"
"jmp 3f\n"
"2:\tsbbl %%eax,%%eax\n\t"
- "orb $1,%%eax\n"
+ "orb $1,%%al\n"
"3:"
- :"=a" (__res):"S" (cs),"D" (ct):"si","di");
+ :"=a" (__res), "=&S" (d0), "=&D" (d1)
+ :"1" (cs),"2" (ct));
return __res;
}
@@ -123,6 +130,7 @@ return __res;
extern inline int strncmp(const char * cs,const char * ct,size_t count)
{
register int __res;
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n"
"1:\tdecl %3\n\t"
@@ -137,13 +145,15 @@ __asm__ __volatile__(
"3:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n"
"4:"
- :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx");
+ :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
+ :"1" (cs),"2" (ct),"3" (count));
return __res;
}
#define __HAVE_ARCH_STRCHR
extern inline char * strchr(const char * s, int c)
{
+int d0;
register char * __res;
__asm__ __volatile__(
"cld\n\t"
@@ -156,13 +166,14 @@ __asm__ __volatile__(
"movl $1,%1\n"
"2:\tmovl %1,%0\n\t"
"decl %0"
- :"=a" (__res):"S" (s),"0" (c):"si");
+ :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
return __res;
}
#define __HAVE_ARCH_STRRCHR
extern inline char * strrchr(const char * s, int c)
{
+int d0, d1;
register char * __res;
__asm__ __volatile__(
"cld\n\t"
@@ -173,123 +184,14 @@ __asm__ __volatile__(
"leal -1(%%esi),%0\n"
"2:\ttestb %%al,%%al\n\t"
"jne 1b"
- :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSPN
-extern inline size_t strspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "je 1b\n"
- "2:\tdecl %0"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRCSPN
-extern inline size_t strcspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 1b\n"
- "2:\tdecl %0"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRPBRK
-extern inline char * strpbrk(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 1b\n\t"
- "decl %0\n\t"
- "jmp 3f\n"
- "2:\txorl %0,%0\n"
- "3:"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSTR
-extern inline char * strstr(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t" \
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */
- "movl %%ecx,%%edx\n"
- "1:\tmovl %4,%%edi\n\t"
- "movl %%esi,%%eax\n\t"
- "movl %%edx,%%ecx\n\t"
- "repe\n\t"
- "cmpsb\n\t"
- "je 2f\n\t" /* also works for empty string, see above */
- "xchgl %%eax,%%esi\n\t"
- "incl %%esi\n\t"
- "cmpb $0,-1(%%eax)\n\t"
- "jne 1b\n\t"
- "xorl %%eax,%%eax\n\t"
- "2:"
- :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"D" (ct),
- "g" (*cs), "g" (*ct)
- :"cx","dx","di","si");
+ :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c));
return __res;
}
#define __HAVE_ARCH_STRLEN
extern inline size_t strlen(const char * s)
{
+int d0;
register int __res;
__asm__ __volatile__(
"cld\n\t"
@@ -297,86 +199,26 @@ __asm__ __volatile__(
"scasb\n\t"
"notl %0\n\t"
"decl %0"
- :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRTOK
-extern inline char * strtok(char * s,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "testl %1,%1\n\t"
- "jne 1f\n\t"
- "testl %0,%0\n\t"
- "je 8f\n\t"
- "movl %0,%1\n"
- "1:\txorl %0,%0\n\t"
- "movl $-1,%%ecx\n\t"
- "xorl %%eax,%%eax\n\t"
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "je 7f\n\t" /* empty delimiter-string */
- "movl %%ecx,%%edx\n"
- "2:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 7f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "je 2b\n\t"
- "decl %1\n\t"
- "cmpb $0,(%1)\n\t"
- "je 7f\n\t"
- "movl %1,%0\n"
- "3:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 5f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 3b\n\t"
- "decl %1\n\t"
- "cmpb $0,(%1)\n\t"
- "je 5f\n\t"
- "movb $0,(%1)\n\t"
- "incl %1\n\t"
- "jmp 6f\n"
- "5:\txorl %1,%1\n"
- "6:\tcmpb $0,(%0)\n\t"
- "jne 7f\n\t"
- "xorl %0,%0\n"
- "7:\ttestl %0,%0\n\t"
- "jne 8f\n\t"
- "movl %0,%1\n"
- "8:"
- :"=b" (__res),"=S" (___strtok)
- :"0" (___strtok),"1" (s),"g" (ct)
- :"ax","cx","dx","di","memory");
+ :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
return __res;
}
extern inline void * __memcpy(void * to, const void * from, size_t n)
{
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n\t"
"rep ; movsl\n\t"
- "testb $2,%b1\n\t"
+ "testb $2,%b4\n\t"
"je 1f\n\t"
"movsw\n"
- "1:\ttestb $1,%b1\n\t"
+ "1:\ttestb $1,%b4\n\t"
"je 2f\n\t"
"movsb\n"
"2:"
- : /* no output */
- :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from)
- : "cx","di","si","memory");
+ : "=&c" (d0), "=&D" (d1), "=&S" (d2)
+ :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+ : "memory");
return (to);
}
@@ -402,6 +244,10 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n)
case 4:
*(unsigned long *)to = *(const unsigned long *)from;
return to;
+ case 6: /* for Ethernet addresses */
+ *(unsigned long *)to = *(const unsigned long *)from;
+ *(2+(unsigned short *)to) = *(2+(const unsigned short *)from);
+ return to;
case 8:
*(unsigned long *)to = *(const unsigned long *)from;
*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
@@ -426,19 +272,23 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n)
return to;
}
#define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__( \
+ "cld\n\t" \
"rep ; movsl" \
x \
- : /* no outputs */ \
- : "c" (n/4),"D" ((long) to),"S" ((long) from) \
- : "cx","di","si","memory");
-
+ : "=&c" (d0), "=&D" (d1), "=&S" (d2) \
+ : "0" (n/4),"1" ((long) to),"2" ((long) from) \
+ : "memory");
+{
+ int d0, d1, d2;
switch (n % 4) {
case 0: COMMON(""); return to;
case 1: COMMON("\n\tmovsb"); return to;
case 2: COMMON("\n\tmovsw"); return to;
default: COMMON("\n\tmovsw\n\tmovsb"); return to;
}
+}
+
#undef COMMON
}
@@ -451,25 +301,26 @@ __asm__("cld\n\t" \
#define __HAVE_ARCH_MEMMOVE
extern inline void * memmove(void * dest,const void * src, size_t n)
{
+int d0, d1, d2;
if (dest<src)
__asm__ __volatile__(
"cld\n\t"
"rep\n\t"
"movsb"
- : /* no output */
- :"c" (n),"S" (src),"D" (dest)
- :"cx","si","di");
+ : "=&c" (d0), "=&S" (d1), "=&D" (d2)
+ :"0" (n),"1" (src),"2" (dest)
+ : "memory");
else
__asm__ __volatile__(
"std\n\t"
"rep\n\t"
"movsb\n\t"
"cld"
- : /* no output */
- :"c" (n),
- "S" (n-1+(const char *)src),
- "D" (n-1+(char *)dest)
- :"cx","si","di","memory");
+ : "=&c" (d0), "=&S" (d1), "=&D" (d2)
+ :"0" (n),
+ "1" (n-1+(const char *)src),
+ "2" (n-1+(char *)dest)
+ :"memory");
return dest;
}
@@ -478,6 +329,7 @@ return dest;
#define __HAVE_ARCH_MEMCHR
extern inline void * memchr(const void * cs,int c,size_t count)
{
+int d0;
register void * __res;
if (!count)
return NULL;
@@ -488,20 +340,20 @@ __asm__ __volatile__(
"je 1f\n\t"
"movl $1,%0\n"
"1:\tdecl %0"
- :"=D" (__res):"a" (c),"D" (cs),"c" (count)
- :"cx");
+ :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count));
return __res;
}
extern inline void * __memset_generic(void * s, char c,size_t count)
{
+int d0, d1;
__asm__ __volatile__(
"cld\n\t"
"rep\n\t"
"stosb"
- : /* no output */
- :"a" (c),"D" (s),"c" (count)
- :"cx","di","memory");
+ : "=&c" (d0), "=&D" (d1)
+ :"a" (c),"1" (s),"0" (count)
+ :"memory");
return s;
}
@@ -515,19 +367,20 @@ return s;
*/
extern inline void * __constant_c_memset(void * s, unsigned long c, size_t count)
{
+int d0, d1;
__asm__ __volatile__(
"cld\n\t"
"rep ; stosl\n\t"
- "testb $2,%b1\n\t"
+ "testb $2,%b3\n\t"
"je 1f\n\t"
"stosw\n"
- "1:\ttestb $1,%b1\n\t"
+ "1:\ttestb $1,%b3\n\t"
"je 2f\n\t"
"stosb\n"
"2:"
- : /* no output */
- :"a" (c), "q" (count), "c" (count/4), "D" ((long) s)
- :"cx","di","memory");
+ : "=&c" (d0), "=&D" (d1)
+ :"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
+ :"memory");
return (s);
}
@@ -535,20 +388,20 @@ return (s);
#define __HAVE_ARCH_STRNLEN
extern inline size_t strnlen(const char * s, size_t count)
{
+int d0;
register int __res;
__asm__ __volatile__(
- "movl %1,%0\n\t"
+ "movl %2,%0\n\t"
"jmp 2f\n"
"1:\tcmpb $0,(%0)\n\t"
"je 3f\n\t"
"incl %0\n"
- "2:\tdecl %2\n\t"
- "cmpl $-1,%2\n\t"
+ "2:\tdecl %1\n\t"
+ "cmpl $-1,%1\n\t"
"jne 1b\n"
- "3:\tsubl %1,%0"
- :"=a" (__res)
- :"c" (s),"d" (count)
- :"dx");
+ "3:\tsubl %2,%0"
+ :"=a" (__res), "=&d" (d0)
+ :"c" (s),"1" (count));
return __res;
}
/* end of additional stuff */
@@ -577,19 +430,22 @@ extern inline void * __constant_c_and_count_memset(void * s, unsigned long patte
return s;
}
#define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__("cld\n\t" \
"rep ; stosl" \
x \
- : /* no outputs */ \
- : "a" (pattern),"c" (count/4),"D" ((long) s) \
- : "cx","di","memory")
-
+ : "=&c" (d0), "=&D" (d1) \
+ : "a" (pattern),"0" (count/4),"1" ((long) s) \
+ : "memory")
+{
+ int d0, d1;
switch (count % 4) {
case 0: COMMON(""); return s;
case 1: COMMON("\n\tstosb"); return s;
case 2: COMMON("\n\tstosw"); return s;
default: COMMON("\n\tstosw\n\tstosb"); return s;
}
+}
+
#undef COMMON
}
@@ -606,7 +462,7 @@ __asm__("cld\n\t" \
#define __HAVE_ARCH_MEMSET
#define memset(s, c, count) \
(__builtin_constant_p(c) ? \
- __constant_c_x_memset((s),(0x01010101UL*(unsigned char)c),(count)) : \
+ __constant_c_x_memset((s),(0x01010101UL*(unsigned char)(c)),(count)) : \
__memset((s),(c),(count)))
/*
diff --git a/linux/dev/lib/vsprintf.c b/linux/dev/lib/vsprintf.c
index 096e2ec..0beb747 100644
--- a/linux/dev/lib/vsprintf.c
+++ b/linux/dev/lib/vsprintf.c
@@ -131,13 +131,17 @@ number (char *str, long num, int base, int size, int precision, int type)
if (sign)
*str++ = sign;
if (type & SPECIAL)
- if (base == 8)
- *str++ = '0';
- else if (base == 16)
- {
- *str++ = '0';
- *str++ = digits[33];
- }
+ {
+ if (base == 8)
+ {
+ *str++ = '0';
+ }
+ else if (base == 16)
+ {
+ *str++ = '0';
+ *str++ = digits[33];
+ }
+ }
if (!(type & LEFT))
while (size-- > 0)
*str++ = c;
diff --git a/linux/src/drivers/scsi/in2000.h b/linux/src/drivers/scsi/in2000.h
index 2a6ad29..52a86e0 100644
--- a/linux/src/drivers/scsi/in2000.h
+++ b/linux/src/drivers/scsi/in2000.h
@@ -62,29 +62,34 @@
*/
#define FAST_READ2_IO() \
+({ \
+int __dummy_1,__dummy_2; \
__asm__ __volatile__ ("\n \
cld \n \
orl %%ecx, %%ecx \n \
jz 1f \n \
rep \n \
- insw %%dx \n \
+ insw (%%dx),%%es:(%%edi) \n \
1: " \
- : "=D" (sp) /* output */ \
- : "d" (f), "D" (sp), "c" (i) /* input */ \
- : "edx", "ecx", "edi" ) /* trashed */
+ : "=D" (sp) ,"=c" (__dummy_1) ,"=d" (__dummy_2) /* output */ \
+ : "2" (f), "0" (sp), "1" (i) /* input */ \
+ ); /* trashed */ \
+})
#define FAST_WRITE2_IO() \
+({ \
+int __dummy_1,__dummy_2; \
__asm__ __volatile__ ("\n \
cld \n \
orl %%ecx, %%ecx \n \
jz 1f \n \
rep \n \
- outsw %%dx \n \
+ outsw %%ds:(%%esi),(%%dx) \n \
1: " \
- : "=S" (sp) /* output */ \
- : "d" (f), "S" (sp), "c" (i) /* input */ \
- : "edx", "ecx", "esi" ) /* trashed */
-
+ : "=S" (sp) ,"=c" (__dummy_1) ,"=d" (__dummy_2)/* output */ \
+ : "2" (f), "0" (sp), "1" (i) /* input */ \
+ ); /* trashed */ \
+})
/* IN2000 io_port offsets */
#define IO_WD_ASR 0x00 /* R - 3393 auxstat reg */
diff --git a/linux/src/drivers/scsi/ppa.c b/linux/src/drivers/scsi/ppa.c
index 98749dd..5063a67 100644
--- a/linux/src/drivers/scsi/ppa.c
+++ b/linux/src/drivers/scsi/ppa.c
@@ -470,41 +470,13 @@ static inline void ecp_sync(unsigned short ppb)
static inline int ppa_byte_out(unsigned short base, char *buffer, unsigned int len)
{
- /*
- * %eax scratch
- * %ebx Data to transfer
- * %ecx Counter (Don't touch!!)
- * %edx Port
- * %esi Source buffer (mem pointer)
- *
- * In case you are wondering what the last line of the asm does...
- * <output allocation> : <input allocation> : <trashed registers>
- */
- asm("shr $2,%%ecx\n" \
- " jz .no_more_bulk_bo\n" \
- " .align 4\n" \
- ".loop_bulk_bo:\n" \
- " movl (%%esi),%%ebx\n" \
- BYTE_OUT(%%bl) \
- BYTE_OUT(%%bh) \
- " rorl $16,%%ebx\n" \
- BYTE_OUT(%%bl) \
- BYTE_OUT(%%bh) \
- " addl $4,%%esi\n" \
- " loop .loop_bulk_bo\n" \
- " .align 4\n" \
- ".no_more_bulk_bo:" \
- : "=S"(buffer): "c"(len), "d"(base), "S"(buffer):"eax", "ebx", "ecx");
-
- asm("andl $3,%%ecx\n" \
- " jz .no_more_loose_bo\n" \
- " .align 4\n" \
- ".loop_loose_bo:\n" \
- BYTE_OUT((%%esi)) \
- " incl %%esi\n" \
- " loop .loop_loose_bo\n" \
- ".no_more_loose_bo:\n" \
- : /* no output */ : "c"(len), "d"(base), "S"(buffer):"eax", "ebx", "ecx");
+ int i;
+
+ for (i = len; i; i--) {
+ w_dtr(base, *buffer++);
+ w_ctr(base, 0xe);
+ w_ctr(base, 0xc);
+ }
return 1; /* All went well - we hope! */
}
@@ -520,42 +492,13 @@ static inline int ppa_byte_out(unsigned short base, char *buffer, unsigned int l
static inline int ppa_byte_in(unsigned short base, char *buffer, int len)
{
- /*
- * %eax scratch
- * %ebx Data to transfer
- * %ecx Counter (Don't touch!!)
- * %edx Port
- * %esi Source buffer (mem pointer)
- *
- * In case you are wondering what the last line of the asm does...
- * <output allocation> : <input allocation> : <trashed registers>
- */
- asm("shr $2,%%ecx\n" \
- " jz .no_more_bulk_bi\n" \
- " .align 4\n" \
- ".loop_bulk_bi:\n" \
- BYTE_IN(%%bl) \
- BYTE_IN(%%bh) \
- " rorl $16,%%ebx\n" \
- BYTE_IN(%%bl) \
- BYTE_IN(%%bh) \
- " rorl $16,%%ebx\n" \
- " movl %%ebx,(%%esi)\n" \
- " addl $4,%%esi\n" \
- " loop .loop_bulk_bi\n" \
- " .align 4\n" \
- ".no_more_bulk_bi:" \
- : "=S"(buffer): "c"(len), "d"(base), "S"(buffer):"eax", "ebx", "ecx");
-
- asm("andl $3,%%ecx\n" \
- " jz .no_more_loose_bi\n" \
- " .align 4\n" \
- ".loop_loose_bi:\n" \
- BYTE_IN((%%esi)) \
- " incl %%esi\n" \
- " loop .loop_loose_bi\n" \
- ".no_more_loose_bi:\n" \
- : /* no output */ : "c"(len), "d"(base), "S"(buffer):"eax", "ebx", "ecx");
+ int i;
+
+ for (i = len; i; i--) {
+ *buffer++ = r_dtr(base);
+ w_ctr(base, 0x27);
+ w_ctr(base, 0x25);
+ }
return 1; /* All went well - we hope! */
}
@@ -577,42 +520,14 @@ static inline int ppa_byte_in(unsigned short base, char *buffer, int len)
static inline int ppa_nibble_in(unsigned short str_p, char *buffer, int len)
{
- /*
- * %eax scratch
- * %ebx Data to transfer
- * %ecx Counter (Don't touch!!)
- * %edx Port
- * %esi Source buffer (mem pointer)
- *
- * In case you are wondering what the last line of the asm does...
- * <output allocation> : <input allocation> : <trashed registers>
- */
- asm("shr $2,%%ecx\n" \
- " jz .no_more_bulk_ni\n" \
- " .align 4\n" \
- ".loop_bulk_ni:\n" \
- NIBBLE_IN(%%bl) \
- NIBBLE_IN(%%bh) \
- " rorl $16,%%ebx\n" \
- NIBBLE_IN(%%bl) \
- NIBBLE_IN(%%bh) \
- " rorl $16,%%ebx\n" \
- " movl %%ebx,(%%esi)\n" \
- " addl $4,%%esi\n" \
- " loop .loop_bulk_ni\n" \
- " .align 4\n" \
- ".no_more_bulk_ni:" \
- : "=S"(buffer): "c"(len), "d"(str_p), "S"(buffer):"eax", "ebx", "ecx");
-
- asm("andl $3,%%ecx\n" \
- " jz .no_more_loose_ni\n" \
- " .align 4\n" \
- ".loop_loose_ni:\n" \
- NIBBLE_IN((%%esi)) \
- " incl %%esi\n" \
- " loop .loop_loose_ni\n" \
- ".no_more_loose_ni:\n" \
- : /* no output */ : "c"(len), "d"(str_p), "S"(buffer):"eax", "ebx", "ecx");
+ for (; len; len--) {
+ unsigned char h;
+
+ w_ctr(base, 0x4);
+ h = r_str(base) & 0xf0;
+ w_ctr(base, 0x6);
+ *buffer++ = h | ((r_str(base) & 0xf0) >> 4);
+ }
return 1; /* All went well - we hope! */
}
#else /* Old style C routines */
diff --git a/linux/src/include/asm-i386/delay.h b/linux/src/include/asm-i386/delay.h
index 2f4a41b..2166c4c 100644
--- a/linux/src/include/asm-i386/delay.h
+++ b/linux/src/include/asm-i386/delay.h
@@ -4,60 +4,15 @@
/*
* Copyright (C) 1993 Linus Torvalds
*
- * Delay routines, using a pre-computed "loops_per_second" value.
+ * Delay routines calling functions in arch/i386/lib/delay.c
*/
-
-#include <linux/linkage.h>
-
-#ifdef __SMP__
-#include <asm/smp.h>
-#endif
-
-extern void __do_delay(void); /* Special register call calling convention */
-
-extern __inline__ void __delay(int loops)
-{
- __asm__ __volatile__(
- "call " SYMBOL_NAME_STR(__do_delay)
- :/* no outputs */
- :"a" (loops)
- :"ax");
-}
-
-/*
- * division by multiplication: you don't have to worry about
- * loss of precision.
- *
- * Use only for very small delays ( < 1 msec). Should probably use a
- * lookup table, really, as the multiplications take much too long with
- * short delays. This is a "reasonable" implementation, though (and the
- * first constant multiplications gets optimized away if the delay is
- * a constant)
- */
-extern __inline__ void udelay(unsigned long usecs)
-{
- usecs *= 0x000010c6; /* 2**32 / 1000000 */
- __asm__("mull %0"
- :"=d" (usecs)
-#ifdef __SMP__
- :"a" (usecs),"0" (cpu_data[smp_processor_id()].udelay_val)
-#else
- :"a" (usecs),"0" (loops_per_sec)
-#endif
- :"ax");
-
- __delay(usecs);
-}
-
-extern __inline__ unsigned long muldiv(unsigned long a, unsigned long b, unsigned long c)
-{
- __asm__("mull %1 ; divl %2"
- :"=a" (a)
- :"d" (b),
- "r" (c),
- "0" (a)
- :"dx");
- return a;
-}
+
+extern void __udelay(unsigned long usecs);
+extern void __const_udelay(unsigned long usecs);
+extern void __delay(unsigned long loops);
+
+#define udelay(n) (__builtin_constant_p(n) ? \
+ __const_udelay((n) * 0x10c6ul) : \
+ __udelay(n))
#endif /* defined(_I386_DELAY_H) */
diff --git a/linux/src/include/asm-i386/string.h b/linux/src/include/asm-i386/string.h
index 1929353..8417d4a 100644
--- a/linux/src/include/asm-i386/string.h
+++ b/linux/src/include/asm-i386/string.h
@@ -23,26 +23,29 @@
* set, making the functions fast and clean. String instructions have been
* used through-out, making for "slightly" unclear code :-)
*
- * Copyright (C) 1991, 1992 Linus Torvalds
+ * NO Copyright (C) 1991, 1992 Linus Torvalds,
+ * consider these trivial functions to be PD.
*/
#define __HAVE_ARCH_STRCPY
extern inline char * strcpy(char * dest,const char *src)
{
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n"
"1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
- : /* no output */
- :"S" (src),"D" (dest):"si","di","ax","memory");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2)
+ :"0" (src),"1" (dest) : "memory");
return dest;
}
#define __HAVE_ARCH_STRNCPY
extern inline char * strncpy(char * dest,const char *src,size_t count)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n"
"1:\tdecl %2\n\t"
@@ -54,14 +57,15 @@ __asm__ __volatile__(
"rep\n\t"
"stosb\n"
"2:"
- : /* no output */
- :"S" (src),"D" (dest),"c" (count):"si","di","ax","cx","memory");
+ : "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3)
+ :"0" (src),"1" (dest),"2" (count) : "memory");
return dest;
}
#define __HAVE_ARCH_STRCAT
extern inline char * strcat(char * dest,const char * src)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n\t"
"repne\n\t"
@@ -71,20 +75,21 @@ __asm__ __volatile__(
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
- : /* no output */
- :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff):"si","di","ax","cx");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+ : "0" (src), "1" (dest), "2" (0), "3" (0xffffffff):"memory");
return dest;
}
#define __HAVE_ARCH_STRNCAT
extern inline char * strncat(char * dest,const char * src,size_t count)
{
+int d0, d1, d2, d3;
__asm__ __volatile__(
"cld\n\t"
"repne\n\t"
"scasb\n\t"
"decl %1\n\t"
- "movl %4,%3\n"
+ "movl %8,%3\n"
"1:\tdecl %3\n\t"
"js 2f\n\t"
"lodsb\n\t"
@@ -93,15 +98,16 @@ __asm__ __volatile__(
"jne 1b\n"
"2:\txorl %2,%2\n\t"
"stosb"
- : /* no output */
- :"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
- :"si","di","ax","cx","memory");
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+ : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+ : "memory");
return dest;
}
#define __HAVE_ARCH_STRCMP
extern inline int strcmp(const char * cs,const char * ct)
{
+int d0, d1;
register int __res;
__asm__ __volatile__(
"cld\n"
@@ -113,9 +119,10 @@ __asm__ __volatile__(
"xorl %%eax,%%eax\n\t"
"jmp 3f\n"
"2:\tsbbl %%eax,%%eax\n\t"
- "orb $1,%%eax\n"
+ "orb $1,%%al\n"
"3:"
- :"=a" (__res):"S" (cs),"D" (ct):"si","di");
+ :"=a" (__res), "=&S" (d0), "=&D" (d1)
+ :"1" (cs),"2" (ct));
return __res;
}
@@ -123,6 +130,7 @@ return __res;
extern inline int strncmp(const char * cs,const char * ct,size_t count)
{
register int __res;
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n"
"1:\tdecl %3\n\t"
@@ -137,13 +145,15 @@ __asm__ __volatile__(
"3:\tsbbl %%eax,%%eax\n\t"
"orb $1,%%al\n"
"4:"
- :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx");
+ :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
+ :"1" (cs),"2" (ct),"3" (count));
return __res;
}
#define __HAVE_ARCH_STRCHR
extern inline char * strchr(const char * s, int c)
{
+int d0;
register char * __res;
__asm__ __volatile__(
"cld\n\t"
@@ -156,13 +166,14 @@ __asm__ __volatile__(
"movl $1,%1\n"
"2:\tmovl %1,%0\n\t"
"decl %0"
- :"=a" (__res):"S" (s),"0" (c):"si");
+ :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c));
return __res;
}
#define __HAVE_ARCH_STRRCHR
extern inline char * strrchr(const char * s, int c)
{
+int d0, d1;
register char * __res;
__asm__ __volatile__(
"cld\n\t"
@@ -173,123 +184,14 @@ __asm__ __volatile__(
"leal -1(%%esi),%0\n"
"2:\ttestb %%al,%%al\n\t"
"jne 1b"
- :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSPN
-extern inline size_t strspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "je 1b\n"
- "2:\tdecl %0"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRCSPN
-extern inline size_t strcspn(const char * cs, const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 1b\n"
- "2:\tdecl %0"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res-cs;
-}
-
-#define __HAVE_ARCH_STRPBRK
-extern inline char * strpbrk(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "movl %%ecx,%%edx\n"
- "1:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 2f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 1b\n\t"
- "decl %0\n\t"
- "jmp 3f\n"
- "2:\txorl %0,%0\n"
- "3:"
- :"=S" (__res):"a" (0),"c" (0xffffffff),"0" (cs),"g" (ct)
- :"ax","cx","dx","di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRSTR
-extern inline char * strstr(const char * cs,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "cld\n\t" \
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */
- "movl %%ecx,%%edx\n"
- "1:\tmovl %4,%%edi\n\t"
- "movl %%esi,%%eax\n\t"
- "movl %%edx,%%ecx\n\t"
- "repe\n\t"
- "cmpsb\n\t"
- "je 2f\n\t" /* also works for empty string, see above */
- "xchgl %%eax,%%esi\n\t"
- "incl %%esi\n\t"
- "cmpb $0,-1(%%eax)\n\t"
- "jne 1b\n\t"
- "xorl %%eax,%%eax\n\t"
- "2:"
- :"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
- :"cx","dx","di","si");
+ :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c));
return __res;
}
#define __HAVE_ARCH_STRLEN
extern inline size_t strlen(const char * s)
{
+int d0;
register int __res;
__asm__ __volatile__(
"cld\n\t"
@@ -297,86 +199,26 @@ __asm__ __volatile__(
"scasb\n\t"
"notl %0\n\t"
"decl %0"
- :"=c" (__res):"D" (s),"a" (0),"0" (0xffffffff):"di");
-return __res;
-}
-
-#define __HAVE_ARCH_STRTOK
-extern inline char * strtok(char * s,const char * ct)
-{
-register char * __res;
-__asm__ __volatile__(
- "testl %1,%1\n\t"
- "jne 1f\n\t"
- "testl %0,%0\n\t"
- "je 8f\n\t"
- "movl %0,%1\n"
- "1:\txorl %0,%0\n\t"
- "movl $-1,%%ecx\n\t"
- "xorl %%eax,%%eax\n\t"
- "cld\n\t"
- "movl %4,%%edi\n\t"
- "repne\n\t"
- "scasb\n\t"
- "notl %%ecx\n\t"
- "decl %%ecx\n\t"
- "je 7f\n\t" /* empty delimiter-string */
- "movl %%ecx,%%edx\n"
- "2:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 7f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "je 2b\n\t"
- "decl %1\n\t"
- "cmpb $0,(%1)\n\t"
- "je 7f\n\t"
- "movl %1,%0\n"
- "3:\tlodsb\n\t"
- "testb %%al,%%al\n\t"
- "je 5f\n\t"
- "movl %4,%%edi\n\t"
- "movl %%edx,%%ecx\n\t"
- "repne\n\t"
- "scasb\n\t"
- "jne 3b\n\t"
- "decl %1\n\t"
- "cmpb $0,(%1)\n\t"
- "je 5f\n\t"
- "movb $0,(%1)\n\t"
- "incl %1\n\t"
- "jmp 6f\n"
- "5:\txorl %1,%1\n"
- "6:\tcmpb $0,(%0)\n\t"
- "jne 7f\n\t"
- "xorl %0,%0\n"
- "7:\ttestl %0,%0\n\t"
- "jne 8f\n\t"
- "movl %0,%1\n"
- "8:"
- :"=b" (__res),"=S" (___strtok)
- :"0" (___strtok),"1" (s),"g" (ct)
- :"ax","cx","dx","di","memory");
+ :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
return __res;
}
extern inline void * __memcpy(void * to, const void * from, size_t n)
{
+int d0, d1, d2;
__asm__ __volatile__(
"cld\n\t"
"rep ; movsl\n\t"
- "testb $2,%b1\n\t"
+ "testb $2,%b4\n\t"
"je 1f\n\t"
"movsw\n"
- "1:\ttestb $1,%b1\n\t"
+ "1:\ttestb $1,%b4\n\t"
"je 2f\n\t"
"movsb\n"
"2:"
- : /* no output */
- :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from)
- : "cx","di","si","memory");
+ : "=&c" (d0), "=&D" (d1), "=&S" (d2)
+ :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+ : "memory");
return (to);
}
@@ -402,6 +244,10 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n)
case 4:
*(unsigned long *)to = *(const unsigned long *)from;
return to;
+ case 6: /* for Ethernet addresses */
+ *(unsigned long *)to = *(const unsigned long *)from;
+ *(2+(unsigned short *)to) = *(2+(const unsigned short *)from);
+ return to;
case 8:
*(unsigned long *)to = *(const unsigned long *)from;
*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
@@ -426,19 +272,23 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n)
return to;
}
#define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__( \
+ "cld\n\t" \
"rep ; movsl" \
x \
- : /* no outputs */ \
- : "c" (n/4),"D" ((long) to),"S" ((long) from) \
- : "cx","di","si","memory");
-
+ : "=&c" (d0), "=&D" (d1), "=&S" (d2) \
+ : "0" (n/4),"1" ((long) to),"2" ((long) from) \
+ : "memory");
+{
+ int d0, d1, d2;
switch (n % 4) {
case 0: COMMON(""); return to;
case 1: COMMON("\n\tmovsb"); return to;
case 2: COMMON("\n\tmovsw"); return to;
- case 3: COMMON("\n\tmovsw\n\tmovsb"); return to;
+ default: COMMON("\n\tmovsw\n\tmovsb"); return to;
}
+}
+
#undef COMMON
}
@@ -451,25 +301,26 @@ __asm__("cld\n\t" \
#define __HAVE_ARCH_MEMMOVE
extern inline void * memmove(void * dest,const void * src, size_t n)
{
+int d0, d1, d2;
if (dest<src)
__asm__ __volatile__(
"cld\n\t"
"rep\n\t"
"movsb"
- : /* no output */
- :"c" (n),"S" (src),"D" (dest)
- :"cx","si","di");
+ : "=&c" (d0), "=&S" (d1), "=&D" (d2)
+ :"0" (n),"1" (src),"2" (dest)
+ : "memory");
else
__asm__ __volatile__(
"std\n\t"
"rep\n\t"
"movsb\n\t"
"cld"
- : /* no output */
- :"c" (n),
- "S" (n-1+(const char *)src),
- "D" (n-1+(char *)dest)
- :"cx","si","di","memory");
+ : "=&c" (d0), "=&S" (d1), "=&D" (d2)
+ :"0" (n),
+ "1" (n-1+(const char *)src),
+ "2" (n-1+(char *)dest)
+ :"memory");
return dest;
}
@@ -478,6 +329,7 @@ return dest;
#define __HAVE_ARCH_MEMCHR
extern inline void * memchr(const void * cs,int c,size_t count)
{
+int d0;
register void * __res;
if (!count)
return NULL;
@@ -488,20 +340,20 @@ __asm__ __volatile__(
"je 1f\n\t"
"movl $1,%0\n"
"1:\tdecl %0"
- :"=D" (__res):"a" (c),"D" (cs),"c" (count)
- :"cx");
+ :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count));
return __res;
}
extern inline void * __memset_generic(void * s, char c,size_t count)
{
+int d0, d1;
__asm__ __volatile__(
"cld\n\t"
"rep\n\t"
"stosb"
- : /* no output */
- :"a" (c),"D" (s),"c" (count)
- :"cx","di","memory");
+ : "=&c" (d0), "=&D" (d1)
+ :"a" (c),"1" (s),"0" (count)
+ :"memory");
return s;
}
@@ -515,19 +367,20 @@ return s;
*/
extern inline void * __constant_c_memset(void * s, unsigned long c, size_t count)
{
+int d0, d1;
__asm__ __volatile__(
"cld\n\t"
"rep ; stosl\n\t"
- "testb $2,%b1\n\t"
+ "testb $2,%b3\n\t"
"je 1f\n\t"
"stosw\n"
- "1:\ttestb $1,%b1\n\t"
+ "1:\ttestb $1,%b3\n\t"
"je 2f\n\t"
"stosb\n"
"2:"
- : /* no output */
- :"a" (c), "q" (count), "c" (count/4), "D" ((long) s)
- :"cx","di","memory");
+ : "=&c" (d0), "=&D" (d1)
+ :"a" (c), "q" (count), "0" (count/4), "1" ((long) s)
+ :"memory");
return (s);
}
@@ -535,20 +388,20 @@ return (s);
#define __HAVE_ARCH_STRNLEN
extern inline size_t strnlen(const char * s, size_t count)
{
+int d0;
register int __res;
__asm__ __volatile__(
- "movl %1,%0\n\t"
+ "movl %2,%0\n\t"
"jmp 2f\n"
"1:\tcmpb $0,(%0)\n\t"
"je 3f\n\t"
"incl %0\n"
- "2:\tdecl %2\n\t"
- "cmpl $-1,%2\n\t"
+ "2:\tdecl %1\n\t"
+ "cmpl $-1,%1\n\t"
"jne 1b\n"
- "3:\tsubl %1,%0"
- :"=a" (__res)
- :"c" (s),"d" (count)
- :"dx");
+ "3:\tsubl %2,%0"
+ :"=a" (__res), "=&d" (d0)
+ :"c" (s),"1" (count));
return __res;
}
/* end of additional stuff */
@@ -577,19 +430,22 @@ extern inline void * __constant_c_and_count_memset(void * s, unsigned long patte
return s;
}
#define COMMON(x) \
-__asm__("cld\n\t" \
+__asm__ __volatile__("cld\n\t" \
"rep ; stosl" \
x \
- : /* no outputs */ \
- : "a" (pattern),"c" (count/4),"D" ((long) s) \
- : "cx","di","memory")
-
+ : "=&c" (d0), "=&D" (d1) \
+ : "a" (pattern),"0" (count/4),"1" ((long) s) \
+ : "memory")
+{
+ int d0, d1;
switch (count % 4) {
case 0: COMMON(""); return s;
case 1: COMMON("\n\tstosb"); return s;
case 2: COMMON("\n\tstosw"); return s;
- case 3: COMMON("\n\tstosw\n\tstosb"); return s;
+ default: COMMON("\n\tstosw\n\tstosb"); return s;
}
+}
+
#undef COMMON
}
@@ -606,7 +462,7 @@ __asm__("cld\n\t" \
#define __HAVE_ARCH_MEMSET
#define memset(s, c, count) \
(__builtin_constant_p(c) ? \
- __constant_c_x_memset((s),(0x01010101UL*(unsigned char)c),(count)) : \
+ __constant_c_x_memset((s),(0x01010101UL*(unsigned char)(c)),(count)) : \
__memset((s),(c),(count)))
/*