1
\ *****************************************************************************
2
\ * Copyright (c) 2004, 2011 IBM Corporation
3
\ * All rights reserved.
4
\ * This program and the accompanying materials
5
\ * are made available under the terms of the BSD License
6
\ * which accompanies this distribution, and is available at
7
\ * http://www.opensource.org/licenses/bsd-license.php
10
\ * IBM Corporation - initial implementation
11
\ ****************************************************************************/
13
: strequal ( str1 len1 str2 len2 -- flag )
14
rot dup rot = IF comp 0= ELSE 2drop drop 0 THEN ;
18
\ The root of the device tree and some of its kids.
21
\ The following properties have been provided by the FDT from QEMU already,
22
\ so we do not have to create them on our own:
24
\ " QEMU" encode-string s" model" property
25
\ 2 encode-int s" #address-cells" property
26
\ 2 encode-int s" #size-cells" property
27
\ s" chrp" device-type
29
#include "archsupport.fs"
33
\ See 3.6.5, and the PowerPC OF binding document.
35
s" mmu" 2dup device-name device-type
36
0 0 s" translations" property
46
\ Fixup timebase frequency from device-tree
49
get-node child dup 0= ABORT" CPU not found"
51
" timebase-frequency" get-node get-package-property IF
54
decode-int to tb-frequency 2drop
66
: populate-vios ( -- )
67
\ Populate the /vdevice children with their methods
68
\ WARNING: Quite a few SLOFisms here like get-node, set-node, ...
70
." Populating /vdevice methods" cr
71
" /vdevice" find-device get-node child
76
dup " compatible" rot get-package-property 0 = IF
78
2dup " hvterm1" strequal IF
79
" vio-hvterm.fs" included
81
2dup " IBM,v-scsi" strequal IF
82
" vio-vscsi.fs" included
84
2dup " IBM,l-lan" strequal IF
85
" vio-veth.fs" included
87
2dup " qemu,spapr-nvram" strequal IF
88
" rtas-nvram.fs" included
103
#include "pci-scan.fs"
105
: populate-pci-busses ( -- )
106
\ Populate the /pci* children with their methods
107
" /" find-device get-node child
112
dup " name" rot get-package-property 0 = IF
113
drop dup from-cstring
114
2dup s" pci" strequal IF
115
s" pci-phb.fs" included
129
: check-patch-kernel-sc1 ( -- )
130
\ At this point we can try our best to patch the kernel. This function
131
\ gets called from the "quiesce" call that kernels execute before they
132
\ take over the system.
134
\ Here we know that ciregs->r4 contains the return address that gets us
135
\ back into enter_prom inside the guest kernel.
136
\ We assume that within a range of +- 16MB of that pointer all sc 1
137
\ instructions inside of that kernel reside.
139
\ test_ins (instruction that tells us the kernel's endianness; we use the
140
\ return address back into the kernel here.)
142
\ test_ins + 16MB (end of search range)
144
\ MAX(test_ins - 16MB, 0) (start of search range)
145
dup 2000000 < IF 0 ELSE dup 2000000 - THEN
151
' check-patch-kernel-sc1 add-quiesce-xt
153
\ Add rtas cleanup last
154
' rtas-quiesce add-quiesce-xt
158
\ Do not assume that cpu0 is available
161
get-node child dup 0= ABORT" CPU not found"
162
node>path open-dev encode-int s" cpu" set-chosen
166
s" /memory@0" open-dev encode-int s" memory" set-chosen
171
s" /openprom" find-device
172
s" SLOF," slof-build-id here swap rmove here slof-build-id nip $cat encode-string s" model" property
173
0 0 s" relative-addressing" property
176
s" /aliases" find-device
181
s" /mmu" open-dev encode-int s" mmu" set-chosen
183
#include "available.fs"
187
#include <term-io.fs>