diff -ur linux-109/include/asm/io.h linux/include/asm/io.h --- linux-109/include/asm/io.h Fri Feb 4 18:59:16 1994 +++ linux/include/asm/io.h Sun Feb 15 12:15:26 1998 @@ -49,9 +49,9 @@ #define __OUT(s,s1,x) \ __OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "d" (port)); } \ -__OUT1(s##c,x) __OUT2(s,s1,"") : : "a" (value), "i" (port)); } \ +__OUT1(s##c,x) __OUT2(s,s1,"") : : "a" (value), "id" (port)); } \ __OUT1(s##_p,x) __OUT2(s,s1,"w") : : "a" (value), "d" (port)); SLOW_DOWN_IO; } \ -__OUT1(s##c_p,x) __OUT2(s,s1,"") : : "a" (value), "i" (port)); SLOW_DOWN_IO; } +__OUT1(s##c_p,x) __OUT2(s,s1,"") : : "a" (value), "id" (port)); SLOW_DOWN_IO; } #define __IN1(s) \ extern inline unsigned int __in##s(unsigned short port) { unsigned int _v; @@ -61,9 +61,9 @@ #define __IN(s,s1,i...) \ __IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "d" (port) ,##i ); return _v; } \ -__IN1(s##c) __IN2(s,s1,"") : "=a" (_v) : "i" (port) ,##i ); return _v; } \ +__IN1(s##c) __IN2(s,s1,"") : "=a" (_v) : "id" (port) ,##i ); return _v; } \ __IN1(s##_p) __IN2(s,s1,"w") : "=a" (_v) : "d" (port) ,##i ); SLOW_DOWN_IO; return _v; } \ -__IN1(s##c_p) __IN2(s,s1,"") : "=a" (_v) : "i" (port) ,##i ); SLOW_DOWN_IO; return _v; } +__IN1(s##c_p) __IN2(s,s1,"") : "=a" (_v) : "id" (port) ,##i ); SLOW_DOWN_IO; return _v; } #define __INS(s) \ extern inline void ins##s(unsigned short port, void * addr, unsigned long count) \ diff -ur linux-109/include/linux/kernel.h linux/include/linux/kernel.h --- linux-109/include/linux/kernel.h Sun Feb 15 12:31:49 1998 +++ linux/include/linux/kernel.h Mon Feb 16 18:49:59 1998 @@ -25,19 +25,21 @@ #define KERN_INFO "<6>" /* informational */ #define KERN_DEBUG "<7>" /* debug-level messages */ -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -# define NORET_TYPE __volatile__ -# define ATTRIB_NORET /**/ -# define NORET_AND /**/ -#else # define NORET_TYPE /**/ # define ATTRIB_NORET __attribute__((noreturn)) # define NORET_AND noreturn, -#endif extern void math_error(void); -NORET_TYPE void panic(const char * fmt, ...) - __attribute__ ((NORET_AND format (printf, 1, 2))); + +NORET_TYPE void panic_at(const void *location) + ATTRIB_NORET; + +#define panic(fmt,arg...) \ +({ __label__ whoops; \ +whoops: \ + panic_at(&&whoops); \ +}) + NORET_TYPE void do_exit(long error_code) ATTRIB_NORET; unsigned long simple_strtoul(const char *,char **,unsigned int); diff -ur linux-109/include/linux/string.h linux/include/linux/string.h --- linux-109/include/linux/string.h Wed Dec 1 23:44:15 1993 +++ linux/include/linux/string.h Mon Feb 16 14:51:27 1998 @@ -1,12 +1,6 @@ #ifndef _LINUX_STRING_H_ #define _LINUX_STRING_H_ -#include /* for size_t */ - -#ifndef NULL -#define NULL ((void *) 0) -#endif - /* * This string-include defines all string functions as inline * functions. Use gcc. It also assumes ds=es=data space, this should be @@ -21,7 +15,8 @@ extern inline char * strcpy(char * dest,const char *src) { -__asm__("cld\n" +__asm__ __volatile__( + "cld\n" "1:\tlodsb\n\t" "stosb\n\t" "testb %%al,%%al\n\t" @@ -33,7 +28,8 @@ extern inline char * strncpy(char * dest,const char *src,size_t count) { -__asm__("cld\n" +__asm__ __volatile__( + "cld\n" "1:\tdecl %2\n\t" "js 2f\n\t" "lodsb\n\t" @@ -50,7 +46,8 @@ extern inline char * strcat(char * dest,const char * src) { -__asm__("cld\n\t" +__asm__ __volatile__( + "cld\n\t" "repne\n\t" "scasb\n\t" "decl %1\n" @@ -65,7 +62,8 @@ extern inline char * strncat(char * dest,const char * src,size_t count) { -__asm__("cld\n\t" +__asm__ __volatile__( + "cld\n\t" "repne\n\t" "scasb\n\t" "decl %1\n\t" @@ -86,8 +84,9 @@ extern inline int strcmp(const char * cs,const char * ct) { -register int __res __asm__("ax"); -__asm__("cld\n" +register int __res; +__asm__ __volatile__( + "cld\n" "1:\tlodsb\n\t" "scasb\n\t" "jne 2f\n\t" @@ -95,18 +94,18 @@ "jne 1b\n\t" "xorl %%eax,%%eax\n\t" "jmp 3f\n" - "2:\tmovl $1,%%eax\n\t" - "jb 3f\n\t" - "negl %%eax\n" + "2:\tsbbl %%eax,%%eax\n\t" + "orb $1,%%eax\n" "3:" - :"=a" (__res):"D" (cs),"S" (ct):"si","di"); + :"=a" (__res):"S" (cs),"D" (ct):"si","di"); return __res; } extern inline int strncmp(const char * cs,const char * ct,size_t count) { -register int __res __asm__("ax"); -__asm__("cld\n" +register int __res; +__asm__ __volatile__( + "cld\n" "1:\tdecl %3\n\t" "js 2f\n\t" "lodsb\n\t" @@ -116,18 +115,18 @@ "jne 1b\n" "2:\txorl %%eax,%%eax\n\t" "jmp 4f\n" - "3:\tmovl $1,%%eax\n\t" - "jb 4f\n\t" - "negl %%eax\n" + "3:\tsbbl %%eax,%%eax\n\t" + "orb $1,%%al\n" "4:" - :"=a" (__res):"D" (cs),"S" (ct),"c" (count):"si","di","cx"); + :"=a" (__res):"S" (cs),"D" (ct),"c" (count):"si","di","cx"); return __res; } -extern inline char * strchr(const char * s,char c) +extern inline char * strchr(const char * s, int c) { -register char * __res __asm__("ax"); -__asm__("cld\n\t" +register char * __res; +__asm__ __volatile__( + "cld\n\t" "movb %%al,%%ah\n" "1:\tlodsb\n\t" "cmpb %%ah,%%al\n\t" @@ -141,16 +140,16 @@ return __res; } -extern inline char * strrchr(const char * s,char c) +extern inline char * strrchr(const char * s, int c) { -register char * __res __asm__("dx"); -__asm__("cld\n\t" +register char * __res; +__asm__ __volatile__( + "cld\n\t" "movb %%al,%%ah\n" "1:\tlodsb\n\t" "cmpb %%ah,%%al\n\t" "jne 2f\n\t" - "movl %%esi,%0\n\t" - "decl %0\n" + "leal -1(%%esi),%0\n" "2:\ttestb %%al,%%al\n\t" "jne 1b" :"=d" (__res):"0" (0),"S" (s),"a" (c):"ax","si"); @@ -159,8 +158,9 @@ extern inline size_t strspn(const char * cs, const char * ct) { -register char * __res __asm__("si"); -__asm__("cld\n\t" +register char * __res; +__asm__ __volatile__( + "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" @@ -183,8 +183,9 @@ extern inline size_t strcspn(const char * cs, const char * ct) { -register char * __res __asm__("si"); -__asm__("cld\n\t" +register char * __res; +__asm__ __volatile__( + "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" @@ -207,8 +208,9 @@ extern inline char * strpbrk(const char * cs,const char * ct) { -register char * __res __asm__("si"); -__asm__("cld\n\t" +register char * __res; +__asm__ __volatile__( + "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" @@ -234,8 +236,9 @@ extern inline char * strstr(const char * cs,const char * ct) { -register char * __res __asm__("ax"); -__asm__("cld\n\t" \ +register char * __res; +__asm__ __volatile__( + "cld\n\t" \ "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" @@ -261,8 +264,9 @@ extern inline size_t strlen(const char * s) { -register int __res __asm__("cx"); -__asm__("cld\n\t" +register int __res; +__asm__ __volatile__( + "cld\n\t" "repne\n\t" "scasb\n\t" "notl %0\n\t" @@ -276,7 +280,8 @@ extern inline char * strtok(char * s,const char * ct) { register char * __res; -__asm__("testl %1,%1\n\t" +__asm__ __volatile__( + "testl %1,%1\n\t" "jne 1f\n\t" "testl %0,%0\n\t" "je 8f\n\t" @@ -290,7 +295,7 @@ "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" - "je 7f\n\t" /* empty delimeter-string */ + "je 7f\n\t" /* empty delimiter-string */ "movl %%ecx,%%edx\n" "2:\tlodsb\n\t" "testb %%al,%%al\n\t" @@ -332,9 +337,10 @@ return __res; } -extern inline void * memcpy(void * to, const void * from, size_t n) +extern inline void * __memcpy(void * to, const void * from, size_t n) { -__asm__("cld\n\t" +__asm__ __volatile__( + "cld\n\t" "movl %%edx, %%ecx\n\t" "shrl $2,%%ecx\n\t" "rep ; movsl\n\t" @@ -351,17 +357,65 @@ return (to); } +/* + * This looks horribly ugly, but the compiler can optimize it totally, + * as the count is constant. + */ +extern inline void * __constant_memcpy(void * to, const void * from, size_t n) +{ + switch (n) { + case 0: + return to; + case 1: + *(unsigned char *)to = *(unsigned char *)from; + return to; + case 2: + *(unsigned short *)to = *(unsigned short *)from; + return to; + case 3: + *(unsigned short *)to = *(unsigned short *)from; + *(2+(unsigned char *)to) = *(2+(unsigned char *)from); + return to; + case 4: + *(unsigned long *)to = *(unsigned long *)from; + return to; + } +#define COMMON(x) \ +__asm__("cld\n\t" \ + "rep ; movsl" \ + x \ + : /* no outputs */ \ + : "c" (n/4),"D" ((long) to),"S" ((long) from) \ + : "cx","di","si","memory"); + + 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; + } +#undef COMMON + return NULL; /* never reached */ +} + +#define memcpy(t, f, n) \ +(__builtin_constant_p(n) ? \ + __constant_memcpy((t),(f),(n)) : \ + __memcpy((t),(f),(n))) + extern inline void * memmove(void * dest,const void * src, size_t n) { if (dest asmlinkage void sys_sync(void); /* it's really int */ +extern void unblank_screen(void); -extern int vsprintf(char * buf, const char * fmt, va_list args); - -NORET_TYPE void panic(const char * fmt, ...) +NORET_TYPE void panic_at(const void * location) { - static char buf[1024]; - va_list args; - - va_start(args, fmt); - vsprintf(buf, fmt, args); - va_end(args); - printk(KERN_EMERG "Kernel panic: %s\n",buf); + printk(KERN_EMERG "Kernel panic at: %p\n",location); if (current == task[0]) printk(KERN_EMERG "In swapper task - not syncing\n"); else sys_sync(); + unblank_screen(); for(;;); }