*/
 
 
-#ifndef STATIC
+#ifdef STATIC
+#define PREBOOT
+#else
 #include <linux/decompress/bunzip2.h>
-#endif /* !STATIC */
+#endif /* STATIC */
 
 #include <linux/decompress/mm.h>
 #include <linux/slab.h>
        set_error_fn(error_fn);
        if (flush)
                outbuf = malloc(BZIP2_IOBUF_SIZE);
-       else
-               len -= 4; /* Uncompressed size hack active in pre-boot
-                            environment */
+
        if (!outbuf) {
                error("Could not allocate output bufer");
                return -1;
        return i;
 }
 
-#define decompress bunzip2
+#ifdef PREBOOT
+STATIC int INIT decompress(unsigned char *buf, int len,
+                       int(*fill)(void*, unsigned int),
+                       int(*flush)(void*, unsigned int),
+                       unsigned char *outbuf,
+                       int *pos,
+                       void(*error_fn)(char *x))
+{
+       return bunzip2(buf, len - 4, fill, flush, outbuf, pos, error_fn);
+}
+#endif
 
  *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef STATIC
+#ifdef STATIC
+#define PREBOOT
+#else
 #include <linux/decompress/unlzma.h>
 #endif /* STATIC */
 
        int ret = -1;
 
        set_error_fn(error_fn);
-       if (!flush)
-               in_len -= 4; /* Uncompressed size hack active in pre-boot
-                               environment */
+
        if (buf)
                inbuf = buf;
        else
        return ret;
 }
 
-#define decompress unlzma
+#ifdef PREBOOT
+STATIC int INIT decompress(unsigned char *buf, int in_len,
+                             int(*fill)(void*, unsigned int),
+                             int(*flush)(void*, unsigned int),
+                             unsigned char *output,
+                             int *posp,
+                             void(*error_fn)(char *x)
+       )
+{
+       return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
+}
+#endif