diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2019-07-17 19:23:31 +0200 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2019-08-17 16:57:32 +0200 |
commit | a608380e421e601622e524e35f79b5c964781c64 (patch) | |
tree | e27321503cf8bba9043266b027ac9eb2970f339f | |
parent | 860d6ce0ce19b96506597bd7befadda86f15b489 (diff) | |
download | upstream-a608380e421e601622e524e35f79b5c964781c64.tar.gz upstream-a608380e421e601622e524e35f79b5c964781c64.tar.bz2 upstream-a608380e421e601622e524e35f79b5c964781c64.zip |
gemini: Add copy-kernel utility package
This package just contains a small Gemini-only assembler
bootstrap loop to copy the kernel from the two fragments
(previously zImage at 0x01600000 and initramdisk at 0x00800000)
into one big zImage of up to 8 MB at 0x00400000.
It will be built on demand from the Gemini image Makefile.
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | target/linux/gemini/image/copy-kernel/.gitignore | 1 | ||||
-rw-r--r-- | target/linux/gemini/image/copy-kernel/Makefile | 32 | ||||
-rw-r--r-- | target/linux/gemini/image/copy-kernel/copy-kernel.S | 45 |
3 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/gemini/image/copy-kernel/.gitignore b/target/linux/gemini/image/copy-kernel/.gitignore new file mode 100644 index 0000000000..e5939dfd9c --- /dev/null +++ b/target/linux/gemini/image/copy-kernel/.gitignore @@ -0,0 +1 @@ +copy-kernel.bin diff --git a/target/linux/gemini/image/copy-kernel/Makefile b/target/linux/gemini/image/copy-kernel/Makefile new file mode 100644 index 0000000000..155c35968c --- /dev/null +++ b/target/linux/gemini/image/copy-kernel/Makefile @@ -0,0 +1,32 @@ +# +# Makefile for Gemin kernel copy stub +# +# Copyright (C) 2019 Linus Walleij <linus.walleij@linaro.org> +# +# 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. +# + +AS := $(CROSS_COMPILE)as +OBJCOPY := $(CROSS_COMPILE)objcopy + +BIN_FLAGS := -O binary -S + +all: copy-kernel.bin + +# Don't build dependencies, this may die if $(CC) isn't gcc +dep: + +install: + +%.o : %.S + $(AS) $(ASFLAGS) -k -o $@ $< + +%.bin: %.o + $(OBJCOPY) $(BIN_FLAGS) $< $@ + +mrproper: clean + +clean: + rm -f copy-kernel.bin copy-kernel.o diff --git a/target/linux/gemini/image/copy-kernel/copy-kernel.S b/target/linux/gemini/image/copy-kernel/copy-kernel.S new file mode 100644 index 0000000000..a287e40def --- /dev/null +++ b/target/linux/gemini/image/copy-kernel/copy-kernel.S @@ -0,0 +1,45 @@ + // Arm assembly to copy the Gemini kernel on Storlink reference + // designs and derived devices with the same flash layout and + // boot loader. + // + // This will execute at 0x01600000 + // + // Copies the kernel from two fragments (originally zImage + // and initramdisk) to 0x00400000 making space for a kernel + // image of up to 8 MB except for these 512 bytes used for + // this bootstrap. + // + // 0x01600200 .. 0x017fffff -> 0x00400000 .. 0x005ffdff + // 0x00800000 .. 0x00dfffff -> 0x005ffe00 .. 0x00bffdff + + // Memory used for this bootstrap + .equ BOOT_HEADROOM, 0x200 + + .global _start // Stand-alone assembly code +_start: + mov r1, #0x01600000 + mov r2, #0x00400000 + mov r3, #0x00200000 + add r1, r1, #BOOT_HEADROOM + sub r3, r3, #BOOT_HEADROOM +copyloop1: + ldr r0, [r1] + str r0, [r2] + add r1, r1, #4 + add r2, r2, #4 + sub r3, r3, #4 + cmp r3, #0 + bne copyloop1 + mov r1, #0x00800000 + mov r3, #0x00600000 +copyloop2: + ldr r0, [r1] + str r0, [r2] + add r1, r1, #4 + add r2, r2, #4 + sub r3, r3, #4 + cmp r3, #0 + bne copyloop2 + mov r0, #0x00400000 + // Let's go + mov pc, r0 |