gemini: Add copy-kernel utility package
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 17 Jul 2019 17:23:31 +0000 (19:23 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 17 Aug 2019 14:57:32 +0000 (16:57 +0200)
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>
target/linux/gemini/image/copy-kernel/.gitignore [new file with mode: 0644]
target/linux/gemini/image/copy-kernel/Makefile [new file with mode: 0644]
target/linux/gemini/image/copy-kernel/copy-kernel.S [new file with mode: 0644]

diff --git a/target/linux/gemini/image/copy-kernel/.gitignore b/target/linux/gemini/image/copy-kernel/.gitignore
new file mode 100644 (file)
index 0000000..e5939df
--- /dev/null
@@ -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 (file)
index 0000000..155c359
--- /dev/null
@@ -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 (file)
index 0000000..a287e40
--- /dev/null
@@ -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