summaryrefslogtreecommitdiff
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
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.
-rw-r--r--ChangeLog30
-rw-r--r--ddb/db_output.c14
-rw-r--r--ddb/db_output.h6
-rw-r--r--debian/changelog10
-rw-r--r--device/subrs.c2
-rw-r--r--i386/Files1
-rw-r--r--i386/i386/pit.h6
-rw-r--r--i386/i386at/model_dep.c7
-rw-r--r--i386/linux/Makefile.in6
-rw-r--r--kern/bootstrap.c10
-rw-r--r--kern/debug.c20
-rw-r--r--kern/printf.c27
-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
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 <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.
+
1999-10-08 Thomas Bushnell, BSG <tb@mit.edu>
* 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 <stdarg.h>
#include <mach/boolean.h>
-#include <sys/varargs.h>
#include <machine/db_machdep.h>
#include <ddb/db_lex.h>
#include <ddb/db_output.h>
@@ -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" <Stefan.Weil@de.heidelberg.com>
+ and Igor Khavkine <i_khavki@alcor.concordia.ca>)
+
+ -- Marcus Brinkmann <brinkmd@debian.org> 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 <vm/vm_kern.h>
#include <device/device_port.h>
-#include <sys/varargs.h>
+#include <stdarg.h>
#include <mach/machine/multiboot.h>
#include <mach/exec/exec.h>
@@ -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 <stdarg.h>
+
#include <mach_kdb.h>
#include <norma_ipc.h>
#include <cpus.h>
#include "cpu_number.h"
#include <kern/lock.h>
-#include <sys/varargs.h>
#include <kern/thread.h>
+#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 <mach/boolean.h>
#include <kern/lock.h>
#include <kern/strings.h>
-#include <sys/varargs.h>
+#include <stdarg.h>
#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<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)))
/*