--- /dev/null
+#
+# 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
--- /dev/null
+ // 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