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:
parent
860d6ce0ce
commit
a608380e42
1
target/linux/gemini/image/copy-kernel/.gitignore
vendored
Normal file
1
target/linux/gemini/image/copy-kernel/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
copy-kernel.bin
|
32
target/linux/gemini/image/copy-kernel/Makefile
Normal file
32
target/linux/gemini/image/copy-kernel/Makefile
Normal 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
|
45
target/linux/gemini/image/copy-kernel/copy-kernel.S
Normal file
45
target/linux/gemini/image/copy-kernel/copy-kernel.S
Normal 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
|
Loading…
Reference in New Issue
Block a user