diff -crN libnids-1.16/src/checksum.c libnids-1.16-fixed-FC2/src/checksum.c *** libnids-1.16/src/checksum.c Tue Jun 20 14:06:32 2000 --- libnids-1.16-fixed-FC2/src/checksum.c Mon Nov 1 11:07:10 2004 *************** *** 23,90 **** csum_partial(const u_char * buff, int len, u_int sum) { __asm__ ( ! /* "pushl %esi ! pushl %ebx ! movl 20(%esp),%eax # Function arg: u_int sum ! movl 16(%esp),%ecx # Function arg: int len ! movl 12(%esp),%esi # Function arg: u_char *buff*/ ! ! "testl $2, %%esi ! jz 2f ! subl $2, %%ecx ! jae 1f ! addl $2, %%ecx ! jmp 4f ! 1: movw (%%esi), %%bx ! addl $2, %%esi ! addw %%bx, %%ax ! adcl $0, %%eax ! 2: ! movl %%ecx, %%edx ! shrl $5, %%ecx ! jz 2f ! testl %%esi, %%esi ! 1: movl (%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 4(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 8(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 12(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 16(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 20(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 24(%%esi), %%ebx ! adcl %%ebx, %%eax ! movl 28(%%esi), %%ebx ! adcl %%ebx, %%eax ! lea 32(%%esi), %%esi ! dec %%ecx ! jne 1b ! adcl $0, %%eax ! 2: movl %%edx, %%ecx ! andl $0x1c, %%edx ! je 4f ! shrl $2, %%edx ! 3: adcl (%%esi), %%eax ! lea 4(%%esi), %%esi ! dec %%edx ! jne 3b ! adcl $0, %%eax ! 4: andl $3, %%ecx ! jz 7f ! cmpl $2, %%ecx ! jb 5f ! movw (%%esi),%%cx ! leal 2(%%esi),%%esi ! je 6f ! shll $16,%%ecx ! 5: movb (%%esi),%%cl ! 6: addl %%ecx,%%eax ! adcl $0, %%eax ! 7: " : "=a"(sum) : "0"(sum), "c"(len), "S"(buff) : "bx", "dx"); --- 23,84 ---- csum_partial(const u_char * buff, int len, u_int sum) { __asm__ ( ! "testl $2, %%esi \n" ! " jz 2f \n" ! " subl $2, %%ecx \n" ! " jae 1f \n" ! " addl $2, %%ecx \n" ! " jmp 4f\n" ! "1: movw (%%esi), %%bx\n" ! " addl $2, %%esi\n" ! " addw %%bx, %%ax\n" ! " adcl $0, %%eax\n" ! "2:\n" ! " movl %%ecx, %%edx\n" ! " shrl $5, %%ecx\n" ! " jz 2f\n" ! " testl %%esi, %%esi\n" ! "1: movl (%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 4(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 8(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 12(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 16(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 20(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 24(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " movl 28(%%esi), %%ebx\n" ! " adcl %%ebx, %%eax\n" ! " lea 32(%%esi), %%esi\n" ! " dec %%ecx\n" ! " jne 1b\n" ! " adcl $0, %%eax\n" ! "2: movl %%edx, %%ecx\n" ! " andl $0x1c, %%edx\n" ! " je 4f\n" ! " shrl $2, %%edx \n" ! "3: adcl (%%esi), %%eax\n" ! " lea 4(%%esi), %%esi\n" ! " dec %%edx\n" ! " jne 3b\n" ! " adcl $0, %%eax\n" ! "4: andl $3, %%ecx\n" ! " jz 7f\n" ! " cmpl $2, %%ecx\n" ! " jb 5f\n" ! " movw (%%esi),%%cx\n" ! " leal 2(%%esi),%%esi\n" ! " je 6f\n" ! " shll $16,%%ecx\n" ! "5: movb (%%esi),%%cl\n" ! "6: addl %%ecx,%%eax\n" ! " adcl $0, %%eax\n" ! "7: \n" : "=a"(sum) : "0"(sum), "c"(len), "S"(buff) : "bx", "dx"); *************** *** 103,132 **** { u_int sum; ! __asm__ __volatile__(" ! movl (%1), %0 ! subl $4, %2 ! jbe 2f ! addl 4(%1), %0 ! adcl 8(%1), %0 ! adcl 12(%1), %0 ! 1: adcl 16(%1), %0 ! lea 4(%1), %1 ! decl %2 ! jne 1b ! adcl $0, %0 ! movl %0, %2 ! shrl $16, %0 ! addw %w2, %w0 ! adcl $0, %0 ! notl %0 ! 2: ! " ! /* ! Since the input registers which are loaded with iph and ipl ! are modified, we must also specify them as outputs, or gcc ! will assume they contain their original values. ! */ : "=r" (sum), "=r" (iph), "=r" (ihl) : "1" (iph), "2" (ihl)); --- 97,120 ---- { u_int sum; ! __asm__ __volatile__( ! " movl (%1), %0 \n" ! " subl $4, %2 \n" ! " jbe 2f \n" ! " addl 4(%1), %0 \n" ! " adcl 8(%1), %0 \n" ! " adcl 12(%1), %0 \n" ! "1: adcl 16(%1), %0 \n" ! " lea 4(%1), %1 \n" ! " decl %2 \n" ! " jne 1b \n" ! " adcl $0, %0 \n" ! " movl %0, %2 \n" ! " shrl $16, %0 \n" ! " addw %w2, %w0 \n" ! " adcl $0, %0 \n" ! " notl %0 \n" ! "2: \n" : "=r" (sum), "=r" (iph), "=r" (ihl) : "1" (iph), "2" (ihl)); *************** *** 137,146 **** static inline u_int csum_fold(u_int sum) { ! __asm__(" ! addl %1, %0 ! adcl $0xffff, %0 ! " : "=r" (sum) : "r" (sum << 16), "0" (sum & 0xffff0000) ); --- 125,134 ---- static inline u_int csum_fold(u_int sum) { ! __asm__( ! " addl %1, %0 \n" ! " adcl $0xffff, %0 \n" ! : "=r" (sum) : "r" (sum << 16), "0" (sum & 0xffff0000) ); *************** *** 155,166 **** csum_tcpudp_magic(u_int saddr, u_int daddr, u_short len, u_short proto, u_int sum) { ! __asm__(" ! addl %1, %0 ! adcl %2, %0 ! adcl %3, %0 ! adcl $0, %0 ! " : "=r" (sum) : "g" (daddr), "g"(saddr), "g"((ntohs(len) << 16) + proto * 256), "0"(sum)); return (csum_fold(sum)); --- 143,154 ---- csum_tcpudp_magic(u_int saddr, u_int daddr, u_short len, u_short proto, u_int sum) { ! __asm__( ! " addl %1, %0 \n" ! " adcl %2, %0 \n" ! " adcl %3, %0 \n" ! " adcl $0, %0 \n" ! : "=r" (sum) : "g" (daddr), "g"(saddr), "g"((ntohs(len) << 16) + proto * 256), "0"(sum)); return (csum_fold(sum));