From b3f699c06ac03909d4af11806f3450092cde60ee Mon Sep 17 00:00:00 2001 From: Jordan Niethe Date: Tue, 12 Jul 2022 10:46:24 +1000 Subject: OF: Add a separate direct kernel loading word Currently, go-64 is used for booting a kernel from qemu (i.e. -kernel). However, there is an expectation from users that this should be able to boot not just vmlinux kernels but things like Zimages too. The bootwrapper of a BE zImage is a 32-bit ELF. Attempting to load that with go-64 means that it will be ran with MSR_SF set (64-bit mode). This crashes early in boot (usually due to what should be 32-bit operations being done with 64-bit registers eventually leading to an incorrect address being generated and branched to). Note that our 64-bit payloads are prepared to enter with MSR_SF cleared and set it themselves very early. Add a new word named go-direct that will execute any simple payload in-place and will enter with MSR_SF cleared. This allows booting a BE zImage from qemu with -machine kernel-addr=0. Signed-off-by: Jordan Niethe Signed-off-by: Alexey Kardashevskiy --- board-qemu/slof/OF.fs | 5 ++--- slof/fs/boot.fs | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/board-qemu/slof/OF.fs b/board-qemu/slof/OF.fs index f0fc9c6..3bcb2af 100644 --- a/board-qemu/slof/OF.fs +++ b/board-qemu/slof/OF.fs @@ -303,10 +303,9 @@ set-default-console : (boot-ram) direct-ram-boot-size 0<> IF ." Booting from memory..." cr - s" go-args 2@ " evaluate - direct-ram-boot-base 0 + s" direct-ram-boot-base to go-entry" evaluate s" true state-valid ! " evaluate - s" disable-watchdog go-64" evaluate + s" disable-watchdog go-direct" evaluate THEN ; diff --git a/slof/fs/boot.fs b/slof/fs/boot.fs index 6d16c54..a6dfdf3 100644 --- a/slof/fs/boot.fs +++ b/slof/fs/boot.fs @@ -112,6 +112,12 @@ defer go ( -- ) claim-list elf-release 0 to claim-list ; +: go-direct ( -- ) + 0 ciregs >r3 ! 0 ciregs >r4 ! 0 ciregs >r2 ! + msr@ 7fffffffffffffff and 2000 or ciregs >srr1 ! + go-args 2@ go-entry call-client +; + : set-le ( -- ) 1 ciregs >r13 ! ; -- cgit v1.1