mirror of
https://github.com/linux-sunxi/sunxi-tools.git
synced 2024-11-23 01:46:44 +08:00
fel-sdboot: Fix header corruption workaround, implement in assembly
Now that we have a better understanding of what's causing the issue that prevented entering FEL sometimes, we can adjust the workaround code to a proper solution, i.e. skip over the problematic location. Since the code amounts to less than a dozen ARM instructions, I've decided to rewrite it as assembly code - fel-sdboot.S replaces the former fel-sdboot.c. The commit also includes a new binary (bin/fel-sdboot.sunxi) with these changes. Signed-off-by: Bernhard Nortmann <bernhard.nortmann@web.de> Reviewed-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
This commit is contained in:
parent
ce9cf33606
commit
17164d8d9a
2
Makefile
2
Makefile
@ -135,7 +135,7 @@ fel-pio.nm: fel-pio.elf
|
||||
jtag-loop.elf: jtag-loop.c jtag-loop.lds
|
||||
$(CROSS_COMPILE)gcc -g $(ARM_ELF_FLAGS) $< -nostdlib -o $@ -T jtag-loop.lds -Wl,-N
|
||||
|
||||
fel-sdboot.elf: fel-sdboot.c fel-sdboot.lds
|
||||
fel-sdboot.elf: fel-sdboot.S fel-sdboot.lds
|
||||
$(CROSS_COMPILE)gcc -g $(ARM_ELF_FLAGS) $< -nostdlib -o $@ -T fel-sdboot.lds -Wl,-N
|
||||
|
||||
boot_head_sun3i.elf: boot_head.S boot_head.lds
|
||||
|
Binary file not shown.
69
fel-sdboot.S
Normal file
69
fel-sdboot.S
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Bernhard Nortmann <bernhard.nortmann@web.de>
|
||||
*
|
||||
* Based on previous works
|
||||
* Copyright (C) 2016 Siarhei Siamashka <siarhei.siamashka@gmail.com>
|
||||
* Copyright (C) 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is a utility stub (bootloader code) to force the device into
|
||||
* FEL mode, by jumping directly to the corresponding (N-)BROM entry point.
|
||||
*
|
||||
* Build instructions:
|
||||
* make fel-sdboot.sunxi
|
||||
*
|
||||
* If needed, adjust CROSS_COMPILE and MKSUNXIBOOT according to your
|
||||
* toolchain, e.g.
|
||||
* make fel-sdboot.sunxi CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- \
|
||||
* MKSUNXIBOOT=/usr/local/bin/mksunxiboot
|
||||
*
|
||||
*
|
||||
* Install instructions:
|
||||
* dd if=fel-sdboot.sunxi of=/dev/sdX bs=1024 seek=8
|
||||
*/
|
||||
|
||||
SCTRL .req r0
|
||||
.equ V_BIT, (1 << 13)
|
||||
|
||||
.equ BROM_ENTRY_LOW, 0x00000020
|
||||
.equ BROM_ENTRY_HIGH, 0xFFFF0020
|
||||
|
||||
/*
|
||||
* In cases where insufficient padding is added by an old mksunxiboot,
|
||||
* _start may be 0x20, which means that the instruction at 0x28 could get
|
||||
* corrupted by the BROM - see https://patchwork.ozlabs.org/patch/622173/
|
||||
*
|
||||
* Apply a workaround to avoid (= skip over) that memory location.
|
||||
* _main would be at 0x30 in that particular case. With newer (properly
|
||||
* fixed) versions of mksunxiboot, this code ends up at higher addresses
|
||||
* and will be moot, but harmless.
|
||||
*/
|
||||
_start:
|
||||
b _main
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
_main:
|
||||
mrc p15, 0, SCTRL, c1, c0, 0
|
||||
tst SCTRL, #V_BIT @ test SCTRL.V
|
||||
moveq lr, #BROM_ENTRY_LOW
|
||||
ldrne lr, =BROM_ENTRY_HIGH
|
||||
bx lr
|
59
fel-sdboot.c
59
fel-sdboot.c
@ -1,59 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2011 Henrik Nordstrom <henrik@henriknordstrom.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Build instructions:
|
||||
|
||||
arm-none-linux-gnueabi-gcc -g -Os -fno-common -ffixed-r8 -msoft-float -fno-builtin -ffreestanding -nostdinc -mno-thumb-interwork -Wall -Wstrict-prototypes -fno-stack-protector -Wno-format-nonliteral -Wno-format-security -fno-toplevel-reorder fel-boot.c -c
|
||||
|
||||
arm-none-linux-gnueabi-objcopy -O binary fel-boot.o fel-boot.bin
|
||||
|
||||
mksunxiboot fel-boot.bin fel-boot.sunxi
|
||||
|
||||
Install instructions:
|
||||
|
||||
dd if=fel-boot.sunxi of=/dev/sdX bs=1024 seek=8
|
||||
|
||||
*/
|
||||
|
||||
|
||||
void _start(void)
|
||||
{
|
||||
unsigned int sctlr;
|
||||
|
||||
/*
|
||||
* FEL mode fails to activate in an unpredictable way without
|
||||
* this NOP padding. Minor changes in the code, such as checking
|
||||
* the PC register (PC >= 0x10000) instead of SCTLR.V or doing
|
||||
* jump instead of call to the FEL handler in the BROM sometimes
|
||||
* break on A64 and sometimes break on A10/A13/A20. Trying to
|
||||
* add DSB & ISB instructions and/or invalidating caches and
|
||||
* BTB do not seem to make any difference. Only adding a bunch
|
||||
* of NOP instructions in the beginning helps.
|
||||
*/
|
||||
asm volatile(".rept 32 \n nop \n .endr");
|
||||
|
||||
asm volatile("mrc p15, 0, %0, c1, c0, 0" : "=r" (sctlr));
|
||||
|
||||
if (sctlr & (1 << 13)) /* SCTLR.V */
|
||||
((void (*)(void))0xffff0020)();
|
||||
else
|
||||
((void (*)(void))0x00000020)();
|
||||
}
|
Loading…
Reference in New Issue
Block a user