mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
unicore32 additional architecture files: boot process
This patch implements booting process, including uncompression process. Signed-off-by: Guan Xuetao <gxt@mprc.pku.edu.cn> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
96cf5185a9
commit
70fac51fea
47
arch/unicore32/boot/Makefile
Normal file
47
arch/unicore32/boot/Makefile
Normal file
@ -0,0 +1,47 @@
|
||||
#
|
||||
# arch/unicore32/boot/Makefile
|
||||
#
|
||||
# This file is included by the global makefile so that you can add your own
|
||||
# architecture-specific flags and dependencies.
|
||||
#
|
||||
# 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) 2001~2010 GUAN Xue-tao
|
||||
#
|
||||
|
||||
MKIMAGE := $(srctree)/scripts/mkuboot.sh
|
||||
|
||||
targets := Image zImage uImage
|
||||
|
||||
$(obj)/Image: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
@echo ' Kernel: $@ is ready'
|
||||
|
||||
$(obj)/compressed/vmlinux: $(obj)/Image FORCE
|
||||
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
|
||||
|
||||
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
@echo ' Kernel: $@ is ready'
|
||||
|
||||
quiet_cmd_uimage = UIMAGE $@
|
||||
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A unicore -O linux -T kernel \
|
||||
-C none -a $(LOADADDR) -e $(STARTADDR) \
|
||||
-n 'Linux-$(KERNELRELEASE)' -d $< $@
|
||||
|
||||
$(obj)/uImage: LOADADDR=0x0
|
||||
|
||||
$(obj)/uImage: STARTADDR=$(LOADADDR)
|
||||
|
||||
$(obj)/uImage: $(obj)/zImage FORCE
|
||||
$(call if_changed,uimage)
|
||||
@echo ' Image $@ is ready'
|
||||
|
||||
PHONY += initrd FORCE
|
||||
initrd:
|
||||
@test "$(INITRD)" != "" || \
|
||||
(echo You must specify INITRD; exit -1)
|
||||
|
||||
subdir- := compressed
|
68
arch/unicore32/boot/compressed/Makefile
Normal file
68
arch/unicore32/boot/compressed/Makefile
Normal file
@ -0,0 +1,68 @@
|
||||
#
|
||||
# linux/arch/unicore32/boot/compressed/Makefile
|
||||
#
|
||||
# create a compressed vmlinuz image from the original vmlinux
|
||||
#
|
||||
# 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) 2001~2010 GUAN Xue-tao
|
||||
#
|
||||
|
||||
EXTRA_CFLAGS := -fpic -fno-builtin
|
||||
EXTRA_AFLAGS := -Wa,-march=all
|
||||
|
||||
OBJS := misc.o
|
||||
|
||||
# font.c and font.o
|
||||
CFLAGS_font.o := -Dstatic=
|
||||
$(obj)/font.c: $(srctree)/drivers/video/console/font_8x8.c
|
||||
$(call cmd,shipped)
|
||||
|
||||
# piggy.S and piggy.o
|
||||
suffix_$(CONFIG_KERNEL_GZIP) := gzip
|
||||
suffix_$(CONFIG_KERNEL_BZIP2) := bz2
|
||||
suffix_$(CONFIG_KERNEL_LZO) := lzo
|
||||
suffix_$(CONFIG_KERNEL_LZMA) := lzma
|
||||
|
||||
$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
|
||||
$(call if_changed,$(suffix_y))
|
||||
|
||||
SEDFLAGS_piggy = s/DECOMP_SUFFIX/$(suffix_y)/
|
||||
$(obj)/piggy.S: $(obj)/piggy.S.in
|
||||
@sed "$(SEDFLAGS_piggy)" < $< > $@
|
||||
|
||||
$(obj)/piggy.o: $(obj)/piggy.$(suffix_y) $(obj)/piggy.S FORCE
|
||||
|
||||
targets := vmlinux vmlinux.lds font.o font.c head.o misc.o \
|
||||
piggy.$(suffix_y) piggy.o piggy.S \
|
||||
|
||||
# Make sure files are removed during clean
|
||||
extra-y += piggy.gzip piggy.bz2 piggy.lzo piggy.lzma
|
||||
|
||||
# ?
|
||||
LDFLAGS_vmlinux += -p
|
||||
# Report unresolved symbol references
|
||||
LDFLAGS_vmlinux += --no-undefined
|
||||
# Delete all temporary local symbols
|
||||
LDFLAGS_vmlinux += -X
|
||||
# Next argument is a linker script
|
||||
LDFLAGS_vmlinux += -T
|
||||
|
||||
# For uidivmod
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/head.o $(obj)/piggy.o \
|
||||
$(obj)/misc.o FORCE
|
||||
$(call if_changed,ld)
|
||||
@:
|
||||
|
||||
# We now have a PIC decompressor implementation. Decompressors running
|
||||
# from RAM should not define ZTEXTADDR. Decompressors running directly
|
||||
# from ROM or Flash must define ZTEXTADDR (preferably via the config)
|
||||
ZTEXTADDR := 0
|
||||
ZBSSADDR := ALIGN(4)
|
||||
|
||||
SEDFLAGS_lds = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
||||
$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/unicore32/boot/Makefile $(KCONFIG_CONFIG)
|
||||
@sed "$(SEDFLAGS_lds)" < $< > $@
|
||||
|
204
arch/unicore32/boot/compressed/head.S
Normal file
204
arch/unicore32/boot/compressed/head.S
Normal file
@ -0,0 +1,204 @@
|
||||
/*
|
||||
* linux/arch/unicore32/boot/compressed/head.S
|
||||
*
|
||||
* Code specific to PKUnity SoC and UniCore ISA
|
||||
*
|
||||
* Copyright (C) 2001-2010 GUAN Xue-tao
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <mach/memory.h>
|
||||
|
||||
#define csub cmpsub
|
||||
#define cand cmpand
|
||||
#define nop8 nop; nop; nop; nop; nop; nop; nop; nop
|
||||
|
||||
.section ".start", #alloc, #execinstr
|
||||
.text
|
||||
start:
|
||||
.type start,#function
|
||||
|
||||
/* Initialize ASR, PRIV mode and INTR off */
|
||||
mov r0, #0xD3
|
||||
mov.a asr, r0
|
||||
|
||||
adr r0, LC0
|
||||
ldm (r1, r2, r3, r5, r6, r7, r8), [r0]+
|
||||
ldw sp, [r0+], #28
|
||||
sub.a r0, r0, r1 @ calculate the delta offset
|
||||
|
||||
/*
|
||||
* if delta is zero, we are running at the address
|
||||
* we were linked at.
|
||||
*/
|
||||
beq not_relocated
|
||||
|
||||
/*
|
||||
* We're running at a different address. We need to fix
|
||||
* up various pointers:
|
||||
* r5 - zImage base address (_start)
|
||||
* r7 - GOT start
|
||||
* r8 - GOT end
|
||||
*/
|
||||
add r5, r5, r0
|
||||
add r7, r7, r0
|
||||
add r8, r8, r0
|
||||
|
||||
/*
|
||||
* we need to fix up pointers into the BSS region.
|
||||
* r2 - BSS start
|
||||
* r3 - BSS end
|
||||
* sp - stack pointer
|
||||
*/
|
||||
add r2, r2, r0
|
||||
add r3, r3, r0
|
||||
add sp, sp, r0
|
||||
|
||||
/*
|
||||
* Relocate all entries in the GOT table.
|
||||
* This fixes up the C references.
|
||||
* r7 - GOT start
|
||||
* r8 - GOT end
|
||||
*/
|
||||
1001: ldw r1, [r7+], #0
|
||||
add r1, r1, r0
|
||||
stw.w r1, [r7]+, #4
|
||||
csub.a r7, r8
|
||||
bub 1001b
|
||||
|
||||
not_relocated:
|
||||
/*
|
||||
* Clear BSS region.
|
||||
* r2 - BSS start
|
||||
* r3 - BSS end
|
||||
*/
|
||||
mov r0, #0
|
||||
1002: stw.w r0, [r2]+, #4
|
||||
csub.a r2, r3
|
||||
bub 1002b
|
||||
|
||||
/*
|
||||
* Turn on the cache.
|
||||
*/
|
||||
mov r0, #0
|
||||
movc p0.c5, r0, #28 @ cache invalidate all
|
||||
nop8
|
||||
movc p0.c6, r0, #6 @ tlb invalidate all
|
||||
nop8
|
||||
|
||||
mov r0, #0x1c @ en icache and wb dcache
|
||||
movc p0.c1, r0, #0
|
||||
nop8
|
||||
|
||||
/*
|
||||
* Set up some pointers, for starting decompressing.
|
||||
*/
|
||||
|
||||
mov r1, sp @ malloc space above stack
|
||||
add r2, sp, #0x10000 @ 64k max
|
||||
|
||||
/*
|
||||
* Check to see if we will overwrite ourselves.
|
||||
* r4 = final kernel address
|
||||
* r5 = start of this image
|
||||
* r6 = size of decompressed image
|
||||
* r2 = end of malloc space (and therefore this image)
|
||||
* We basically want:
|
||||
* r4 >= r2 -> OK
|
||||
* r4 + image length <= r5 -> OK
|
||||
*/
|
||||
ldw r4, =KERNEL_IMAGE_START
|
||||
csub.a r4, r2
|
||||
bea wont_overwrite
|
||||
add r0, r4, r6
|
||||
csub.a r0, r5
|
||||
beb wont_overwrite
|
||||
|
||||
/*
|
||||
* If overwrite, just print error message
|
||||
*/
|
||||
b __error_overwrite
|
||||
|
||||
/*
|
||||
* We're not in danger of overwriting ourselves.
|
||||
* Do this the simple way.
|
||||
*/
|
||||
wont_overwrite:
|
||||
/*
|
||||
* decompress_kernel:
|
||||
* r0: output_start
|
||||
* r1: free_mem_ptr_p
|
||||
* r2: free_mem_ptr_end_p
|
||||
*/
|
||||
mov r0, r4
|
||||
b.l decompress_kernel @ C functions
|
||||
|
||||
/*
|
||||
* Clean and flush the cache to maintain consistency.
|
||||
*/
|
||||
mov r0, #0
|
||||
movc p0.c5, r0, #14 @ flush dcache
|
||||
nop8
|
||||
movc p0.c5, r0, #20 @ icache invalidate all
|
||||
nop8
|
||||
|
||||
/*
|
||||
* Turn off the Cache and MMU.
|
||||
*/
|
||||
mov r0, #0 @ disable i/d cache and MMU
|
||||
movc p0.c1, r0, #0
|
||||
nop8
|
||||
|
||||
mov r0, #0 @ must be zero
|
||||
ldw r4, =KERNEL_IMAGE_START
|
||||
mov pc, r4 @ call kernel
|
||||
|
||||
|
||||
.align 2
|
||||
.type LC0, #object
|
||||
LC0: .word LC0 @ r1
|
||||
.word __bss_start @ r2
|
||||
.word _end @ r3
|
||||
.word _start @ r5
|
||||
.word _image_size @ r6
|
||||
.word _got_start @ r7
|
||||
.word _got_end @ r8
|
||||
.word decompress_stack_end @ sp
|
||||
.size LC0, . - LC0
|
||||
|
||||
print_string:
|
||||
#ifdef CONFIG_DEBUG_OCD
|
||||
2001: ldb.w r1, [r0]+, #1
|
||||
csub.a r1, #0
|
||||
bne 2002f
|
||||
mov pc, lr
|
||||
2002:
|
||||
movc r2, p1.c0, #0
|
||||
cand.a r2, #2
|
||||
bne 2002b
|
||||
movc p1.c1, r1, #1
|
||||
csub.a r1, #'\n'
|
||||
cmoveq r1, #'\r'
|
||||
beq 2002b
|
||||
b 2001b
|
||||
#else
|
||||
mov pc, lr
|
||||
#endif
|
||||
|
||||
__error_overwrite:
|
||||
adr r0, str_error
|
||||
b.l print_string
|
||||
2001: nop8
|
||||
b 2001b
|
||||
str_error: .asciz "\nError: Kernel address OVERWRITE\n"
|
||||
.align
|
||||
|
||||
.ltorg
|
||||
|
||||
.align 4
|
||||
.section ".stack", "aw", %nobits
|
||||
decompress_stack: .space 4096
|
||||
decompress_stack_end:
|
126
arch/unicore32/boot/compressed/misc.c
Normal file
126
arch/unicore32/boot/compressed/misc.c
Normal file
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* linux/arch/unicore32/boot/compressed/misc.c
|
||||
*
|
||||
* Code specific to PKUnity SoC and UniCore ISA
|
||||
*
|
||||
* Copyright (C) 2001-2010 GUAN Xue-tao
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <mach/uncompress.h>
|
||||
|
||||
/*
|
||||
* gzip delarations
|
||||
*/
|
||||
unsigned char *output_data;
|
||||
unsigned long output_ptr;
|
||||
|
||||
unsigned int free_mem_ptr;
|
||||
unsigned int free_mem_end_ptr;
|
||||
|
||||
#define STATIC static
|
||||
#define STATIC_RW_DATA /* non-static please */
|
||||
|
||||
/*
|
||||
* arch-dependent implementations
|
||||
*/
|
||||
#ifndef ARCH_HAVE_DECOMP_ERROR
|
||||
#define arch_decomp_error(x)
|
||||
#endif
|
||||
|
||||
#ifndef ARCH_HAVE_DECOMP_SETUP
|
||||
#define arch_decomp_setup()
|
||||
#endif
|
||||
|
||||
#ifndef ARCH_HAVE_DECOMP_PUTS
|
||||
#define arch_decomp_puts(p)
|
||||
#endif
|
||||
|
||||
void *memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
int i = 0;
|
||||
unsigned char *d = (unsigned char *)dest, *s = (unsigned char *)src;
|
||||
|
||||
for (i = n >> 3; i > 0; i--) {
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
}
|
||||
|
||||
if (n & 1 << 2) {
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
}
|
||||
|
||||
if (n & 1 << 1) {
|
||||
*d++ = *s++;
|
||||
*d++ = *s++;
|
||||
}
|
||||
|
||||
if (n & 1)
|
||||
*d++ = *s++;
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
void error(char *x)
|
||||
{
|
||||
arch_decomp_puts("\n\n");
|
||||
arch_decomp_puts(x);
|
||||
arch_decomp_puts("\n\n -- System halted");
|
||||
|
||||
arch_decomp_error(x);
|
||||
|
||||
for (;;)
|
||||
; /* Halt */
|
||||
}
|
||||
|
||||
/* Heap size should be adjusted for different decompress method */
|
||||
#ifdef CONFIG_KERNEL_GZIP
|
||||
#include "../../../../lib/decompress_inflate.c"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KERNEL_BZIP2
|
||||
#include "../../../../lib/decompress_bunzip2.c"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KERNEL_LZO
|
||||
#include "../../../../lib/decompress_unlzo.c"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KERNEL_LZMA
|
||||
#include "../../../../lib/decompress_unlzma.c"
|
||||
#endif
|
||||
|
||||
unsigned long decompress_kernel(unsigned long output_start,
|
||||
unsigned long free_mem_ptr_p,
|
||||
unsigned long free_mem_ptr_end_p)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
|
||||
output_data = (unsigned char *)output_start;
|
||||
free_mem_ptr = free_mem_ptr_p;
|
||||
free_mem_end_ptr = free_mem_ptr_end_p;
|
||||
|
||||
arch_decomp_setup();
|
||||
|
||||
tmp = (unsigned char *) (((unsigned long)input_data_end) - 4);
|
||||
output_ptr = get_unaligned_le32(tmp);
|
||||
|
||||
arch_decomp_puts("Uncompressing Linux...");
|
||||
decompress(input_data, input_data_end - input_data, NULL, NULL,
|
||||
output_data, NULL, error);
|
||||
arch_decomp_puts(" done, booting the kernel.\n");
|
||||
return output_ptr;
|
||||
}
|
6
arch/unicore32/boot/compressed/piggy.S.in
Normal file
6
arch/unicore32/boot/compressed/piggy.S.in
Normal file
@ -0,0 +1,6 @@
|
||||
.section .piggydata,#alloc
|
||||
.globl input_data
|
||||
input_data:
|
||||
.incbin "arch/unicore32/boot/compressed/piggy.DECOMP_SUFFIX"
|
||||
.globl input_data_end
|
||||
input_data_end:
|
61
arch/unicore32/boot/compressed/vmlinux.lds.in
Normal file
61
arch/unicore32/boot/compressed/vmlinux.lds.in
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* linux/arch/unicore/boot/compressed/vmlinux.lds.in
|
||||
*
|
||||
* Code specific to PKUnity SoC and UniCore ISA
|
||||
*
|
||||
* Copyright (C) 2001-2010 GUAN Xue-tao
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
OUTPUT_ARCH(unicore32)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
/DISCARD/ : {
|
||||
/*
|
||||
* Discard any r/w data - this produces a link error if we have any,
|
||||
* which is required for PIC decompression. Local data generates
|
||||
* GOTOFF relocations, which prevents it being relocated independently
|
||||
* of the text/got segments.
|
||||
*/
|
||||
*(.data)
|
||||
}
|
||||
|
||||
. = TEXT_START;
|
||||
_text = .;
|
||||
|
||||
.text : {
|
||||
_start = .;
|
||||
*(.start)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.fixup)
|
||||
*(.gnu.warning)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.piggydata)
|
||||
. = ALIGN(4);
|
||||
}
|
||||
|
||||
_etext = .;
|
||||
|
||||
/* Assume size of decompressed image is 4x the compressed image */
|
||||
_image_size = (_etext - _text) * 4;
|
||||
|
||||
_got_start = .;
|
||||
.got : { *(.got) }
|
||||
_got_end = .;
|
||||
.got.plt : { *(.got.plt) }
|
||||
_edata = .;
|
||||
|
||||
. = BSS_START;
|
||||
__bss_start = .;
|
||||
.bss : { *(.bss) }
|
||||
_end = .;
|
||||
|
||||
.stack : { *(.stack) }
|
||||
.comment 0 : { *(.comment) }
|
||||
}
|
||||
|
34
arch/unicore32/include/mach/uncompress.h
Normal file
34
arch/unicore32/include/mach/uncompress.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* linux/arch/unicore32/include/mach/uncompress.h
|
||||
*
|
||||
* Code specific to PKUnity SoC and UniCore ISA
|
||||
*
|
||||
* Copyright (C) 2001-2010 GUAN Xue-tao
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_PUV3_UNCOMPRESS_H__
|
||||
#define __MACH_PUV3_UNCOMPRESS_H__
|
||||
|
||||
#include "hardware.h"
|
||||
#include "ocd.h"
|
||||
|
||||
extern char input_data[];
|
||||
extern char input_data_end[];
|
||||
|
||||
static void arch_decomp_puts(const char *ptr)
|
||||
{
|
||||
char c;
|
||||
|
||||
while ((c = *ptr++) != '\0') {
|
||||
if (c == '\n')
|
||||
putc('\r');
|
||||
putc(c);
|
||||
}
|
||||
}
|
||||
#define ARCH_HAVE_DECOMP_PUTS
|
||||
|
||||
#endif /* __MACH_PUV3_UNCOMPRESS_H__ */
|
Loading…
Reference in New Issue
Block a user