Messages in this thread Patch in this message |  | | Date | Thu, 30 Jan 1997 14:32:52 +0100 (MET) | From | Ingo Molnar <> | Subject | pre-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); }
|  |