diff options
Diffstat (limited to 'kernel/arch/avr32/boot')
-rw-r--r-- | kernel/arch/avr32/boot/images/.gitignore | 4 | ||||
-rw-r--r-- | kernel/arch/avr32/boot/images/Makefile | 57 | ||||
-rw-r--r-- | kernel/arch/avr32/boot/u-boot/Makefile | 3 | ||||
-rw-r--r-- | kernel/arch/avr32/boot/u-boot/empty.S | 1 | ||||
-rw-r--r-- | kernel/arch/avr32/boot/u-boot/head.S | 83 |
5 files changed, 148 insertions, 0 deletions
diff --git a/kernel/arch/avr32/boot/images/.gitignore b/kernel/arch/avr32/boot/images/.gitignore new file mode 100644 index 000000000..64ea9d014 --- /dev/null +++ b/kernel/arch/avr32/boot/images/.gitignore @@ -0,0 +1,4 @@ +uImage +uImage.srec +vmlinux.cso +sfdwarf.log diff --git a/kernel/arch/avr32/boot/images/Makefile b/kernel/arch/avr32/boot/images/Makefile new file mode 100644 index 000000000..2a3b53978 --- /dev/null +++ b/kernel/arch/avr32/boot/images/Makefile @@ -0,0 +1,57 @@ +# +# Copyright (C) 2004-2006 Atmel Corporation +# +# 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. +# + +extra-y := vmlinux.bin vmlinux.gz + +OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note.gnu.build-id +$(obj)/vmlinux.bin: vmlinux FORCE + $(call if_changed,objcopy) + +$(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE + $(call if_changed,gzip) + +UIMAGE_LOADADDR = $(CONFIG_LOAD_ADDRESS) +UIMAGE_ENTRYADDR = $(CONFIG_ENTRY_ADDRESS) +UIMAGE_COMPRESSION = gzip + +targets += uImage uImage.srec +$(obj)/uImage: $(obj)/vmlinux.gz + $(call if_changed,uimage) + @echo ' Image $@ is ready' + +OBJCOPYFLAGS_uImage.srec := -I binary -O srec +$(obj)/uImage.srec: $(obj)/uImage + $(call if_changed,objcopy) + +OBJCOPYFLAGS_vmlinux.elf := --change-section-lma .text-0x80000000 \ + --change-section-lma __ex_table-0x80000000 \ + --change-section-lma .rodata-0x80000000 \ + --change-section-lma .data-0x80000000 \ + --change-section-lma .init-0x80000000 \ + --change-section-lma .bss-0x80000000 \ + --change-section-lma __param-0x80000000 \ + --change-section-lma __ksymtab-0x80000000 \ + --change-section-lma __ksymtab_gpl-0x80000000 \ + --change-section-lma __kcrctab-0x80000000 \ + --change-section-lma __kcrctab_gpl-0x80000000 \ + --change-section-lma __ksymtab_strings-0x80000000 \ + --set-start 0xa0000000 +$(obj)/vmlinux.elf: vmlinux FORCE + $(call if_changed,objcopy) + +quiet_cmd_sfdwarf = SFDWARF $@ + cmd_sfdwarf = sfdwarf $< TO $@ GNUAVR IW $(SFDWARF_FLAGS) > $(obj)/sfdwarf.log + +$(obj)/vmlinux.cso: $(obj)/vmlinux.elf FORCE + $(call if_changed,sfdwarf) + +install: $(BOOTIMAGE) + sh $(srctree)/install-kernel.sh $< + +# Generated files to be removed upon make clean +clean-files := vmlinux.elf vmlinux.bin vmlinux.gz uImage uImage.srec diff --git a/kernel/arch/avr32/boot/u-boot/Makefile b/kernel/arch/avr32/boot/u-boot/Makefile new file mode 100644 index 000000000..125ddc96c --- /dev/null +++ b/kernel/arch/avr32/boot/u-boot/Makefile @@ -0,0 +1,3 @@ +extra-y := head.o + +obj-y := empty.o diff --git a/kernel/arch/avr32/boot/u-boot/empty.S b/kernel/arch/avr32/boot/u-boot/empty.S new file mode 100644 index 000000000..8ac91a5f1 --- /dev/null +++ b/kernel/arch/avr32/boot/u-boot/empty.S @@ -0,0 +1 @@ +/* Empty file */ diff --git a/kernel/arch/avr32/boot/u-boot/head.S b/kernel/arch/avr32/boot/u-boot/head.S new file mode 100644 index 000000000..2ffc298f0 --- /dev/null +++ b/kernel/arch/avr32/boot/u-boot/head.S @@ -0,0 +1,83 @@ +/* + * Startup code for use with the u-boot bootloader. + * + * Copyright (C) 2004-2006 Atmel Corporation + * + * 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/setup.h> +#include <asm/thread_info.h> +#include <asm/sysreg.h> + + /* + * The kernel is loaded where we want it to be and all caches + * have just been flushed. We get two parameters from u-boot: + * + * r12 contains a magic number (ATAG_MAGIC) + * r11 points to a tag table providing information about + * the system. + */ + .section .init.text,"ax" + .global _start +_start: + /* Initialize .bss */ + lddpc r2, bss_start_addr + lddpc r3, end_addr + mov r0, 0 + mov r1, 0 +1: st.d r2++, r0 + cp r2, r3 + brlo 1b + + /* Initialize status register */ + lddpc r0, init_sr + mtsr SYSREG_SR, r0 + + /* Set initial stack pointer */ + lddpc sp, stack_addr + sub sp, -THREAD_SIZE + +#ifdef CONFIG_FRAME_POINTER + /* Mark last stack frame */ + mov lr, 0 + mov r7, 0 +#endif + + /* Check if the boot loader actually provided a tag table */ + lddpc r0, magic_number + cp.w r12, r0 + brne no_tag_table + + /* + * Save the tag table address for later use. This must be done + * _after_ .bss has been initialized... + */ + lddpc r0, tag_table_addr + st.w r0[0], r11 + + /* Jump to loader-independent setup code */ + rjmp kernel_entry + + .align 2 +magic_number: + .long ATAG_MAGIC +tag_table_addr: + .long bootloader_tags +bss_start_addr: + .long __bss_start +end_addr: + .long _end +init_sr: + .long 0x007f0000 /* Supervisor mode, everything masked */ +stack_addr: + .long init_thread_union +panic_addr: + .long panic + +no_tag_table: + sub r12, pc, (. - 2f) + /* branch to panic() which can be far away with that construct */ + lddpc pc, panic_addr +2: .asciz "Boot loader didn't provide correct magic number\n" |