From a608380e421e601622e524e35f79b5c964781c64 Mon Sep 17 00:00:00 2001 From: Linus Walleij Date: Wed, 17 Jul 2019 19:23:31 +0200 Subject: [PATCH] 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 --- .../linux/gemini/image/copy-kernel/.gitignore | 1 + .../linux/gemini/image/copy-kernel/Makefile | 32 +++++++++++++ .../gemini/image/copy-kernel/copy-kernel.S | 45 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 target/linux/gemini/image/copy-kernel/.gitignore create mode 100644 target/linux/gemini/image/copy-kernel/Makefile create mode 100644 target/linux/gemini/image/copy-kernel/copy-kernel.S 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 +# +# 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