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
48 " /cpus/@0" find-device
49 " timebase-frequency" get-node get-package-property IF
52 decode-int to tb-frequency 2drop
64 : populate-vios ( -- )
65 \ Populate the /vdevice children with their methods
66 \ WARNING: Quite a few SLOFisms here like get-node, set-node, ...
68 ." Populating /vdevice methods" cr
69 " /vdevice" find-device get-node child
74 dup " compatible" rot get-package-property 0 = IF
76 2dup " hvterm1" strequal IF
77 " vio-hvterm.fs" included
79 2dup " IBM,v-scsi" strequal IF
80 " vio-vscsi.fs" included
82 2dup " IBM,l-lan" strequal IF
83 " vio-veth.fs" included
85 2dup " qemu,spapr-nvram" strequal IF
86 " 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
170 s" /cpus/@0" open-dev encode-int s" cpu" set-chosen
171 s" /memory@0" open-dev encode-int s" memory" set-chosen
178 s" /openprom" find-device
179 s" SLOF," slof-build-id here swap rmove here slof-build-id nip $cat encode-string s" model" property
180 0 0 s" relative-addressing" property
183 s" /aliases" find-device
188 s" /mmu" open-dev encode-int s" mmu" set-chosen
190 #include "available.fs"
194 #include <term-io.fs>