diff options
author | Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> | 2013-12-06 10:10:01 +1100 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2014-02-04 19:49:46 +1100 |
commit | c2358afb40d42fa1f9c6ffb59c32f803bb3aa44d (patch) | |
tree | 9545dd4d56240c0545193c94587ff2a043289985 /slof/fs/boot.fs | |
parent | 41a34055032ac5c64811238fe72f514634285c09 (diff) | |
download | SLOF-c2358afb40d42fa1f9c6ffb59c32f803bb3aa44d.zip SLOF-c2358afb40d42fa1f9c6ffb59c32f803bb3aa44d.tar.gz SLOF-c2358afb40d42fa1f9c6ffb59c32f803bb3aa44d.tar.bz2 |
Add support for 64bit LE ABI v1 and v2 support
Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
--
v2: With the parameters changed for go-64, kernel loading from commandline broke
v3: (client-exec) calls start-elf64 directly, fix args
Diffstat (limited to 'slof/fs/boot.fs')
-rw-r--r-- | slof/fs/boot.fs | 56 |
1 files changed, 48 insertions, 8 deletions
diff --git a/slof/fs/boot.fs b/slof/fs/boot.fs index c9cc3b1..97eca1e 100644 --- a/slof/fs/boot.fs +++ b/slof/fs/boot.fs @@ -70,13 +70,51 @@ defer go ( -- ) THEN -6d boot-exception-handler ABORT ; -: go-64 ( -- ) - state-valid @ IF - 0 ciregs >r3 ! 0 ciregs >r4 ! - go-args 2@ go-entry start-elf64 client-data - claim-list elf-release 0 to claim-list - THEN - -6d boot-exception-handler ABORT + +: go-64 ( args len entry r2 r12 -- ) + 0 ciregs >r3 ! 0 ciregs >r4 ! + start-elf64 client-data + claim-list elf-release 0 to claim-list +; + +: go-64-be ( -- ) + state-valid @ IF + go-args 2@ + go-entry @ + go-entry 8 + @ + 0 go-64 + THEN + -6d boot-exception-handler ABORT +; + +\ FIXME : how to do this correctly, currently this hangs. +: set-le ( -- ) + ." Changing endianness " + msr@ 1 or msr! + ." done " + msr@ . cr +; + +: go-64-lev1 + state-valid @ IF + go-args 2@ + go-entry @ xbflip + go-entry 8 + @ xbflip + 0 + \ set-le + go-64 + THEN + -6d boot-exception-handler ABORT +; + +: go-64-lev2 + state-valid @ IF + go-args 2@ + go-entry 0 go-entry + \ set-le + go-64 + THEN + -6d boot-exception-handler ABORT ; : load-elf-init ( arg len file-addr -- success ) @@ -91,7 +129,9 @@ defer go ( -- ) ( arg len true claim-list entry elftype ) CASE 1 OF ['] go-32 ENDOF ( arg len true claim-list entry go ) - 2 OF ['] go-64 ENDOF ( arg len true claim-list entry go ) + 2 OF ['] go-64-be ENDOF ( arg len true claim-list entry go ) + 3 OF ['] go-64-lev1 ENDOF ( arg len true claim-list entry go ) + 4 OF ['] go-64-lev2 ENDOF ( arg len true claim-list entry go ) dup OF ['] no-go to go 2drop 3drop false EXIT ENDOF ( false ) ENDCASE |