lkml.org 
[lkml]   [1997]   [Jan]   [30]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateThu, 30 Jan 1997 14:32:52 +0100 (MET)
FromIngo Molnar <>
Subjectpre-patch: csum_partial_copy_fromuser
okay ... here is a preliminary patch which implements the new exception
handing for arch/i386/lib/checksum.c too.

I will get the networking semantics right in a second, but could you
please try the patch out with your crash code, the networking checksums
shouldnt cause any Oops-es anymore. Maybe i've missed something. It works
for me, but it could crash your machine. If yes then take it as a side
effect of pestering people ;)

it's against 2.1.22, but should be fine for any recent kernel as well. 

-- mingo

--- checksum.c.original	Wed Jan 29 22:57:31 1997
+++ checksum.c	Thu Jan 30 13:55:14 1997
@@ -102,6 +102,8 @@
 
 unsigned int csum_partial_copy(const char *src, char *dst, 
 				  int len, int sum) {
+	long __csum_err = 0;
+	printk("({START __csum_err:");
     __asm__("
 	testl $2, %%edi		# Check alignment.
 	jz 2f			# Jump if alignment is ok.
@@ -109,8 +111,10 @@
 	jae 1f			# Jump if we had at least two bytes.
 	addl $2, %%ecx		# ecx was < 2.  Deal with it.
 	jmp 4f
+1000:
 1:	movw (%%esi), %%bx
 	addl $2, %%esi
+1001:
 	movw %%bx, (%%edi)
 	addl $2, %%edi
 	addw %%bx, %%ax
@@ -120,35 +124,53 @@
 	shrl $5, %%ecx
 	jz 2f
 	testl %%esi, %%esi
+1002:
 1:	movl (%%esi), %%ebx
+1003:
 	movl 4(%%esi), %%edx
 	adcl %%ebx, %%eax
+1004:
 	movl %%ebx, (%%edi)
 	adcl %%edx, %%eax
+1005:
 	movl %%edx, 4(%%edi)
 
+1006:
 	movl 8(%%esi), %%ebx
+1007:
 	movl 12(%%esi), %%edx
 	adcl %%ebx, %%eax
+1008:
 	movl %%ebx, 8(%%edi)
 	adcl %%edx, %%eax
+1009:
 	movl %%edx, 12(%%edi)
 
+1010:
 	movl 16(%%esi), %%ebx
+1011:
 	movl 20(%%esi), %%edx
 	adcl %%ebx, %%eax
+1012:
 	movl %%ebx, 16(%%edi)
 	adcl %%edx, %%eax
+1013:
 	movl %%edx, 20(%%edi)
 
+1014:
 	movl 24(%%esi), %%ebx
+1015:
 	movl 28(%%esi), %%edx
 	adcl %%ebx, %%eax
+1016:
 	movl %%ebx, 24(%%edi)
 	adcl %%edx, %%eax
+1017:
 	movl %%edx, 28(%%edi)
 
+1018:
 	lea 32(%%esi), %%esi
+1019:
 	lea 32(%%edi), %%edi
 	dec %%ecx
 	jne 1b
@@ -158,10 +180,14 @@
 	andl $0x1c, %%edx
 	je 4f
 	shrl $2, %%edx		# This clears CF
+1020:
 3:	movl (%%esi), %%ebx
 	adcl %%ebx, %%eax
+1021:
 	movl %%ebx, (%%edi)
+1022:
 	lea 4(%%esi), %%esi
+1023:
 	lea 4(%%edi), %%edi
 	dec %%edx
 	jne 3b
@@ -170,20 +196,67 @@
 	jz 7f
 	cmpl $2, %%ecx
 	jb 5f
+1024:
 	movw (%%esi), %%cx
+1025:
 	leal 2(%%esi), %%esi
+1026:
 	movw %%cx, (%%edi)
+1027:
 	leal 2(%%edi), %%edi
 	je 6f
 	shll $16,%%ecx
+1028:
 5:	movb (%%esi), %%cl
+1029:
 	movb %%cl, (%%edi)
 6:	addl %%ecx, %%eax
 	adcl $0, %%eax
 7:
+2000:
+        .section .fixup,\"ax\"            
+3000:		movl %7,%1                
+		jmp 2000b                        
+        .previous                           
+        .section __ex_table,\"a\"         
+               .align 4                   
+               .long 1000b,3000b                
+               .long 1001b,3000b                
+               .long 1002b,3000b                
+               .long 1003b,3000b                
+               .long 1004b,3000b                
+               .long 1005b,3000b                
+               .long 1006b,3000b                
+               .long 1007b,3000b                
+               .long 1008b,3000b                
+               .long 1009b,3000b                
+               .long 1010b,3000b                
+               .long 1011b,3000b                
+               .long 1012b,3000b                
+               .long 1013b,3000b                
+               .long 1014b,3000b                
+               .long 1015b,3000b                
+               .long 1016b,3000b                
+               .long 1017b,3000b                
+               .long 1018b,3000b                
+               .long 1019b,3000b                
+               .long 1020b,3000b                
+               .long 1021b,3000b                
+               .long 1022b,3000b                
+               .long 1023b,3000b                
+               .long 1024b,3000b                
+               .long 1025b,3000b                
+               .long 1026b,3000b                
+               .long 1027b,3000b                
+               .long 1028b,3000b                
+               .long 1029b,3000b                
+        .previous                           
 	"
-	: "=a" (sum)
-	: "0"(sum), "c"(len), "S"(src), "D" (dst)
+	: "=a" (sum), "=r" (__csum_err)
+	: "0"(sum), "c"(len), "S"(src), "D" (dst), "1" (__csum_err), "i"(-EFAULT)
 	: "bx", "cx", "dx", "si", "di" );
+
+	
+	printk("%ld})",__csum_err);
     return(sum);
 }


\
 
 \ /
  Last update: 2005-03-22 12:38    [from the cache]
©2003-2008