mbr gpt crc32 calculation
Taylor R Campbell <[email protected]>
| Newsgroups | gmane.os.netbsd.ports.i386 |
|---|---|
| Message-ID | <[email protected]> |
dave0 in #NetBSD on Freenode suggested the attached replacement for the crc32 subroutine in src/sys/arch/i386/stand/mbr/gpt.S, to save a bit of space where speed is unimportant. I don't have the capacity to test it and make sure it's the right thing here, but it looks plausible. Could someone who is more i386-wizardly than I am take a look at it?
mbr_gpt_crc.S
(text/plain, 811 B)
/* I hereby place this file into the public domain. */ /* ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/arch/i386/stand/mbr/gpt.S */ /* /src/sys/arch/i386/stand/mbr/gpt.S */ /* replace lines 419-457 inclusive */ #ifndef NO_CRC_CHECK /* * The CRC32 calculation * * %si address of block to hash * %di stop address * %cx counter * %ebx crc (returned) */ crc32: orl $-1, %ebx /* init value */ 1: xorb (%si), %bl /* xoring next message byte with previous result */ inc %si movb $8, %cl /* set bit counter */ 2: shrl $1, %ebx jnc 3f crc32_poly = . + 3 /* gross, but saves a few bytes */ xorl $0xedb88320, %ebx /* EFI CRC32 Polynomial */ 3: loop 2b /* loop over bits */ cmp %di, %si /* do we reached end of message? */ jne 1b notl %ebx /* result correction */ ret #endif