aboutsummaryrefslogtreecommitdiff
path: root/slof/fs/boot.fs
diff options
context:
space:
mode:
authorNikunj A Dadhania <nikunj@linux.vnet.ibm.com>2013-12-06 10:10:01 +1100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2014-02-04 19:49:46 +1100
commitc2358afb40d42fa1f9c6ffb59c32f803bb3aa44d (patch)
tree9545dd4d56240c0545193c94587ff2a043289985 /slof/fs/boot.fs
parent41a34055032ac5c64811238fe72f514634285c09 (diff)
downloadSLOF-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.fs56
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