|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)cksum.c 1.2 (Berkeley) 9/18/85"; ! 9: #endif not lint ! 10: ! 11: #include <sys/types.h> ! 12: ! 13: #define ADD asm("adwc (r9)+,r8;"); ! 14: ! 15: /* computes the checksum for ip packets for the VAX */ ! 16: ! 17: in_cksum(addr, len) ! 18: u_short *addr; ! 19: int len; ! 20: { ! 21: register int nleft = len; /* on vax, (user mode), r11 */ ! 22: #ifndef lint ! 23: register int xxx; /* on vax, (user mode), r10 */ ! 24: #endif not lint ! 25: register u_short *w = addr; /* on vax, known to be r9 */ ! 26: register int sum = 0; /* on vax, known to be r8 */ ! 27: ! 28: if (((int)w&0x2) && nleft >= 2) { ! 29: sum += *w++; ! 30: nleft -= 2; ! 31: } ! 32: while ((nleft -= 32) >= 0) { ! 33: asm("clrl r0"); /* clears carry */ ! 34: ADD; ADD; ADD; ADD; ADD; ADD; ADD; ADD; ! 35: asm("adwc $0,r8"); ! 36: } ! 37: nleft += 32; ! 38: while ((nleft -= 8) >= 0) { ! 39: asm("clrl r0"); ! 40: ADD; ADD; ! 41: asm("adwc $0,r8"); ! 42: } ! 43: nleft += 8; ! 44: { asm("ashl $-16,r8,r0; addw2 r0,r8"); ! 45: asm("adwc $0,r8; movzwl r8,r8"); } ! 46: while ((nleft -= 2) >= 0) { ! 47: asm("movzwl (r9)+,r0; addl2 r0,r8"); ! 48: } ! 49: if (nleft == -1) { ! 50: sum += *(u_char *)w; ! 51: } ! 52: ! 53: { asm("ashl $-16,r8,r0; addw2 r0,r8; adwc $0,r8"); ! 54: asm("mcoml r8,r8; movzwl r8,r8"); } ! 55: return (sum); ! 56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.