From 91933a41184cd816cb8ce4d96cf8764ebd7dde8c Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Sun, 23 Jul 2000 00:34:12 +0000 Subject: 2000-07-04 Marcus Brinkmann * 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 * 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. --- ChangeLog | 30 ++++ ddb/db_output.c | 14 +- ddb/db_output.h | 6 +- debian/changelog | 10 ++ device/subrs.c | 2 +- i386/Files | 1 - i386/i386/pit.h | 6 +- i386/i386at/model_dep.c | 7 +- i386/linux/Makefile.in | 6 +- kern/bootstrap.c | 10 +- kern/debug.c | 20 +-- kern/printf.c | 27 +-- linux/Files | 2 +- linux/dev/drivers/scsi/seagate.c | 178 ++++++-------------- linux/dev/include/asm-i386/segment.h | 24 +++ linux/dev/include/asm-i386/string.h | 314 ++++++++++------------------------ linux/dev/lib/vsprintf.c | 18 +- linux/src/drivers/scsi/in2000.h | 23 ++- linux/src/drivers/scsi/ppa.c | 129 +++----------- linux/src/include/asm-i386/delay.h | 63 +------ linux/src/include/asm-i386/string.h | 318 ++++++++++------------------------- 21 files changed, 383 insertions(+), 825 deletions(-) diff --git a/ChangeLog b/ChangeLog index 890d197..483650d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2000-07-04 Marcus Brinkmann + + * 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 + + * 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. + 1999-10-08 Thomas Bushnell, BSG * linux/src/drivers/net/3c59x.c: Updated to version 0.99L of the diff --git a/ddb/db_output.c b/ddb/db_output.c index d7e416d..adaf249 100644 --- a/ddb/db_output.c +++ b/ddb/db_output.c @@ -35,8 +35,8 @@ * Printf and character output for debugger. */ +#include #include -#include #include #include #include @@ -209,16 +209,14 @@ extern void _doprnt(); /*VARARGS1*/ void -db_printf( fmt, va_alist) - char * fmt; - va_dcl +db_printf(const char *fmt, ...) { va_list listp; #ifdef db_printf_enter db_printf_enter(); /* optional multiP serialization */ #endif - va_start(listp); + va_start(listp, fmt); _doprnt(fmt, &listp, db_id_putc, db_radix, 0); va_end(listp); } @@ -227,12 +225,10 @@ db_printf( fmt, va_alist) /*VARARGS1*/ void -kdbprintf(fmt, va_alist) - char * fmt; - va_dcl +kdbprintf(const char *fmt, ...) { va_list listp; - va_start(listp); + va_start(listp, fmt); _doprnt(fmt, &listp, db_id_putc, db_radix, 0); va_end(listp); } diff --git a/ddb/db_output.h b/ddb/db_output.h index a3f0de0..b19f64d 100644 --- a/ddb/db_output.h +++ b/ddb/db_output.h @@ -35,10 +35,6 @@ extern void db_force_whitespace(); extern int db_print_position(); extern void db_end_line(); -#if 1 -extern void db_printf(); -#else -extern void db_printf( char *fmt, ...); -#endif +extern void db_printf( const char *fmt, ...); diff --git a/debian/changelog b/debian/changelog index 47ad0ef..e69928b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +gnumach (1:1.2-3) unstable; urgency=low + + * Snapshot from CVS 20000703. + * i386/i386at/kd.c: Receive 0xE0 scan codes (patch by Kalle Olavi Niemitalo). + * Patch to get it compile with gcc-2.95.1 or newer + ( by "Weil, Stefan 3732 EPE-24" + and Igor Khavkine ) + + -- Marcus Brinkmann Mon, 3 Jul 2000 21:05:42 +0200 + gnumach (1:1.2-2) unstable; urgency=low * Snapshot from CVS 19990907. diff --git a/device/subrs.c b/device/subrs.c index 9d59020..a65d228 100644 --- a/device/subrs.c +++ b/device/subrs.c @@ -110,7 +110,7 @@ geteblk(size) register io_req_t ior; io_req_alloc(ior, 0); - ior->io_device = (device_t)0; + ior->io_device = (mach_device_t)0; ior->io_unit = 0; ior->io_op = 0; ior->io_mode = 0; diff --git a/i386/Files b/i386/Files index 438a583..3cd5f49 100644 --- a/i386/Files +++ b/i386/Files @@ -248,7 +248,6 @@ i386/include/mach/i386/vm_param.h i386/include/mach/i386/vm_types.h i386/include/mach/i386/exec/elf.h i386/include/mach/sa/stdarg.h -i386/include/mach/sa/sys/varargs.h i386/intel/pmap.c i386/intel/pmap.h i386/intel/read_fault.c diff --git a/i386/i386/pit.h b/i386/i386/pit.h index 3cadb30..79a8757 100644 --- a/i386/i386/pit.h +++ b/i386/i386/pit.h @@ -100,8 +100,10 @@ typedef struct time_latch { time_t ticks; /* time in HZ since boot */ time_t uticks; /* time in 1.25 MHZ */ /* don't need these two for now. --- csy */ -/* time_t secs; /* seconds since boot */ -/* time_t epochsecs; /* seconds since epoch */ +#if 0 + time_t secs; /* seconds since boot */ + time_t epochsecs; /* seconds since epoch */ +#endif } time_latch; /* a couple in-line assembly codes for efficiency. */ asm int intr_disable() diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c index cddbf26..21f0785 100644 --- a/i386/i386at/model_dep.c +++ b/i386/i386at/model_dep.c @@ -98,6 +98,9 @@ extern char version[]; extern void setup_main(); +void halt_all_cpu (boolean_t reboot) __attribute__ ((noreturn)); +void halt_cpu (void) __attribute__ ((noreturn)); + void inittodr(); /* forward */ int rebootflag = 0; /* exported to kdintr */ @@ -155,7 +158,7 @@ void machine_init() /* * Halt a cpu. */ -halt_cpu() +void halt_cpu(void) { asm volatile("cli"); while(1); @@ -164,7 +167,7 @@ halt_cpu() /* * Halt the system or reboot. */ -halt_all_cpus(reboot) +void halt_all_cpus(reboot) boolean_t reboot; { if (reboot) { diff --git a/i386/linux/Makefile.in b/i386/linux/Makefile.in index 80d008d..2d7d3a6 100644 --- a/i386/linux/Makefile.in +++ b/i386/linux/Makefile.in @@ -31,7 +31,7 @@ CFLAGS = @CFLAGS@ # Files for driver support. -linux-c-files = version.c softirq.c dma.c resource.c printk.c \ +linux-c-files = version.c softirq.c delay.c dma.c resource.c printk.c \ bios32.c irq.c ctype.c vsprintf.c main.c misc.c sched.c \ kmem.c block.c setup.c @@ -39,6 +39,7 @@ linux-c-files = version.c softirq.c dma.c resource.c printk.c \ vpath %.c $(linuxsrcdir)/dev/kernel vpath %.c $(linuxsrcdir)/dev/init vpath %.c $(linuxsrcdir)/dev/arch/$(systype)/kernel +vpath %.c $(linuxsrcdir)/dev/arch/$(systype)/lib vpath %.c $(linuxsrcdir)/dev/glue vpath %.c $(linuxsrcdir)/dev/lib @@ -46,11 +47,12 @@ vpath %.c $(linuxsrcdir)/dev/lib vpath %.c $(linuxsrcdir)/src/kernel vpath %.c $(linuxsrcdir)/src/init vpath %.c $(linuxsrcdir)/src/arch/$(systype)/kernel +vpath %.c $(linuxsrcdir)/src/arch/$(systype)/lib vpath %.c $(linuxsrcdir)/src/lib # XXX: Assembly source files must be treated separately... Uggg... -linux-asm-files = delay.S semaphore.S +linux-asm-files = semaphore.S vpath %.S $(linuxsrcdir)/dev/arch/$(systype)/lib vpath %.S $(linuxsrcdir)/src/arch/$(systype)/lib diff --git a/kern/bootstrap.c b/kern/bootstrap.c index c3c971d..d6dcad4 100644 --- a/kern/bootstrap.c +++ b/kern/bootstrap.c @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include @@ -335,9 +335,7 @@ extern vm_offset_t user_stack_low(); extern vm_offset_t set_user_regs(); void -static build_args_and_stack(boot_exec_info, va_alist) - struct exec_info *boot_exec_info; - va_dcl +static build_args_and_stack(struct exec_info *boot_exec_info, ...) { vm_offset_t stack_base; vm_size_t stack_size; @@ -358,7 +356,7 @@ static build_args_and_stack(boot_exec_info, va_alist) /* * Calculate the size of the argument list. */ - va_start(argv_ptr); + va_start(argv_ptr, boot_exec_info); arg_len = 0; arg_count = 0; for (;;) { @@ -417,7 +415,7 @@ static build_args_and_stack(boot_exec_info, va_alist) /* * Then the strings and string pointers for each argument */ - va_start(argv_ptr); + va_start(argv_ptr, boot_exec_info); while (--arg_count >= 0) { arg_ptr = va_arg(argv_ptr, char *); arg_item_len = strlen(arg_ptr) + 1; /* include trailing 0 */ diff --git a/kern/debug.c b/kern/debug.c index 26c402d..2ba15fe 100644 --- a/kern/debug.c +++ b/kern/debug.c @@ -24,15 +24,18 @@ * the rights to redistribute these changes. */ +#include + #include #include #include #include "cpu_number.h" #include -#include #include +#warning missing include for panic() +void panic(const char *s, ...); extern void cnputc(); @@ -105,7 +108,7 @@ void Debugger(message) boolean_t panic_lock_initialized = FALSE; decl_simple_lock_data(, panic_lock) -char *panicstr; +const char *panicstr; int paniccpu; void @@ -120,9 +123,7 @@ panic_init() /*VARARGS1*/ void -panic(s, va_alist) - char * s; - va_dcl +panic(const char *s, ...) { va_list listp; #if NORMA_IPC @@ -152,7 +153,7 @@ panic(s, va_alist) printf("(cpu %U)", paniccpu); #endif printf(": "); - va_start(listp); + va_start(listp, s); _doprnt(s, &listp, cnputc, 0); va_end(listp); printf("\n"); @@ -176,17 +177,14 @@ panic(s, va_alist) */ /*VARARGS2*/ void -log(level, fmt, va_alist) - int level; - char * fmt; - va_dcl +log(int level, const char *fmt, ...) { va_list listp; #ifdef lint level++; #endif - va_start(listp); + va_start(listp, fmt); _doprnt(fmt, &listp, cnputc, 0); va_end(listp); } diff --git a/kern/printf.c b/kern/printf.c index 693c660..85e6278 100644 --- a/kern/printf.c +++ b/kern/printf.c @@ -115,7 +115,7 @@ #include #include #include -#include +#include #define isdigit(d) ((d) >= '0' && (d) <= '9') #define Ctod(c) ((c) - '0') @@ -161,7 +161,7 @@ void printf_init() } void _doprnt( - register char *fmt, + register const char *fmt, va_list *argp, /* character output routine */ void (*putc)( char, vm_offset_t), @@ -509,20 +509,16 @@ void _doprnt( */ extern void cnputc( char, /*not really*/vm_offset_t); -void vprintf(fmt, listp) - char * fmt; - va_list listp; +void vprintf(const char *fmt, va_list listp) { _doprnt(fmt, &listp, cnputc, 16, 0); } /*VARARGS1*/ -void printf(fmt, va_alist) - char * fmt; - va_dcl +void printf(const char *fmt, ...) { va_list listp; - va_start(listp); + va_start(listp, fmt); vprintf(fmt, listp); va_end(listp); } @@ -533,9 +529,7 @@ int indent = 0; * Printing (to console) with indentation. */ /*VARARGS1*/ -void iprintf(fmt, va_alist) - char * fmt; - va_dcl +void iprintf(const char *fmt, ...) { va_list listp; register int i; @@ -550,7 +544,7 @@ void iprintf(fmt, va_alist) i--; } } - va_start(listp); + va_start(listp, fmt); _doprnt(fmt, &listp, cnputc, 16, 0); va_end(listp); } @@ -572,15 +566,12 @@ sputc( } int -sprintf( buf, fmt, va_alist) - char *buf; - char *fmt; - va_dcl +sprintf(char *buf, const char *fmt, ...) { va_list listp; char *start = buf; - va_start(listp); + va_start(listp, fmt); _doprnt(fmt, &listp, sputc, 16, (vm_offset_t)&buf); va_end(listp); 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 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... - * : : - */ - 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... - * : : - */ - 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... - * : : - */ - 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 - -#ifdef __SMP__ -#include -#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