From f6f0177c586d2a42da42434c60e54240966f8388 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 26 Sep 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-09-26 --- ip/icmp.c | 4 ++ ip/ip.h | 2 + ip/ipaux.c | 65 ---------------------- ip/ptclbsum.c | 73 +++++++++++++++++++++++++ pc/ptclbsum386.s | 137 +++++++++++++++++++++++++++++++++++++++++++++++ port/qio.c | 2 +- 6 files changed, 217 insertions(+), 66 deletions(-) create mode 100644 ip/ptclbsum.c create mode 100644 pc/ptclbsum386.s diff --git a/ip/icmp.c b/ip/icmp.c index b584facdf141f4f618184c082a67fe3a4705d2b4..849393e8f944efdff640e09a67073c8770d06174 100644 --- a/ip/icmp.c +++ b/ip/icmp.c @@ -137,6 +137,10 @@ icmpnoconv(Block *bp) Block *nbp; Icmp *p, *np; + /* don't bother if we haven't gotten any links up yet */ + if(Mediabooting()) + return; + p = (Icmp *)bp->rp; nbp = allocb(ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8); nbp->wp += ICMP_IPSIZE + ICMP_HDRSIZE + ICMP_IPSIZE + 8; diff --git a/ip/ip.h b/ip/ip.h index b1364947e63e8cdda19e07d088b3b6fc6b1a1b61..15b6c90297b6d2f222dc4f2b8c399b3938e75be9 100644 --- a/ip/ip.h +++ b/ip/ip.h @@ -129,6 +129,7 @@ struct Media Media* link; }; +int Mediabooting(void); int Mediaforme(byte*); int Mediaforpt2pt(byte*); Ipaddr Mediagetsrc(byte*); @@ -266,6 +267,7 @@ Ifcconv* newifcconv(void); ulong nhgetl(byte*); ushort nhgets(byte*); void (*pktifcrcv)(Conv*, Block*); +ushort ptclbsum(byte*, int); ushort ptclcsum(Block*, int, int); int pullblock(Block**, int); Block* pullupblock(Block*, int); diff --git a/ip/ipaux.c b/ip/ipaux.c index 9425a685a8455b6390623e004bf2cb5b938cfca2..33a22d39841bf78d2a181ef89f94cfa64da006b6 100644 --- a/ip/ipaux.c +++ b/ip/ipaux.c @@ -7,71 +7,6 @@ #include "kernel.h" #include "ip.h" -static short endian = 1; -static byte* aendian = (byte*)&endian; -#define LITTLE *aendian - -ushort -ptclbsum(byte *addr, int len) -{ - ulong losum, hisum, mdsum, x; - ulong t1, t2; - - losum = 0; - hisum = 0; - mdsum = 0; - - x = 0; - if((ulong)addr & 1) { - if(len) { - hisum += addr[0]; - len--; - addr++; - } - x = 1; - } - while(len >= 16) { - t1 = *(ushort*)(addr+0); - t2 = *(ushort*)(addr+2); mdsum += t1; - t1 = *(ushort*)(addr+4); mdsum += t2; - t2 = *(ushort*)(addr+6); mdsum += t1; - t1 = *(ushort*)(addr+8); mdsum += t2; - t2 = *(ushort*)(addr+10); mdsum += t1; - t1 = *(ushort*)(addr+12); mdsum += t2; - t2 = *(ushort*)(addr+14); mdsum += t1; - mdsum += t2; - len -= 16; - addr += 16; - } - while(len >= 2) { - mdsum += *(ushort*)addr; - len -= 2; - addr += 2; - } - if(x) { - if(len) - losum += addr[0]; - if(LITTLE) - losum += mdsum; - else - hisum += mdsum; - } else { - if(len) - hisum += addr[0]; - if(LITTLE) - hisum += mdsum; - else - losum += mdsum; - } - - losum += hisum >> 8; - losum += (hisum & 0xff) << 8; - while(hisum = losum>>16) - losum = hisum + (losum & 0xffff); - - return losum & 0xffff; -} - ushort ptclcsum(Block *bp, int offset, int len) { diff --git a/ip/ptclbsum.c b/ip/ptclbsum.c new file mode 100644 index 0000000000000000000000000000000000000000..dd660c8ea78874652f3ad7bdb375b68ba2468367 --- /dev/null +++ b/ip/ptclbsum.c @@ -0,0 +1,73 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "../port/error.h" +#include "kernel.h" +#include "ip.h" + +static short endian = 1; +static byte* aendian = (byte*)&endian; +#define LITTLE *aendian + +ushort +ptclbsum(byte *addr, int len) +{ + ulong losum, hisum, mdsum, x; + ulong t1, t2; + + losum = 0; + hisum = 0; + mdsum = 0; + + x = 0; + if((ulong)addr & 1) { + if(len) { + hisum += addr[0]; + len--; + addr++; + } + x = 1; + } + while(len >= 16) { + t1 = *(ushort*)(addr+0); + t2 = *(ushort*)(addr+2); mdsum += t1; + t1 = *(ushort*)(addr+4); mdsum += t2; + t2 = *(ushort*)(addr+6); mdsum += t1; + t1 = *(ushort*)(addr+8); mdsum += t2; + t2 = *(ushort*)(addr+10); mdsum += t1; + t1 = *(ushort*)(addr+12); mdsum += t2; + t2 = *(ushort*)(addr+14); mdsum += t1; + mdsum += t2; + len -= 16; + addr += 16; + } + while(len >= 2) { + mdsum += *(ushort*)addr; + len -= 2; + addr += 2; + } + if(x) { + if(len) + losum += addr[0]; + if(LITTLE) + losum += mdsum; + else + hisum += mdsum; + } else { + if(len) + hisum += addr[0]; + if(LITTLE) + hisum += mdsum; + else + losum += mdsum; + } + + losum += hisum >> 8; + losum += (hisum & 0xff) << 8; + while(hisum = losum>>16) + losum = hisum + (losum & 0xffff); + + return losum & 0xffff; +} diff --git a/pc/ptclbsum386.s b/pc/ptclbsum386.s new file mode 100644 index 0000000000000000000000000000000000000000..6e44302461fc6d2aefad0f766e5c0fba6b022278 --- /dev/null +++ b/pc/ptclbsum386.s @@ -0,0 +1,137 @@ +TEXT ptclbsum(SB), $0 + MOVL addr+0(FP), SI + MOVL len+4(FP), CX + + XORL AX, AX /* sum */ + + TESTL $1, SI /* byte aligned? */ + MOVL SI, DI + JEQ _2align + + DECL CX + JLT _return + + MOVB 0x00(SI), AH + INCL SI + +_2align: + TESTL $2, SI /* word aligned? */ + JEQ _32loop + + CMPL CX, $2 /* less than 2 bytes? */ + JLT _1dreg + SUBL $2, CX + + XORL BX, BX + MOVW 0x00(SI), BX + ADDL BX, AX + ADCL $0, AX + LEAL 2(SI), SI + +_32loop: + CMPL CX, $0x20 + JLT _8loop + + MOVL CX, BP + SHRL $5, BP + ANDL $0x1F, CX + +_32loopx: + MOVL 0x00(SI), BX + MOVL 0x1C(SI), DX + ADCL BX, AX + MOVL 0x04(SI), BX + ADCL DX, AX + MOVL 0x10(SI), DX + ADCL BX, AX + MOVL 0x08(SI), BX + ADCL DX, AX + MOVL 0x14(SI), DX + ADCL BX, AX + MOVL 0x0C(SI), BX + ADCL DX, AX + MOVL 0x18(SI), DX + ADCL BX, AX + LEAL 0x20(SI), SI + ADCL DX, AX + + DECL BP + JNE _32loopx + + ADCL $0, AX + +_8loop: + CMPL CX, $0x08 + JLT _2loop + + MOVL CX, BP + SHRL $3, BP + ANDL $0x07, CX + +_8loopx: + MOVL 0x00(SI), BX + ADCL BX, AX + MOVL 0x04(SI), DX + ADCL DX, AX + + LEAL 0x08(SI), SI + DECL BP + JNE _8loopx + + ADCL $0, AX + +_2loop: + CMPL CX, $0x02 + JLT _1dreg + +_2fold: + MOVL AX, BX + SHRL $16, BX + JEQ _2foldx + + ANDL $0xFFFF, AX + ADDL BX, AX + JMP _2fold + +_2foldx: + MOVL CX, BP + SHRL $1, BP + ANDL $0x01, CX + +_2loopx: + XORL BX, BX /* in the loop for PPro */ + MOVW 0x00(SI), BX + ADCL BX, AX + + LEAL 0x02(SI), SI + DECL BP + JNE _2loopx + + ADCL $0, AX + +_1dreg: + TESTL $1, CX /* 1 byte left? */ + JEQ _fold + + XORL BX, BX + MOVB 0x00(SI), BX + ADDL BX, AX + ADCL $0, AX + +_fold: + MOVL AX, BX + SHRL $16, BX + JEQ _swab + + ANDL $0xFFFF, AX + ADDL BX, AX + JMP _fold + +_swab: + TESTL $1, addr+0(FP) + /*TESTL $1, DI*/ + JNE _return + XCHGB AH, AL + +_return: + RET diff --git a/port/qio.c b/port/qio.c index 9b2da7ca2f4a1ec4f103d564cf3198c56074aa96..1d0465a0551d8eec4103ef71e287d3a9a17435b4 100644 --- a/port/qio.c +++ b/port/qio.c @@ -149,7 +149,7 @@ iallocb(int size) } n = sizeof(Block) + size + (BY2V-1); - b = mallocz(n, 0); + b = mallocz(n+Hdrspc, 0); if(b == nil){ iprint("iallocb: no memory %d/%d\n", ialloc.bytes, conf.ialloc); return nil;