]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
MAke a separate scratch for decompressor
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 21 Sep 2010 17:39:51 +0000 (19:39 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 21 Sep 2010 17:39:51 +0000 (19:39 +0200)
grub-core/boot/decompressor.c
grub-core/boot/mips/startup_raw.S
grub-core/kern/mips/startup.S
grub-core/lib/xzembed/xz_dec_lzma2.c
include/grub/decompressor.h

index 5c16fb932901f4325ca0717dc561bedc2d8d37dc..604fc754c72a026eafa8d90ce84364ddac016b1e 100644 (file)
@@ -80,6 +80,27 @@ void *memmove (void *dest, const void *src, grub_size_t n)
 void *memcpy (void *dest, const void *src, grub_size_t n)
   __attribute__ ((alias ("grub_memmove")));
 
+void *grub_decompressor_scratch;
+
+void
+find_scratch (void *src, void *dst, unsigned long srcsize,
+             unsigned long dstsize)
+{
+#ifdef _mips
+  /* Decoding from ROM.  */
+  if (((grub_addr_t) src & 0x10000000))
+    {
+      grub_decompressor_scratch = (char *) dst + dstsize;
+      return;
+    }
+#endif
+  if ((char *) src + srcsize > (char *) dst + dstsize)
+    grub_decompressor_scratch = (char *) src + srcsize;
+  else
+    grub_decompressor_scratch = (char *) dst + dstsize;
+  return;
+}
+
 void
 grub_decompress_core (void *src, void *dst, unsigned long srcsize,
                      unsigned long dstsize)
@@ -87,6 +108,8 @@ grub_decompress_core (void *src, void *dst, unsigned long srcsize,
   struct xz_dec *dec;
   struct xz_buf buf;
 
+  find_scratch (src, dst, srcsize, dstsize);
+
   dec = xz_dec_init (GRUB_DECOMPRESSOR_DICT_SIZE);
 
   buf.in = src;
index 67dc2ec03a86a821b9fc24560679cd446fb0865b..d810f2fb4ecf81f3eb14ff45829311e6206a9ea4 100644 (file)
@@ -49,7 +49,7 @@ codestart:
 
        /* Parse arguments. Has to be done before relocation.
        So need to do it in asm.  */
-#if 0 // def GRUB_MACHINE_MIPS_YEELOONG
+#ifdef GRUB_MACHINE_MIPS_YEELOONG
        move $s2, $zero
        move $s3, $zero
        move $s4, $zero
index 1b27a5b1fc45cfbd1889cf7f8f041372ab6f5183..97145b81881fa9ef8ed0980b599ea680b7396ff2 100644 (file)
@@ -109,10 +109,10 @@ bsscont:
        bne $t3, $0, bsscont
         addiu $t1, $t1, 1
 
-       li $sp, GRUB_MACHINE_MEMORY_STACK_HIGH
        lui $t1, %hi(grub_main)
        addiu $t1, %lo(grub_main)
 
+       lui $sp, %hi(GRUB_MACHINE_MEMORY_STACK_HIGH)
        jr $t1
-        nop
+        addiu $sp, $sp, %lo(GRUB_MACHINE_MEMORY_STACK_HIGH)
 
index c55773ce019bd1596e17e7b6bdc2ea93e8e5e26c..7899e9e874eddb2a996480cf6336e8f8fbadcf24 100644 (file)
@@ -1103,7 +1103,6 @@ enum xz_ret xz_dec_lzma2_run(
 #ifdef GRUB_EMBED_DECOMPRESSOR
 #include <grub/decompressor.h>
 static struct xz_dec_lzma2 lzma2;
-static char dict[GRUB_DECOMPRESSOR_DICT_SIZE];
 #endif
 
 struct xz_dec_lzma2 * xz_dec_lzma2_create(uint32_t dict_max)
@@ -1128,14 +1127,8 @@ struct xz_dec_lzma2 * xz_dec_lzma2_create(uint32_t dict_max)
        }
 
 #else
-       if (dict_max > GRUB_DECOMPRESSOR_DICT_SIZE)
-               return NULL;
-
        s = &lzma2;
-
-       if (dict_max > 0) {
-               s->dict.buf = (void *) &dict;
-       }
+       s->dict.buf = grub_decompressor_scratch;
 #endif
 
        s->dict.allocated = dict_max;
@@ -1165,9 +1158,6 @@ enum xz_ret xz_dec_lzma2_reset(
                s->dict.buf = newdict;
                s->dict.allocated = s->dict.size;
        }
-#else
-       if (s->dict.allocated > 0 && s->dict.allocated < s->dict.size)
-               return XZ_MEMLIMIT_ERROR;
 #endif
        s->dict.end = s->dict.size;
 
index 4d99c41f7db5cbdf47f804d455c9d404c6ce9bc4..a6eefb01b1b37ffe3dc57405e794e02b54ce6d0d 100644 (file)
@@ -23,6 +23,12 @@ void
 grub_decompress_core (void *src, void *dst, unsigned long srcsize,
                      unsigned long dstsize);
 
+void
+find_scratch (void *src, void *dst, unsigned long srcsize,
+             unsigned long dstsize);
+
 #define GRUB_DECOMPRESSOR_DICT_SIZE (1 << 16)
 
+extern void *grub_decompressor_scratch;
+
 #endif