forked from mirrors/linux
		
	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
					
				
					 9 changed files with 679 additions and 0 deletions
				
			
		
							
								
								
									
										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 a new issue