diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2009-07-11 13:32:24 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-07-11 13:32:24 -0400 |
| commit | 59f002964f4e6668a0132cd796b82f7f8a4803f0 (patch) | |
| tree | 457381be67d7884e11846ed585940c9ef7024d40 /arch/sh/boot/compressed/misc.c | |
| parent | b14c6d428a54fb3235e69fd78fba9080c96645be (diff) | |
sh: rename arch/sh/boot/compressed/misc_32.c -> misc.c
This is now used by both sh64 and regular sh, kill off the old sh64
version now too.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/boot/compressed/misc.c')
| -rw-r--r-- | arch/sh/boot/compressed/misc.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/arch/sh/boot/compressed/misc.c b/arch/sh/boot/compressed/misc.c new file mode 100644 index 000000000000..4eb27e61f8e3 --- /dev/null +++ b/arch/sh/boot/compressed/misc.c | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | /* | ||
| 2 | * arch/sh/boot/compressed/misc.c | ||
| 3 | * | ||
| 4 | * This is a collection of several routines from gzip-1.0.3 | ||
| 5 | * adapted for Linux. | ||
| 6 | * | ||
| 7 | * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 | ||
| 8 | * | ||
| 9 | * Adapted for SH by Stuart Menefy, Aug 1999 | ||
| 10 | * | ||
| 11 | * Modified to use standard LinuxSH BIOS by Greg Banks 7Jul2000 | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <asm/uaccess.h> | ||
| 15 | #include <asm/addrspace.h> | ||
| 16 | #include <asm/page.h> | ||
| 17 | #include <asm/sh_bios.h> | ||
| 18 | |||
| 19 | /* | ||
| 20 | * gzip declarations | ||
| 21 | */ | ||
| 22 | |||
| 23 | #define STATIC static | ||
| 24 | |||
| 25 | #undef memset | ||
| 26 | #undef memcpy | ||
| 27 | #define memzero(s, n) memset ((s), 0, (n)) | ||
| 28 | |||
| 29 | /* cache.c */ | ||
| 30 | #define CACHE_ENABLE 0 | ||
| 31 | #define CACHE_DISABLE 1 | ||
| 32 | int cache_control(unsigned int command); | ||
| 33 | |||
| 34 | extern char input_data[]; | ||
| 35 | extern int input_len; | ||
| 36 | static unsigned char *output; | ||
| 37 | |||
| 38 | static void error(char *m); | ||
| 39 | |||
| 40 | int puts(const char *); | ||
| 41 | |||
| 42 | extern int _text; /* Defined in vmlinux.lds.S */ | ||
| 43 | extern int _end; | ||
| 44 | static unsigned long free_mem_ptr; | ||
| 45 | static unsigned long free_mem_end_ptr; | ||
| 46 | |||
| 47 | #ifdef CONFIG_HAVE_KERNEL_BZIP2 | ||
| 48 | #define HEAP_SIZE 0x400000 | ||
| 49 | #else | ||
| 50 | #define HEAP_SIZE 0x10000 | ||
| 51 | #endif | ||
| 52 | |||
| 53 | #ifdef CONFIG_KERNEL_GZIP | ||
| 54 | #include "../../../../lib/decompress_inflate.c" | ||
| 55 | #endif | ||
| 56 | |||
| 57 | #ifdef CONFIG_KERNEL_BZIP2 | ||
| 58 | #include "../../../../lib/decompress_bunzip2.c" | ||
| 59 | #endif | ||
| 60 | |||
| 61 | #ifdef CONFIG_KERNEL_LZMA | ||
| 62 | #include "../../../../lib/decompress_unlzma.c" | ||
| 63 | #endif | ||
| 64 | |||
| 65 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
| 66 | size_t strlen(const char *s) | ||
| 67 | { | ||
| 68 | int i = 0; | ||
| 69 | |||
| 70 | while (*s++) | ||
| 71 | i++; | ||
| 72 | return i; | ||
| 73 | } | ||
| 74 | |||
| 75 | int puts(const char *s) | ||
| 76 | { | ||
| 77 | int len = strlen(s); | ||
| 78 | sh_bios_console_write(s, len); | ||
| 79 | return len; | ||
| 80 | } | ||
| 81 | #else | ||
| 82 | int puts(const char *s) | ||
| 83 | { | ||
| 84 | /* This should be updated to use the sh-sci routines */ | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | #endif | ||
| 88 | |||
| 89 | void* memset(void* s, int c, size_t n) | ||
| 90 | { | ||
| 91 | int i; | ||
| 92 | char *ss = (char*)s; | ||
| 93 | |||
| 94 | for (i=0;i<n;i++) ss[i] = c; | ||
| 95 | return s; | ||
| 96 | } | ||
| 97 | |||
| 98 | void* memcpy(void* __dest, __const void* __src, | ||
| 99 | size_t __n) | ||
| 100 | { | ||
| 101 | int i; | ||
| 102 | char *d = (char *)__dest, *s = (char *)__src; | ||
| 103 | |||
| 104 | for (i=0;i<__n;i++) d[i] = s[i]; | ||
| 105 | return __dest; | ||
| 106 | } | ||
| 107 | |||
| 108 | static void error(char *x) | ||
| 109 | { | ||
| 110 | puts("\n\n"); | ||
| 111 | puts(x); | ||
| 112 | puts("\n\n -- System halted"); | ||
| 113 | |||
| 114 | while(1); /* Halt */ | ||
| 115 | } | ||
| 116 | |||
| 117 | #ifdef CONFIG_SUPERH64 | ||
| 118 | #define stackalign 8 | ||
| 119 | #else | ||
| 120 | #define stackalign 4 | ||
| 121 | #endif | ||
| 122 | |||
| 123 | #define STACK_SIZE (4096) | ||
| 124 | long __attribute__ ((aligned(stackalign))) user_stack[STACK_SIZE]; | ||
| 125 | long *stack_start = &user_stack[STACK_SIZE]; | ||
| 126 | |||
| 127 | void decompress_kernel(void) | ||
| 128 | { | ||
| 129 | unsigned long output_addr; | ||
| 130 | |||
| 131 | output_addr = PHYSADDR((unsigned long)&_text+PAGE_SIZE); | ||
| 132 | #ifdef CONFIG_29BIT | ||
| 133 | output_addr |= P2SEG; | ||
| 134 | #endif | ||
| 135 | |||
| 136 | output = (unsigned char *)output_addr; | ||
| 137 | free_mem_ptr = (unsigned long)&_end; | ||
| 138 | free_mem_end_ptr = free_mem_ptr + HEAP_SIZE; | ||
| 139 | |||
| 140 | puts("Uncompressing Linux... "); | ||
| 141 | cache_control(CACHE_ENABLE); | ||
| 142 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | ||
| 143 | cache_control(CACHE_DISABLE); | ||
| 144 | puts("Ok, booting the kernel.\n"); | ||
| 145 | } | ||
