better keep_alive() handling
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 6 Oct 2008 11:16:10 +0000 (11:16 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 6 Oct 2008 11:16:10 +0000 (11:16 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1018 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/image.c

index 793a811f6724ba901a63aa6618b4663c5c960c2e..48c6a6c8cb7a18cae05cb6ac6d6fc02e1d1c1635 100644 (file)
@@ -998,36 +998,42 @@ int image_close(image_t *image)
        return ERROR_OK;
 }
 
-static u32 crc32_table[256] = {0, 0};
-
 int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum)
 {
        u32 crc = 0xffffffff;
+       LOG_DEBUG("Calculating checksum");
+
+       u32 crc32_table[256];
 
-       if (!crc32_table[1])
+       /* Initialize the CRC table and the decoding table.  */
+       int i, j;
+       unsigned int c;
+       for (i = 0; i < 256; i++)
        {
-               /* Initialize the CRC table and the decoding table.  */
-               int i, j;
-               unsigned int c;
-               for (i = 0; i < 256; i++)
-               {
-                       /* as per gdb */
-                       for (c = i << 24, j = 8; j > 0; --j)
-                               c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
-                       crc32_table[i] = c;
-               }
+               /* as per gdb */
+               for (c = i << 24, j = 8; j > 0; --j)
+                       c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
+               crc32_table[i] = c;
        }
 
-       while (nbytes--)
+       while (nbytes>0)
        {
-               /* as per gdb */
-               crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buffer++) & 255];
-               if ((nbytes%16384)==0)
+               int run=nbytes;
+               if (run>32768)
                {
-                       keep_alive();
+                       run=32768;
                }
+               nbytes-=run;
+               while (run--)
+               {
+                       /* as per gdb */
+                       crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buffer++) & 255];
+               }
+               keep_alive();
        }
 
+       LOG_DEBUG("Calculating checksum done");
+
        *checksum = crc;
        return ERROR_OK;
 }