]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
Handle unaligned sizes in iomemcpy().
authorKevin O'Connor <kevin@koconnor.net>
Tue, 27 Jul 2010 05:14:11 +0000 (01:14 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 27 Jul 2010 05:14:11 +0000 (01:14 -0400)
This fixes a bug causing truncation of uncompressed files in
cbfs_copyfile().

src/coreboot.c
src/util.c

index 5d9a101ab80dd5bd22c310ffe5c40dc8c6ced317..db0063beecaa51fce8a1fcfbc0c0e7eb367f17ed 100644 (file)
@@ -510,11 +510,10 @@ cbfs_copyfile(struct cbfs_file *file, void *dst, u32 maxlen)
     void *src = (void*)file + ntohl(file->offset);
     if (cbfs_iscomp(file)) {
         // Compressed - copy to temp ram and uncompress it.
-        u32 asize = ALIGN(size, 4);
-        void *temp = malloc_tmphigh(asize);
+        void *temp = malloc_tmphigh(size);
         if (!temp)
             return -1;
-        iomemcpy(temp, src, asize);
+        iomemcpy(temp, src, size);
         int ret = ulzma(dst, maxlen, temp, size);
         yield();
         free(temp);
index 2c22dfc32362f7aa75a97b8772476719ff504d93..8e02d1e05444554802f9535a38b4d6e5c36677e7 100644 (file)
@@ -202,24 +202,27 @@ memcpy(void *d1, const void *s1, size_t len)
     return d1;
 }
 
-// Copy from memory mapped IO.  IO mem is very slow, so yield
-// periodically.  'len' must be 4 byte aligned.
+// Copy to/from memory mapped IO.  IO mem is very slow, so yield
+// periodically.
 void
 iomemcpy(void *d, const void *s, u32 len)
 {
     yield();
-    while (len) {
+    while (len > 3) {
         u32 copylen = len;
         if (copylen > 2048)
             copylen = 2048;
-        len -= copylen;
         copylen /= 4;
+        len -= copylen * 4;
         asm volatile(
             "rep movsl (%%esi),%%es:(%%edi)"
             : "+c"(copylen), "+S"(s), "+D"(d)
             : : "cc", "memory");
         yield();
     }
+    if (len)
+        // Copy any remaining bytes.
+        memcpy(d, s, len);
 }
 
 void *