lkml.org 
[lkml]   [1997]   [Jan]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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 13:38    [W:0.050 / U:0.316 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site