mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-06 20:53:54 +08:00
parisc: Add core code for self-extracting kernel
Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
e35a2ce692
commit
2f3c7b8137
2
arch/parisc/boot/.gitignore
vendored
Normal file
2
arch/parisc/boot/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
image
|
||||||
|
bzImage
|
26
arch/parisc/boot/Makefile
Normal file
26
arch/parisc/boot/Makefile
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#
|
||||||
|
# Makefile for the linux parisc-specific parts of the boot image creator.
|
||||||
|
#
|
||||||
|
|
||||||
|
COMPILE_VERSION := __linux_compile_version_id__`hostname | \
|
||||||
|
tr -c '[0-9A-Za-z]' '_'`__`date | \
|
||||||
|
tr -c '[0-9A-Za-z]' '_'`_t
|
||||||
|
|
||||||
|
ccflags-y := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I.
|
||||||
|
|
||||||
|
targets := image
|
||||||
|
targets += bzImage
|
||||||
|
subdir- := compressed
|
||||||
|
|
||||||
|
$(obj)/image: vmlinux FORCE
|
||||||
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
$(obj)/bzImage: $(obj)/compressed/vmlinux FORCE
|
||||||
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
$(obj)/compressed/vmlinux: FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
||||||
|
|
||||||
|
install: $(CONFIGURE) $(obj)/bzImage
|
||||||
|
sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
|
||||||
|
System.map "$(INSTALL_PATH)"
|
3
arch/parisc/boot/compressed/.gitignore
vendored
Normal file
3
arch/parisc/boot/compressed/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
sizes.h
|
||||||
|
vmlinux
|
||||||
|
vmlinux.lds
|
86
arch/parisc/boot/compressed/Makefile
Normal file
86
arch/parisc/boot/compressed/Makefile
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#
|
||||||
|
# linux/arch/parisc/boot/compressed/Makefile
|
||||||
|
#
|
||||||
|
# create a compressed self-extracting vmlinux image from the original vmlinux
|
||||||
|
#
|
||||||
|
|
||||||
|
KCOV_INSTRUMENT := n
|
||||||
|
GCOV_PROFILE := n
|
||||||
|
UBSAN_SANITIZE := n
|
||||||
|
|
||||||
|
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2
|
||||||
|
targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4
|
||||||
|
targets += misc.o piggy.o sizes.h head.o real2.o firmware.o
|
||||||
|
|
||||||
|
KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER
|
||||||
|
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||||
|
KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks
|
||||||
|
KBUILD_CFLAGS += -fno-PIE -mno-space-regs -mdisable-fpregs
|
||||||
|
ifndef CONFIG_64BIT
|
||||||
|
KBUILD_CFLAGS += -mfast-indirect-calls
|
||||||
|
endif
|
||||||
|
|
||||||
|
OBJECTS += $(obj)/head.o $(obj)/real2.o $(obj)/firmware.o $(obj)/misc.o $(obj)/piggy.o
|
||||||
|
|
||||||
|
# LDFLAGS_vmlinux := -X --whole-archive -e startup -T
|
||||||
|
LDFLAGS_vmlinux := -X -e startup --as-needed -T
|
||||||
|
$(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS) $(LIBGCC)
|
||||||
|
$(call if_changed,ld)
|
||||||
|
|
||||||
|
sed-sizes := -e 's/^\([0-9a-fA-F]*\) . \(__bss_start\|_end\|parisc_kernel_start\)$$/\#define SZ\2 0x\1/p'
|
||||||
|
|
||||||
|
quiet_cmd_sizes = GEN $@
|
||||||
|
cmd_sizes = $(NM) $< | sed -n $(sed-sizes) > $@
|
||||||
|
|
||||||
|
$(obj)/sizes.h: vmlinux
|
||||||
|
$(call if_changed,sizes)
|
||||||
|
|
||||||
|
AFLAGS_head.o += -I$(objtree)/$(obj) -DBOOTLOADER
|
||||||
|
$(obj)/head.o: $(obj)/sizes.h
|
||||||
|
|
||||||
|
CFLAGS_misc.o += -I$(objtree)/$(obj)
|
||||||
|
$(obj)/misc.o: $(obj)/sizes.h
|
||||||
|
|
||||||
|
$(obj)/firmware.o: $(obj)/firmware.c
|
||||||
|
$(obj)/firmware.c: $(srctree)/arch/$(SRCARCH)/kernel/firmware.c
|
||||||
|
$(call cmd,shipped)
|
||||||
|
|
||||||
|
AFLAGS_real2.o += -DBOOTLOADER
|
||||||
|
$(obj)/real2.o: $(obj)/real2.S
|
||||||
|
$(obj)/real2.S: $(srctree)/arch/$(SRCARCH)/kernel/real2.S
|
||||||
|
$(call cmd,shipped)
|
||||||
|
|
||||||
|
$(obj)/misc.o: $(obj)/sizes.h
|
||||||
|
|
||||||
|
CPPFLAGS_vmlinux.lds += -I$(objtree)/$(obj) -DBOOTLOADER
|
||||||
|
$(obj)/vmlinux.lds: $(obj)/sizes.h
|
||||||
|
|
||||||
|
OBJCOPYFLAGS_vmlinux.bin := -O binary -R .comment -S
|
||||||
|
$(obj)/vmlinux.bin: vmlinux
|
||||||
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
vmlinux.bin.all-y := $(obj)/vmlinux.bin
|
||||||
|
|
||||||
|
suffix-$(CONFIG_KERNEL_GZIP) := gz
|
||||||
|
suffix-$(CONFIG_KERNEL_BZIP2) := bz2
|
||||||
|
suffix-$(CONFIG_KERNEL_LZ4) := lz4
|
||||||
|
suffix-$(CONFIG_KERNEL_LZMA) := lzma
|
||||||
|
suffix-$(CONFIG_KERNEL_LZO) := lzo
|
||||||
|
suffix-$(CONFIG_KERNEL_XZ) := xz
|
||||||
|
|
||||||
|
$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,gzip)
|
||||||
|
$(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,bzip2)
|
||||||
|
$(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,lz4)
|
||||||
|
$(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,lzma)
|
||||||
|
$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,lzo)
|
||||||
|
$(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y)
|
||||||
|
$(call if_changed,xzkern)
|
||||||
|
|
||||||
|
LDFLAGS_piggy.o := -r --format binary --oformat $(LD_BFD) -T
|
||||||
|
$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y)
|
||||||
|
$(call if_changed,ld)
|
85
arch/parisc/boot/compressed/head.S
Normal file
85
arch/parisc/boot/compressed/head.S
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Startup glue code to uncompress the kernel
|
||||||
|
*
|
||||||
|
* (C) 2017 Helge Deller <deller@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/asm-offsets.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <asm/psw.h>
|
||||||
|
#include <asm/pdc.h>
|
||||||
|
#include <asm/assembly.h>
|
||||||
|
#include "sizes.h"
|
||||||
|
|
||||||
|
#define BOOTADDR(x) (x)
|
||||||
|
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
.import $global$ /* forward declaration */
|
||||||
|
#endif /*!CONFIG_64BIT*/
|
||||||
|
|
||||||
|
__HEAD
|
||||||
|
|
||||||
|
ENTRY(startup)
|
||||||
|
.level LEVEL
|
||||||
|
|
||||||
|
#define PSW_W_SM 0x200
|
||||||
|
#define PSW_W_BIT 36
|
||||||
|
|
||||||
|
;! nuke the W bit, saving original value
|
||||||
|
.level 2.0
|
||||||
|
rsm PSW_W_SM, %r1
|
||||||
|
|
||||||
|
.level 1.1
|
||||||
|
extrw,u %r1, PSW_W_BIT-32, 1, %r1
|
||||||
|
copy %r1, %arg0
|
||||||
|
|
||||||
|
/* Make sure sr4-sr7 are set to zero for the kernel address space */
|
||||||
|
mtsp %r0,%sr4
|
||||||
|
mtsp %r0,%sr5
|
||||||
|
mtsp %r0,%sr6
|
||||||
|
mtsp %r0,%sr7
|
||||||
|
|
||||||
|
/* Clear BSS */
|
||||||
|
|
||||||
|
.import _bss,data
|
||||||
|
.import _ebss,data
|
||||||
|
|
||||||
|
load32 BOOTADDR(_bss),%r3
|
||||||
|
load32 BOOTADDR(_ebss),%r4
|
||||||
|
ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */
|
||||||
|
$bss_loop:
|
||||||
|
cmpb,<<,n %r3,%r4,$bss_loop
|
||||||
|
stw,ma %r0,4(%r3)
|
||||||
|
|
||||||
|
/* Initialize the global data pointer */
|
||||||
|
loadgp
|
||||||
|
|
||||||
|
/* arg0..arg4 were set by palo. */
|
||||||
|
copy %arg1, %r6 /* command line */
|
||||||
|
copy %arg2, %r7 /* rd-start */
|
||||||
|
copy %arg3, %r8 /* rd-end */
|
||||||
|
load32 BOOTADDR(decompress_kernel),%r3
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
.level LEVEL
|
||||||
|
ssm PSW_W_SM, %r0 /* set W-bit */
|
||||||
|
depdi 0, 31, 32, %r3
|
||||||
|
#endif
|
||||||
|
load32 BOOTADDR(startup_continue), %r2
|
||||||
|
bv,n 0(%r3)
|
||||||
|
|
||||||
|
startup_continue:
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
.level LEVEL
|
||||||
|
rsm PSW_W_SM, %r0 /* clear W-bit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
|
||||||
|
copy %r6, %arg1 /* command line */
|
||||||
|
copy %r7, %arg2 /* rd-start */
|
||||||
|
copy %r8, %arg3 /* rd-end */
|
||||||
|
|
||||||
|
bv,n 0(%ret0)
|
||||||
|
END(startup)
|
301
arch/parisc/boot/compressed/misc.c
Normal file
301
arch/parisc/boot/compressed/misc.c
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
/*
|
||||||
|
* Definitions and wrapper functions for kernel decompressor
|
||||||
|
*
|
||||||
|
* (C) 2017 Helge Deller <deller@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/uaccess.h>
|
||||||
|
#include <asm/unaligned.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include "sizes.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* gzip declarations
|
||||||
|
*/
|
||||||
|
#define STATIC static
|
||||||
|
|
||||||
|
#undef memmove
|
||||||
|
#define memmove memmove
|
||||||
|
#define memzero(s, n) memset((s), 0, (n))
|
||||||
|
|
||||||
|
#define malloc malloc_gzip
|
||||||
|
#define free free_gzip
|
||||||
|
|
||||||
|
/* Symbols defined by linker scripts */
|
||||||
|
extern char input_data[];
|
||||||
|
extern int input_len;
|
||||||
|
extern __le32 output_len; /* at unaligned address, little-endian */
|
||||||
|
extern char _text, _end;
|
||||||
|
extern char _bss, _ebss;
|
||||||
|
extern char _startcode_end;
|
||||||
|
extern void startup_continue(void *entry, unsigned long cmdline,
|
||||||
|
unsigned long rd_start, unsigned long rd_end) __noreturn;
|
||||||
|
|
||||||
|
void error(char *m) __noreturn;
|
||||||
|
|
||||||
|
static unsigned long free_mem_ptr;
|
||||||
|
static unsigned long free_mem_end_ptr;
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_GZIP
|
||||||
|
#include "../../../../lib/decompress_inflate.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_BZIP2
|
||||||
|
#include "../../../../lib/decompress_bunzip2.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_LZ4
|
||||||
|
#include "../../../../lib/decompress_unlz4.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_LZMA
|
||||||
|
#include "../../../../lib/decompress_unlzma.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_LZO
|
||||||
|
#include "../../../../lib/decompress_unlzo.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KERNEL_XZ
|
||||||
|
#include "../../../../lib/decompress_unxz.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *memmove(void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
const char *s = src;
|
||||||
|
char *d = dest;
|
||||||
|
|
||||||
|
if (d <= s) {
|
||||||
|
while (n--)
|
||||||
|
*d++ = *s++;
|
||||||
|
} else {
|
||||||
|
d += n;
|
||||||
|
s += n;
|
||||||
|
while (n--)
|
||||||
|
*--d = *--s;
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memset(void *s, int c, size_t count)
|
||||||
|
{
|
||||||
|
char *xs = (char *)s;
|
||||||
|
|
||||||
|
while (count--)
|
||||||
|
*xs++ = c;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *memcpy(void *d, const void *s, size_t len)
|
||||||
|
{
|
||||||
|
char *dest = (char *)d;
|
||||||
|
const char *source = (const char *)s;
|
||||||
|
|
||||||
|
while (len--)
|
||||||
|
*dest++ = *source++;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strlen(const char *s)
|
||||||
|
{
|
||||||
|
const char *sc;
|
||||||
|
|
||||||
|
for (sc = s; *sc != '\0'; ++sc)
|
||||||
|
;
|
||||||
|
return sc - s;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *strchr(const char *s, int c)
|
||||||
|
{
|
||||||
|
while (*s) {
|
||||||
|
if (*s == (char)c)
|
||||||
|
return (char *)s;
|
||||||
|
++s;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int puts(const char *s)
|
||||||
|
{
|
||||||
|
const char *nuline = s;
|
||||||
|
|
||||||
|
while ((nuline = strchr(s, '\n')) != NULL) {
|
||||||
|
if (nuline != s)
|
||||||
|
pdc_iodc_print(s, nuline - s);
|
||||||
|
pdc_iodc_print("\r\n", 2);
|
||||||
|
s = nuline + 1;
|
||||||
|
}
|
||||||
|
if (*s != '\0')
|
||||||
|
pdc_iodc_print(s, strlen(s));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int putchar(int c)
|
||||||
|
{
|
||||||
|
char buf[2];
|
||||||
|
|
||||||
|
buf[0] = c;
|
||||||
|
buf[1] = '\0';
|
||||||
|
puts(buf);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __noreturn error(char *x)
|
||||||
|
{
|
||||||
|
puts("\n\n");
|
||||||
|
puts(x);
|
||||||
|
puts("\n\n -- System halted");
|
||||||
|
while (1) /* wait forever */
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int print_hex(unsigned long num)
|
||||||
|
{
|
||||||
|
const char hex[] = "0123456789abcdef";
|
||||||
|
char str[40];
|
||||||
|
int i = sizeof(str)-1;
|
||||||
|
|
||||||
|
str[i--] = '\0';
|
||||||
|
do {
|
||||||
|
str[i--] = hex[num & 0x0f];
|
||||||
|
num >>= 4;
|
||||||
|
} while (num);
|
||||||
|
|
||||||
|
str[i--] = 'x';
|
||||||
|
str[i] = '0';
|
||||||
|
puts(&str[i]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int printf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
while (fmt[i]) {
|
||||||
|
if (fmt[i] != '%') {
|
||||||
|
put:
|
||||||
|
putchar(fmt[i++]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fmt[++i] == '%')
|
||||||
|
goto put;
|
||||||
|
++i;
|
||||||
|
print_hex(va_arg(args, unsigned long));
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* helper functions for libgcc */
|
||||||
|
void abort(void)
|
||||||
|
{
|
||||||
|
error("aborted.");
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
void *malloc(size_t size)
|
||||||
|
{
|
||||||
|
return malloc_gzip(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef free
|
||||||
|
void free(void *ptr)
|
||||||
|
{
|
||||||
|
return free_gzip(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void flush_data_cache(char *start, unsigned long length)
|
||||||
|
{
|
||||||
|
char *end = start + length;
|
||||||
|
|
||||||
|
do {
|
||||||
|
asm volatile("fdc 0(%0)" : : "r" (start));
|
||||||
|
asm volatile("fic 0(%%sr0,%0)" : : "r" (start));
|
||||||
|
start += 16;
|
||||||
|
} while (start < end);
|
||||||
|
asm volatile("fdc 0(%0)" : : "r" (end));
|
||||||
|
|
||||||
|
asm ("sync");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long decompress_kernel(unsigned int started_wide,
|
||||||
|
unsigned int command_line,
|
||||||
|
const unsigned int rd_start,
|
||||||
|
const unsigned int rd_end)
|
||||||
|
{
|
||||||
|
char *output;
|
||||||
|
unsigned long len, len_all;
|
||||||
|
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
parisc_narrow_firmware = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
set_firmware_width_unlocked();
|
||||||
|
|
||||||
|
putchar('U'); /* if you get this p and no more, string storage */
|
||||||
|
/* in $GLOBAL$ is wrong or %dp is wrong */
|
||||||
|
puts("ncompressing ...\n");
|
||||||
|
|
||||||
|
output = (char *) KERNEL_BINARY_TEXT_START;
|
||||||
|
len_all = __pa(SZ_end) - __pa(SZparisc_kernel_start);
|
||||||
|
|
||||||
|
if ((unsigned long) &_startcode_end > (unsigned long) output)
|
||||||
|
error("Bootcode overlaps kernel code");
|
||||||
|
|
||||||
|
len = get_unaligned_le32(&output_len);
|
||||||
|
if (len > len_all)
|
||||||
|
error("Output len too big.");
|
||||||
|
else
|
||||||
|
memset(&output[len], 0, len_all - len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize free_mem_ptr and free_mem_end_ptr.
|
||||||
|
*/
|
||||||
|
free_mem_ptr = (unsigned long) &_ebss;
|
||||||
|
free_mem_ptr += 2*1024*1024; /* leave 2 MB for stack */
|
||||||
|
|
||||||
|
/* Limit memory for bootoader to 1GB */
|
||||||
|
#define ARTIFICIAL_LIMIT (1*1024*1024*1024)
|
||||||
|
free_mem_end_ptr = PAGE0->imm_max_mem;
|
||||||
|
if (free_mem_end_ptr > ARTIFICIAL_LIMIT)
|
||||||
|
free_mem_end_ptr = ARTIFICIAL_LIMIT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
|
/* if we have ramdisk this is at end of memory */
|
||||||
|
if (rd_start && rd_start < free_mem_end_ptr)
|
||||||
|
free_mem_end_ptr = rd_start;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("startcode_end = %x\n", &_startcode_end);
|
||||||
|
printf("commandline = %x\n", command_line);
|
||||||
|
printf("rd_start = %x\n", rd_start);
|
||||||
|
printf("rd_end = %x\n", rd_end);
|
||||||
|
|
||||||
|
printf("free_ptr = %x\n", free_mem_ptr);
|
||||||
|
printf("free_ptr_end = %x\n", free_mem_end_ptr);
|
||||||
|
|
||||||
|
printf("input_data = %x\n", input_data);
|
||||||
|
printf("input_len = %x\n", input_len);
|
||||||
|
printf("output = %x\n", output);
|
||||||
|
printf("output_len = %x\n", len);
|
||||||
|
printf("output_max = %x\n", len_all);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__decompress(input_data, input_len, NULL, NULL,
|
||||||
|
output, 0, NULL, error);
|
||||||
|
|
||||||
|
flush_data_cache(output, len);
|
||||||
|
|
||||||
|
printf("Booting kernel ...\n\n");
|
||||||
|
|
||||||
|
return (unsigned long) output;
|
||||||
|
}
|
101
arch/parisc/boot/compressed/vmlinux.lds.S
Normal file
101
arch/parisc/boot/compressed/vmlinux.lds.S
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include "sizes.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
OUTPUT_FORMAT("elf32-hppa-linux")
|
||||||
|
OUTPUT_ARCH(hppa)
|
||||||
|
#else
|
||||||
|
OUTPUT_FORMAT("elf64-hppa-linux")
|
||||||
|
OUTPUT_ARCH(hppa:hppa2.0w)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ENTRY(startup)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* palo loads at 0x60000 */
|
||||||
|
/* loaded kernel will move to 0x10000 */
|
||||||
|
. = 0xe0000; /* should not overwrite palo code */
|
||||||
|
|
||||||
|
.head.text : {
|
||||||
|
_head = . ;
|
||||||
|
HEAD_TEXT
|
||||||
|
_ehead = . ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* keep __gp below 0x1000000 */
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
. = ALIGN(16);
|
||||||
|
/* Linkage tables */
|
||||||
|
.opd : {
|
||||||
|
*(.opd)
|
||||||
|
} PROVIDE (__gp = .);
|
||||||
|
.plt : {
|
||||||
|
*(.plt)
|
||||||
|
}
|
||||||
|
.dlt : {
|
||||||
|
*(.dlt)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
_startcode_end = .;
|
||||||
|
|
||||||
|
/* bootloader code and data starts behind area of extracted kernel */
|
||||||
|
. = (SZ_end - SZparisc_kernel_start + KERNEL_BINARY_TEXT_START);
|
||||||
|
|
||||||
|
/* align on next page boundary */
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.text : {
|
||||||
|
_text = .; /* Text */
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
_etext = . ;
|
||||||
|
}
|
||||||
|
. = ALIGN(8);
|
||||||
|
.data : {
|
||||||
|
_data = . ;
|
||||||
|
*(.data)
|
||||||
|
*(.data.*)
|
||||||
|
_edata = . ;
|
||||||
|
}
|
||||||
|
. = ALIGN(8);
|
||||||
|
.rodata : {
|
||||||
|
_rodata = . ;
|
||||||
|
*(.rodata) /* read-only data */
|
||||||
|
*(.rodata.*)
|
||||||
|
_erodata = . ;
|
||||||
|
}
|
||||||
|
. = ALIGN(8);
|
||||||
|
.rodata.compressed : {
|
||||||
|
*(.rodata.compressed)
|
||||||
|
}
|
||||||
|
. = ALIGN(8);
|
||||||
|
.bss : {
|
||||||
|
_bss = . ;
|
||||||
|
*(.bss)
|
||||||
|
*(.bss.*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_ebss = .;
|
||||||
|
}
|
||||||
|
|
||||||
|
STABS_DEBUG
|
||||||
|
.note 0 : { *(.note) }
|
||||||
|
|
||||||
|
/* Sections to be discarded */
|
||||||
|
DISCARDS
|
||||||
|
/DISCARD/ : {
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
/* temporary hack until binutils is fixed to not emit these
|
||||||
|
* for static binaries
|
||||||
|
*/
|
||||||
|
*(.PARISC.unwind) /* no unwind data */
|
||||||
|
*(.interp)
|
||||||
|
*(.dynsym)
|
||||||
|
*(.dynstr)
|
||||||
|
*(.dynamic)
|
||||||
|
*(.hash)
|
||||||
|
*(.gnu.hash)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
10
arch/parisc/boot/compressed/vmlinux.scr
Normal file
10
arch/parisc/boot/compressed/vmlinux.scr
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.rodata.compressed : {
|
||||||
|
input_len = .;
|
||||||
|
LONG(input_data_end - input_data) input_data = .;
|
||||||
|
*(.data)
|
||||||
|
output_len = . - 4; /* can be at unaligned address */
|
||||||
|
input_data_end = .;
|
||||||
|
}
|
||||||
|
}
|
65
arch/parisc/boot/install.sh
Normal file
65
arch/parisc/boot/install.sh
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# arch/parisc/install.sh, derived from arch/i386/boot/install.sh
|
||||||
|
#
|
||||||
|
# This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
# License. See the file "COPYING" in the main directory of this archive
|
||||||
|
# for more details.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1995 by Linus Torvalds
|
||||||
|
#
|
||||||
|
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||||
|
#
|
||||||
|
# "make install" script for i386 architecture
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# $1 - kernel version
|
||||||
|
# $2 - kernel image file
|
||||||
|
# $3 - kernel map file
|
||||||
|
# $4 - default install path (blank if root directory)
|
||||||
|
#
|
||||||
|
|
||||||
|
verify () {
|
||||||
|
if [ ! -f "$1" ]; then
|
||||||
|
echo "" 1>&2
|
||||||
|
echo " *** Missing file: $1" 1>&2
|
||||||
|
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||||
|
echo "" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Make sure the files actually exist
|
||||||
|
|
||||||
|
verify "$2"
|
||||||
|
verify "$3"
|
||||||
|
|
||||||
|
# User may have a custom install script
|
||||||
|
|
||||||
|
if [ -n "${INSTALLKERNEL}" ]; then
|
||||||
|
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||||
|
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Default install
|
||||||
|
|
||||||
|
if [ "$(basename $2)" = "zImage" ]; then
|
||||||
|
# Compressed install
|
||||||
|
echo "Installing compressed kernel"
|
||||||
|
base=vmlinuz
|
||||||
|
else
|
||||||
|
# Normal install
|
||||||
|
echo "Installing normal kernel"
|
||||||
|
base=vmlinux
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $4/$base-$1 ]; then
|
||||||
|
mv $4/$base-$1 $4/$base-$1.old
|
||||||
|
fi
|
||||||
|
cat $2 > $4/$base-$1
|
||||||
|
|
||||||
|
# Install system map file
|
||||||
|
if [ -f $4/System.map-$1 ]; then
|
||||||
|
mv $4/System.map-$1 $4/System.map-$1.old
|
||||||
|
fi
|
||||||
|
cp $3 $4/System.map-$1
|
Loading…
Reference in New Issue
Block a user