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>
This commit is contained in:
Linus Walleij 2019-07-17 19:23:31 +02:00 committed by Hauke Mehrtens
parent 860d6ce0ce
commit a608380e42
3 changed files with 78 additions and 0 deletions

View File

@ -0,0 +1 @@
copy-kernel.bin

View File

@ -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

View File

@ -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