To workaround a hardware erratum on the H3 SoC, we use an MMIO register based assembly routine to dump the SID registers, if needed. This is hard-coded to read the first four 32-bit words of the SID fuses. For the sid-dump command we need to access any arbitrary regions of the fuses, so extend the routine to take a start and an end address to dump. This changes the assembly source in the thunks/ directory: - We load the start address into r1, instead of zeroing it. The start address is put right after the SIO MMIO base address, at the end of the code. - When storing the read value into the result buffer, we automatically increase the pointer register (r3), instead of adding the offset address, since this is now no longer zero based. - To check for the end, we read the end pointer (stored at the end of the code, right after the offset), and compare against that instead of the hardcoded value of 16. This assembly file was put through the thunks Makefile, and the resulting content was copied from thunks/sid_read_root.h into fel_lib.c. For now we are still putting the constant values of 0 and 16 in, but this time from the C code. Signed-off-by: Andre Przywara <osp@andrep.de>
29 lines
1.5 KiB
C
29 lines
1.5 KiB
C
/* <sid_read_root_key>: */
|
|
htole32(0xe59f0044), /* 0: ldr r0, [pc, #68] */
|
|
htole32(0xe59f1044), /* 4: ldr r1, [pc, #68] */
|
|
htole32(0xe28f3048), /* 8: add r3, pc, #72 */
|
|
/* <sid_read_loop>: */
|
|
htole32(0xe1a02801), /* c: lsl r2, r1, #16 */
|
|
htole32(0xe3822b2b), /* 10: orr r2, r2, #44032 */
|
|
htole32(0xe3822002), /* 14: orr r2, r2, #2 */
|
|
htole32(0xe5802040), /* 18: str r2, [r0, #64] */
|
|
/* <sid_read_wait>: */
|
|
htole32(0xe5902040), /* 1c: ldr r2, [r0, #64] */
|
|
htole32(0xe3120002), /* 20: tst r2, #2 */
|
|
htole32(0x1afffffc), /* 24: bne 1c <sid_read_wait> */
|
|
htole32(0xe5902060), /* 28: ldr r2, [r0, #96] */
|
|
htole32(0xe4832004), /* 2c: str r2, [r3], #4 */
|
|
htole32(0xe2811004), /* 30: add r1, r1, #4 */
|
|
htole32(0xe59f2018), /* 34: ldr r2, [pc, #24] */
|
|
htole32(0xe1510002), /* 38: cmp r1, r2 */
|
|
htole32(0x3afffff2), /* 3c: bcc c <sid_read_loop> */
|
|
htole32(0xe3a02000), /* 40: mov r2, #0 */
|
|
htole32(0xe5802040), /* 44: str r2, [r0, #64] */
|
|
htole32(0xe12fff1e), /* 48: bx lr */
|
|
/* <sid_base>: */
|
|
htole32(0x00000000), /* 4c: .word 0x00000000 */
|
|
/* <offset>: */
|
|
htole32(0x00000000), /* 50: .word 0x00000000 */
|
|
/* <end>: */
|
|
htole32(0x00000000), /* 54: .word 0x00000000 */
|