| #include <vfs.h> |
| #include <kfs.h> |
| #include <slab.h> |
| #include <kmalloc.h> |
| #include <kref.h> |
| #include <string.h> |
| #include <stdio.h> |
| #include <assert.h> |
| #include <error.h> |
| #include <cpio.h> |
| #include <pmap.h> |
| #include <smp.h> |
| |
| static short endian = 1; |
| static uint8_t *aendian = (uint8_t *) & endian; |
| #define LITTLE *aendian |
| |
| uint16_t ptclbsum(uint8_t * addr, int len) |
| { |
| uint32_t losum, hisum, mdsum, x; |
| uint32_t t1, t2; |
| |
| losum = 0; |
| hisum = 0; |
| mdsum = 0; |
| |
| x = 0; |
| if (((uintptr_t) addr) & 1) { |
| if (len) { |
| hisum += addr[0]; |
| len--; |
| addr++; |
| } |
| x = 1; |
| } |
| while (len >= 16) { |
| t1 = *(uint16_t *) (addr + 0); |
| t2 = *(uint16_t *) (addr + 2); |
| mdsum += t1; |
| t1 = *(uint16_t *) (addr + 4); |
| mdsum += t2; |
| t2 = *(uint16_t *) (addr + 6); |
| mdsum += t1; |
| t1 = *(uint16_t *) (addr + 8); |
| mdsum += t2; |
| t2 = *(uint16_t *) (addr + 10); |
| mdsum += t1; |
| t1 = *(uint16_t *) (addr + 12); |
| mdsum += t2; |
| t2 = *(uint16_t *) (addr + 14); |
| mdsum += t1; |
| mdsum += t2; |
| len -= 16; |
| addr += 16; |
| } |
| while (len >= 2) { |
| mdsum += *(uint16_t *) 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; |
| } |