diff options
author | Jordan Niethe <jniethe5@gmail.com> | 2022-07-12 10:46:24 +1000 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2022-07-19 12:54:08 +1000 |
commit | b3f699c06ac03909d4af11806f3450092cde60ee (patch) | |
tree | 231cb5c023145802d31a5b9c0c2900e834a9f549 /slof/fs/boot.fs | |
parent | 5b4c5acdcd552a4e1796aeca6bb700f6cbb0282d (diff) | |
download | SLOF-b3f699c06ac03909d4af11806f3450092cde60ee.zip SLOF-b3f699c06ac03909d4af11806f3450092cde60ee.tar.gz SLOF-b3f699c06ac03909d4af11806f3450092cde60ee.tar.bz2 |
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 <jniethe5@gmail.com>
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'slof/fs/boot.fs')
-rw-r--r-- | slof/fs/boot.fs | 6 |
1 files changed, 6 insertions, 0 deletions
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 ! ; |