summaryrefslogtreecommitdiff
path: root/util/mkelfImage/kunzip_src/arch
diff options
context:
space:
mode:
authorStefan Reinauer <stepan@coresystems.de>2008-02-15 18:16:06 +0000
committerStefan Reinauer <stepan@openbios.org>2008-02-15 18:16:06 +0000
commitb34eea348cb7d6d9c93d17d51a1f322114b8f15d (patch)
tree38dd85932dacaa7c7a174d87307baff6210d70c4 /util/mkelfImage/kunzip_src/arch
parent46fc14dcc8cdba1d66ae6fa9fdcbbf33265d676e (diff)
Importing mkelfimage from
ftp://ftp.lnxi.com/pub/mkelfImage/mkelfImage-2.7.tar.gz Signed-off-by: Stefan Reinauer <stepan@coresystems.de> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3103 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/mkelfImage/kunzip_src/arch')
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/include/stddef.h15
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/include/stdint.h53
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/include/va-alpha.h128
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/lib/Makefile17
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/lib/divide.S195
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/lib/kunzip.lds50
-rw-r--r--util/mkelfImage/kunzip_src/arch/alpha/lib/start.S89
-rw-r--r--util/mkelfImage/kunzip_src/arch/i386/include/stddef.h15
-rw-r--r--util/mkelfImage/kunzip_src/arch/i386/include/stdint.h52
-rw-r--r--util/mkelfImage/kunzip_src/arch/i386/lib/Makefile1
-rw-r--r--util/mkelfImage/kunzip_src/arch/i386/lib/kunzip.lds50
-rw-r--r--util/mkelfImage/kunzip_src/arch/i386/lib/start.S36
12 files changed, 701 insertions, 0 deletions
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/include/stddef.h b/util/mkelfImage/kunzip_src/arch/alpha/include/stddef.h
new file mode 100644
index 0000000000..37ee13858a
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/include/stddef.h
@@ -0,0 +1,15 @@
+#ifndef ALPHA_STDDEF_H
+#define ALPHA_STDDEF_H
+
+typedef long ptrdiff_t;
+typedef unsigned long size_t;
+typedef long ssize_t;
+
+typedef int wchar_t;
+typedef unsigned int wint_t;
+
+#define NULL 0
+
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+#endif /* ALPHA_STDDEF_H */
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/include/stdint.h b/util/mkelfImage/kunzip_src/arch/alpha/include/stdint.h
new file mode 100644
index 0000000000..9b93a0c84f
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/include/stdint.h
@@ -0,0 +1,53 @@
+#ifndef ALPHA_STDINT_H
+#define ALPHA_STDINT_H
+
+/* Exact integral types */
+typedef unsigned char uint8_t;
+typedef signed char int8_t;
+
+typedef unsigned short uint16_t;
+typedef signed short int16_t;
+
+typedef unsigned int uint32_t;
+typedef signed int int32_t;
+
+typedef unsigned long uint64_t;
+typedef signed long int64_t;
+
+
+/* Small types */
+typedef unsigned char uint_least8_t;
+typedef signed char int_least8_t;
+
+typedef unsigned short uint_least16_t;
+typedef signed short int_least16_t;
+
+typedef unsigned int uint_least32_t;
+typedef signed int int_least32_t;
+
+typedef unsigned long uint_least64_t;
+typedef signed long int_least64_t;
+
+/* Fast Types */
+typedef unsigned char uint_fast8_t;
+typedef signed char int_fast8_t;
+
+typedef unsigned long uint_fast16_t;
+typedef signed long int_fast16_t;
+
+typedef unsigned long uint_fast32_t;
+typedef signed long int_fast32_t;
+
+typedef unsigned long uint_fast64_t;
+typedef signed long int_fast64_t;
+
+/* Types for `void *' pointers. */
+typedef long intptr_t;
+typedef unsigned long uintptr_t;
+
+/* Largest integral types */
+typedef long intmax_t;
+typedef unsigned long uintmax_t;
+
+
+#endif /* ALPHA_STDINT_H */
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/include/va-alpha.h b/util/mkelfImage/kunzip_src/arch/alpha/include/va-alpha.h
new file mode 100644
index 0000000000..2528a712ad
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/include/va-alpha.h
@@ -0,0 +1,128 @@
+/* GNU C varargs and stdargs support for the DEC Alpha. */
+
+/* Note: We must use the name __builtin_savregs. GCC attaches special
+ significance to that name. In particular, regardless of where in a
+ function __builtin_saveregs is called, GCC moves the call up to the
+ very start of the function. */
+
+/* Define __gnuc_va_list. */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+
+/* In VMS, __gnuc_va_list is simply char *; on OSF, it's a structure. */
+
+#ifdef __VMS__
+typedef char *__gnuc_va_list;
+#else
+
+typedef struct {
+ char *__base; /* Pointer to first integer register. */
+ int __offset; /* Byte offset of args so far. */
+} __gnuc_va_list;
+#endif
+
+#endif /* __GNUC_VA_LIST */
+
+/* If this is for internal libc use, don't define anything but
+ __gnuc_va_list. */
+
+#if !defined(__GNUC_VA_LIST_1) && (defined (_STDARG_H) || defined (_VARARGS_H))
+#define __GNUC_VA_LIST_1
+
+#define _VA_LIST
+#define _VA_LIST_
+
+typedef __gnuc_va_list va_list;
+
+#if !defined(_STDARG_H)
+
+/* varargs support */
+#define va_alist __builtin_va_alist
+#define va_dcl int __builtin_va_alist;...
+#ifdef __VMS__
+#define va_start(pvar) ((pvar) = __builtin_saveregs ())
+#else
+#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ())
+#endif
+
+#else /* STDARG.H */
+
+/* ANSI alternative. */
+
+/* Call __builtin_next_arg even though we aren't using its value, so that
+ we can verify that firstarg is correct. */
+
+#ifdef __VMS__
+#define va_start(pvar, firstarg) \
+ (__builtin_next_arg (firstarg), \
+ (pvar) = __builtin_saveregs ())
+#else
+#define va_start(pvar, firstarg) \
+ (__builtin_next_arg (firstarg), \
+ (pvar) = *(__gnuc_va_list *) __builtin_saveregs ())
+#endif
+
+#endif /* _STDARG_H */
+
+#define va_end(__va) ((void) 0)
+
+/* Values returned by __builtin_classify_type. */
+
+enum {
+ __no_type_class = -1,
+ __void_type_class,
+ __integer_type_class,
+ __char_type_class,
+ __enumeral_type_class,
+ __boolean_type_class,
+ __pointer_type_class,
+ __reference_type_class,
+ __offset_type_class,
+ __real_type_class,
+ __complex_type_class,
+ __function_type_class,
+ __method_type_class,
+ __record_type_class,
+ __union_type_class,
+ __array_type_class,
+ __string_type_class,
+ __set_type_class,
+ __file_type_class,
+ __lang_type_class
+};
+
+/* Note that parameters are always aligned at least to a word boundary
+ (when passed) regardless of what GCC's __alignof__ operator says. */
+
+/* Avoid errors if compiling GCC v2 with GCC v1. */
+#if __GNUC__ == 1
+#define __extension__
+#endif
+
+/* Get the size of a type in bytes, rounded up to an integral number
+ of words. */
+
+#define __va_tsize(__type) \
+ (((sizeof (__type) + __extension__ sizeof (long long) - 1) \
+ / __extension__ sizeof (long long)) * __extension__ sizeof (long long))
+
+#ifdef __VMS__
+#define va_arg(__va, __type) \
+(*(((__va) += __va_tsize (__type)), \
+ (__type *)(void *)((__va) - __va_tsize (__type))))
+
+#else
+
+#define va_arg(__va, __type) \
+(*(((__va).__offset += __va_tsize (__type)), \
+ (__type *)(void *)((__va).__base + (__va).__offset \
+ - (((__builtin_classify_type (* (__type *) 0) \
+ == __real_type_class) && (__va).__offset <= (6 * 8)) \
+ ? (6 * 8) + 8 : __va_tsize (__type)))))
+#endif
+
+/* Copy __gnuc_va_list into another variable of this type. */
+#define __va_copy(dest, src) (dest) = (src)
+
+#endif /* __GNUC_VA_LIST_1 */
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/lib/Makefile b/util/mkelfImage/kunzip_src/arch/alpha/lib/Makefile
new file mode 100644
index 0000000000..2fd15b06a0
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/lib/Makefile
@@ -0,0 +1,17 @@
+ARCH_OPTIONS=
+
+OBJECTS += __divqu.o __remqu.o __divlu.o __remlu.o
+
+$(OBJDIR)/__divqu.o: $(SRC)/arch/alpha/lib/divide.S
+ $(CC) $(CFLAGS) -DDIV -c -o $@ $^
+
+$(OBJDIR)/__remqu.o: $(SRC)/arch/alpha/lib/divide.S
+ $(CC) $(CFLAGS) -DREM -c -o $@ $^
+
+$(OBJDIR)/__divlu.o: $(SRC)/arch/alpha/lib/divide.S
+ $(CC) $(CFLAGS) -DDIV -DINTSIZE -c -o $@ $^
+
+$(OBJDIR)/__remlu.o: $(SRC)/arch/alpha/lib/divide.S
+ $(CC) $(CFLAGS) -DREM -DINTSIZE -c -o $@ $^
+
+
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/lib/divide.S b/util/mkelfImage/kunzip_src/arch/alpha/lib/divide.S
new file mode 100644
index 0000000000..a4bc1f751e
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/lib/divide.S
@@ -0,0 +1,195 @@
+/*
+ * cpu/ev6/divide.S
+ *
+ * (C) 1995 Linus Torvalds
+ *
+ * Alpha division..
+ */
+
+/*
+ * The alpha chip doesn't provide hardware division, so we have to do it
+ * by hand. The compiler expects the functions
+ *
+ * __divqu: 64-bit unsigned long divide
+ * __remqu: 64-bit unsigned long remainder
+ * __divqs/__remqs: signed 64-bit
+ * __divlu/__remlu: unsigned 32-bit
+ * __divls/__remls: signed 32-bit
+ *
+ * These are not normal C functions: instead of the normal
+ * calling sequence, these expect their arguments in registers
+ * $24 and $25, and return the result in $27. Register $28 may
+ * be clobbered (assembly temporary), anything else must be saved.
+ *
+ * In short: painful.
+ *
+ * This is a rather simple bit-at-a-time algorithm: it's very good
+ * at dividing random 64-bit numbers, but the more usual case where
+ * the divisor is small is handled better by the DEC algorithm
+ * using lookup tables. This uses much less memory, though, and is
+ * nicer on the cache.. Besides, I don't know the copyright status
+ * of the DEC code.
+ */
+
+/*
+ * My temporaries:
+ * $0 - current bit
+ * $1 - shifted divisor
+ * $2 - modulus/quotient
+ *
+ * $23 - return address
+ * $24 - dividend
+ * $25 - divisor
+ *
+ * $27 - quotient/modulus
+ * $28 - compare status
+ */
+
+#define halt .long 0
+
+/*
+ * Select function type and registers
+ */
+#define mask $0
+#define divisor $1
+#define compare $28
+#define tmp1 $3
+#define tmp2 $4
+
+#ifdef DIV
+#define DIV_ONLY(x,y...) x,##y
+#define MOD_ONLY(x,y...)
+#define func(x) __div##x
+#define modulus $2
+#define quotient $27
+#define GETSIGN(x) xor $24,$25,x
+#define STACK 48
+#else
+#define DIV_ONLY(x,y...)
+#define MOD_ONLY(x,y...) x,##y
+#define func(x) __rem##x
+#define modulus $27
+#define quotient $2
+#define GETSIGN(x) bis $24,$24,x
+#define STACK 32
+#endif
+
+/*
+ * For 32-bit operations, we need to extend to 64-bit
+ */
+#ifdef INTSIZE
+#define ufunction func(lu)
+#define sfunction func(l)
+#define LONGIFY(x) zapnot x,15,x
+#define SLONGIFY(x) addl x,0,x
+#else
+#define ufunction func(qu)
+#define sfunction func(q)
+#define LONGIFY(x)
+#define SLONGIFY(x)
+#endif
+
+.set noat
+.align 3
+.globl ufunction
+.ent ufunction
+ufunction:
+ subq $30,STACK,$30
+ .frame $30,STACK,$23
+ .prologue 0
+
+7: stq $1, 0($30)
+ bis $25,$25,divisor
+ stq $2, 8($30)
+ bis $24,$24,modulus
+ stq $0,16($30)
+ bis $31,$31,quotient
+ LONGIFY(divisor)
+ stq tmp1,24($30)
+ LONGIFY(modulus)
+ bis $31,1,mask
+ DIV_ONLY(stq tmp2,32($30))
+ beq divisor, 9f /* div by zero */
+
+#ifdef INTSIZE
+ /*
+ * shift divisor left, using 3-bit shifts for
+ * 32-bit divides as we can't overflow. Three-bit
+ * shifts will result in looping three times less
+ * here, but can result in two loops more later.
+ * Thus using a large shift isn't worth it (and
+ * s8add pairs better than a sll..)
+ */
+1: cmpult divisor,modulus,compare
+ s8addq divisor,$31,divisor
+ s8addq mask,$31,mask
+ bne compare,1b
+#else
+1: cmpult divisor,modulus,compare
+ blt divisor, 2f
+ addq divisor,divisor,divisor
+ addq mask,mask,mask
+ bne compare,1b
+ unop
+#endif
+
+ /* ok, start to go right again.. */
+2: DIV_ONLY(addq quotient,mask,tmp2)
+ srl mask,1,mask
+ cmpule divisor,modulus,compare
+ subq modulus,divisor,tmp1
+ DIV_ONLY(cmovne compare,tmp2,quotient)
+ srl divisor,1,divisor
+ cmovne compare,tmp1,modulus
+ bne mask,2b
+
+9: ldq $1, 0($30)
+ ldq $2, 8($30)
+ ldq $0,16($30)
+ ldq tmp1,24($30)
+ DIV_ONLY(ldq tmp2,32($30))
+ addq $30,STACK,$30
+ ret $31,($23),1
+ .end ufunction
+
+/*
+ * Uhh.. Ugly signed division. I'd rather not have it at all, but
+ * it's needed in some circumstances. There are different ways to
+ * handle this, really. This does:
+ * -a / b = a / -b = -(a / b)
+ * -a % b = -(a % b)
+ * a % -b = a % b
+ * which is probably not the best solution, but at least should
+ * have the property that (x/y)*y + (x%y) = x.
+ */
+.align 3
+.globl sfunction
+.ent sfunction
+sfunction:
+ subq $30,STACK,$30
+ .frame $30,STACK,$23
+ .prologue 0
+ bis $24,$25,$28
+ SLONGIFY($28)
+ bge $28,7b
+ stq $24,0($30)
+ subq $31,$24,$28
+ stq $25,8($30)
+ cmovlt $24,$28,$24 /* abs($24) */
+ stq $23,16($30)
+ subq $31,$25,$28
+ stq tmp1,24($30)
+ cmovlt $25,$28,$25 /* abs($25) */
+ unop
+ bsr $23,ufunction
+ ldq $24,0($30)
+ ldq $25,8($30)
+ GETSIGN($28)
+ subq $31,$27,tmp1
+ SLONGIFY($28)
+ ldq $23,16($30)
+ cmovlt $28,tmp1,$27
+ ldq tmp1,24($30)
+ addq $30,STACK,$30
+ ret $31,($23),1
+ .end sfunction
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/lib/kunzip.lds b/util/mkelfImage/kunzip_src/arch/alpha/lib/kunzip.lds
new file mode 100644
index 0000000000..ed632686a8
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/lib/kunzip.lds
@@ -0,0 +1,50 @@
+PAGE_SIZE = 65536;
+BASIC_ALIGN = 8;
+OUTPUT_FORMAT("elf64-alpha")
+ENTRY(__start)
+SECTIONS
+{
+ . = PAGE_SIZE;
+ _start = .;
+ /*
+ * First we place the code and read only data (typically const declared).
+ * This get placed in rom.
+ */
+ .text : {
+ _text = .;
+ *(.text)
+ _etext = .;
+ _rodata = .;
+ *(.rodata);
+ _erodata = .;
+ }
+ /* Global data */
+ .data : {
+ _data = .;
+ *(.data)
+ CONSTRUCTORS
+ *(.got)
+ *(.sdata)
+ _edata = .;
+ }
+
+ /* Important align _bss so bss may be zeroed with quadword access */
+ . = ALIGN(BASIC_ALIGN);
+ .bss : {
+ _bss = .;
+ *(.sbss)
+ *(.scommon)
+ *(.bss)
+ *(COMMON)
+ *(.heap)
+ *(.stack)
+ /* Important align _ebss so bss may be zeroed with quadword access */
+ . = ALIGN(BASIC_ALIGN);
+ _ebss = .;
+ }
+ _end = .;
+
+ /DISCARD/ : {
+ *(*)
+ }
+}
diff --git a/util/mkelfImage/kunzip_src/arch/alpha/lib/start.S b/util/mkelfImage/kunzip_src/arch/alpha/lib/start.S
new file mode 100644
index 0000000000..a89f4ca6de
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/alpha/lib/start.S
@@ -0,0 +1,89 @@
+.set noat
+.set noreorder
+.text
+
+__original_registers:
+ .quad 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+__entry:
+ .quad entry
+
+.globl __start
+__start:
+ br $27, __save_registers
+__save_registers:
+ lda $27, (__original_registers - __save_registers)($27)
+ stq $0, 0($27)
+ stq $1, 8($27)
+ stq $2, 16($27)
+ stq $3, 24($27)
+ stq $4, 32($27)
+ stq $5, 40($27)
+ stq $6, 48($27)
+ stq $7, 56($27)
+ stq $8, 64($27)
+ stq $9, 72($27)
+ stq $10, 80($27)
+ stq $11, 88($27)
+ stq $12, 96($27)
+ stq $13, 104($27)
+ stq $14, 112($27)
+ stq $15, 120($27)
+ stq $16, 128($27)
+ stq $17, 136($27)
+ stq $18, 144($27)
+ stq $19, 152($27)
+ stq $20, 160($27)
+ stq $21, 168($27)
+ stq $22, 176($27)
+ stq $23, 184($27)
+ stq $24, 192($27)
+ stq $25, 200($27)
+ stq $26, 208($27)
+ stq $28, 224($27)
+ stq $29, 232($27)
+ stq $30, 240($27)
+
+__normal_start:
+ ldgp $29, (__normal_start - __original_registers)($27)
+ lda $30, _estack
+ jsr $26, kunzip
+
+.globl jmp_to_program_entry
+jmp_to_program_entry:
+ br $27, __restore_registers
+__restore_registers:
+ lda $27,(__original_registers - __restore_registers)($27)
+ stq $16, (__entry - __original_registers)($27)
+ ldq $0, 0($27)
+ ldq $1, 8($27)
+ ldq $2, 16($27)
+ ldq $3, 24($27)
+ ldq $4, 32($27)
+ ldq $5, 40($27)
+ ldq $6, 48($27)
+ ldq $7, 56($27)
+ ldq $8, 64($27)
+ ldq $9, 72($27)
+ ldq $10, 80($27)
+ ldq $11, 88($27)
+ ldq $12, 96($27)
+ ldq $13, 104($27)
+ ldq $14, 112($27)
+ ldq $15, 120($27)
+ ldq $16, 128($27)
+ ldq $17, 136($27)
+ ldq $18, 144($27)
+ ldq $19, 152($27)
+ ldq $20, 160($27)
+ ldq $21, 168($27)
+ ldq $22, 176($27)
+ ldq $23, 184($27)
+ ldq $24, 192($27)
+ ldq $25, 200($27)
+ ldq $26, 208($27)
+ ldq $28, 224($27)
+ ldq $29, 232($27)
+ ldq $30, 240($27)
+ ldq $27, (__entry - __original_registers)($27)
+ jsr $31, ($27)
diff --git a/util/mkelfImage/kunzip_src/arch/i386/include/stddef.h b/util/mkelfImage/kunzip_src/arch/i386/include/stddef.h
new file mode 100644
index 0000000000..88a3b48957
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/i386/include/stddef.h
@@ -0,0 +1,15 @@
+#ifndef I386_STDDEF_H
+#define I386_STDDEF_H
+
+typedef long ptrdiff_t;
+typedef unsigned long size_t;
+typedef long ssize_t;
+
+typedef int wchar_t;
+typedef unsigned int wint_t;
+
+#define NULL 0
+
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+
+#endif I386_STDDEF_H
diff --git a/util/mkelfImage/kunzip_src/arch/i386/include/stdint.h b/util/mkelfImage/kunzip_src/arch/i386/include/stdint.h
new file mode 100644
index 0000000000..58d7519cde
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/i386/include/stdint.h
@@ -0,0 +1,52 @@
+#ifndef I386_STDINT_H
+#define I386_STDINT_H
+
+/* Exact integral types */
+typedef unsigned char uint8_t;
+typedef signed char int8_t;
+
+typedef unsigned short uint16_t;
+typedef signed short int16_t;
+
+typedef unsigned int uint32_t;
+typedef signed int int32_t;
+
+typedef unsigned long long uint64_t;
+typedef signed long long int64_t;
+
+/* Small types */
+typedef unsigned char uint_least8_t;
+typedef signed char int_least8_t;
+
+typedef unsigned short uint_least16_t;
+typedef signed short int_least16_t;
+
+typedef unsigned int uint_least32_t;
+typedef signed int int_least32_t;
+
+typedef unsigned long long uint_least64_t;
+typedef signed long long int_least64_t;
+
+/* Fast Types */
+typedef unsigned char uint_fast8_t;
+typedef signed char int_fast8_t;
+
+typedef unsigned int uint_fast16_t;
+typedef signed int int_fast16_t;
+
+typedef unsigned int uint_fast32_t;
+typedef signed int int_fast32_t;
+
+typedef unsigned long long uint_fast64_t;
+typedef signed long long int_fast64_t;
+
+/* Types for `void *' pointers. */
+typedef int intptr_t;
+typedef unsigned int uintptr_t;
+
+/* Largest integral types */
+typedef long long int intmax_t;
+typedef unsigned long long uintmax_t;
+
+
+#endif /* I386_STDINT_H */
diff --git a/util/mkelfImage/kunzip_src/arch/i386/lib/Makefile b/util/mkelfImage/kunzip_src/arch/i386/lib/Makefile
new file mode 100644
index 0000000000..df2474d210
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/i386/lib/Makefile
@@ -0,0 +1 @@
+ARCH_OPTIONS=
diff --git a/util/mkelfImage/kunzip_src/arch/i386/lib/kunzip.lds b/util/mkelfImage/kunzip_src/arch/i386/lib/kunzip.lds
new file mode 100644
index 0000000000..0e649005cf
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/i386/lib/kunzip.lds
@@ -0,0 +1,50 @@
+PAGE_SIZE = 4096;
+BASIC_ALIGN = 8;
+OUTPUT_FORMAT("elf32-i386")
+ENTRY(__start)
+SECTIONS
+{
+ . = PAGE_SIZE;
+ _start = .;
+ /*
+ * First we place the code and read only data (typically const declared).
+ * This get placed in rom.
+ */
+ .text : {
+ _text = .;
+ *(.text)
+ _etext = .;
+ _rodata = .;
+ *(.rodata);
+ _erodata = .;
+ }
+ /* Global data */
+ .data : {
+ _data = .;
+ *(.data)
+ CONSTRUCTORS
+ *(.got)
+ *(.sdata)
+ _edata = .;
+ }
+
+ /* Important align _bss so bss may be zeroed with quadword access */
+ . = ALIGN(BASIC_ALIGN);
+ .bss : {
+ _bss = .;
+ *(.sbss)
+ *(.scommon)
+ *(.bss)
+ *(COMMON)
+ *(.heap)
+ *(.stack)
+ /* Important align _ebss so bss may be zeroed with quadword access */
+ . = ALIGN(BASIC_ALIGN);
+ _ebss = .;
+ }
+ _end = .;
+
+ /DISCARD/ : {
+ *(*)
+ }
+}
diff --git a/util/mkelfImage/kunzip_src/arch/i386/lib/start.S b/util/mkelfImage/kunzip_src/arch/i386/lib/start.S
new file mode 100644
index 0000000000..fec7c9da66
--- /dev/null
+++ b/util/mkelfImage/kunzip_src/arch/i386/lib/start.S
@@ -0,0 +1,36 @@
+.text
+
+__original_registers:
+ .long 0, 0, 0, 0, 0, 0 , 0 , 0
+__entry:
+ .long entry
+
+.globl __start
+__start:
+ movl %eax, 0+__original_registers
+ movl %ebx, 4+__original_registers
+ movl %ecx, 8+__original_registers
+ movl %edx, 12+__original_registers
+ movl %esi, 16+__original_registers
+ movl %edi, 20+__original_registers
+ movl %esp, 24+__original_registers
+ movl %ebp, 28+__original_registers
+
+__normal_start:
+ movl $_estack, %esp
+ call kunzip
+
+.globl jmp_to_program_entry
+jmp_to_program_entry:
+ movl 4(%esp), %eax
+ movl %eax, __entry
+ movl 0+__original_registers, %eax
+ movl 4+__original_registers, %ebx
+ movl 8+__original_registers, %ecx
+ movl 12+__original_registers, %edx
+ movl 16+__original_registers, %esi
+ movl 20+__original_registers, %edi
+ movl 24+__original_registers, %esp
+ movl 28+__original_registers, %ebp
+ jmp *__entry
+ \ No newline at end of file