Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / board-qemu / slof / tree.fs
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
8 \ *
9 \ * Contributors:
10 \ *     IBM Corporation - initial implementation
11 \ ****************************************************************************/
12
13 : strequal ( str1 len1 str2 len2 -- flag )
14   rot dup rot = IF comp 0= ELSE 2drop drop 0 THEN ; 
15
16 400 cp
17
18 \ The root of the device tree and some of its kids.
19 " /" find-device
20
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:
23
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
28
29 480 cp
30
31 \ See 3.6.5, and the PowerPC OF binding document.
32 new-device
33 s" mmu" 2dup device-name device-type
34 0 0 s" translations" property
35
36 : open  true ;
37 : close ;
38
39 finish-device
40 device-end
41
42 4c0 cp
43
44 \ Fixup timebase frequency from device-tree
45 : fixup-tbfreq
46     " /cpus/@0" find-device
47     " timebase-frequency" get-node get-package-property IF
48         2drop
49     ELSE
50         decode-int to tb-frequency 2drop
51     THEN
52     device-end
53 ;
54 fixup-tbfreq
55
56 4d0 cp
57
58 include fbuffer.fs
59
60 500 cp
61
62 : populate-vios ( -- )
63     \ Populate the /vdevice children with their methods
64     \ WARNING: Quite a few SLOFisms here like get-node, set-node, ...
65
66     ." Populating /vdevice methods" cr
67     " /vdevice" find-device get-node child
68     BEGIN
69         dup 0 <>
70     WHILE
71         dup set-node
72         dup " compatible" rot get-package-property 0 = IF
73             drop dup from-cstring
74             2dup " hvterm1" strequal IF
75                 " vio-hvterm.fs" included
76             THEN
77             2dup " IBM,v-scsi" strequal IF
78                 " vio-vscsi.fs" included
79             THEN
80             2dup " IBM,l-lan" strequal IF
81                 " vio-veth.fs" included
82             THEN
83             2dup " qemu,spapr-nvram" strequal IF
84                 " rtas-nvram.fs" included
85             THEN
86             2drop
87        THEN
88        peer
89     REPEAT drop
90
91     device-end
92 ;
93
94 \ Now do it
95 populate-vios
96
97 580 cp
98
99 5a0 cp
100
101 #include "pci-scan.fs"
102
103 : populate-pci-busses ( -- )
104     \ Populate the /pci* children with their methods
105     " /" find-device get-node child
106     BEGIN
107         dup 0 <>
108     WHILE
109         dup set-node
110         dup " name" rot get-package-property 0 = IF
111             drop dup from-cstring
112             2dup s" pci" strequal IF
113                 s" pci-phb.fs" included
114             THEN
115             2drop
116        THEN
117        peer
118     REPEAT drop
119
120     device-end
121 ;
122
123 populate-pci-busses
124
125 600 cp
126
127 : check-patch-kernel-sc1 ( -- )
128     \ At this point we can try our best to patch the kernel. This function
129     \ gets called from the "quiesce" call that kernels execute before they
130     \ take over the system.
131     \
132     \ Here we know that ciregs->r4 contains the return address that gets us
133     \ back into enter_prom inside the guest kernel.
134     \ We assume that within a range of +- 16MB of that pointer all sc 1
135     \ instructions inside of that kernel reside.
136
137     \ test_ins (instruction that tells us the kernel's endianness; we use the
138     \           return address back into the kernel here.)
139     ciregs >r4 @
140     \ test_ins + 16MB (end of search range)
141     dup 1000000 +
142     \ MAX(test_ins - 16MB, 0) (start of search range)
143     dup 2000000 < IF 0 ELSE dup 2000000 - THEN
144     swap
145     check-and-patch-sc1
146 ;
147
148 \ Add sc 1 patching
149 ' check-patch-kernel-sc1 add-quiesce-xt
150
151 \ Add rtas cleanup last
152 ' rtas-quiesce add-quiesce-xt
153
154 640 cp
155
156 690 cp
157
158 6a0 cp
159
160 6a8 cp
161
162 6b0 cp
163
164 6b8 cp
165
166 6c0 cp
167
168 s" /cpus/@0" open-dev encode-int s" cpu" set-chosen
169 s" /memory@0" open-dev encode-int s" memory" set-chosen
170
171 6e0 cp
172
173 700 cp
174
175 \ See 3.5.
176 s" /openprom" find-device
177    s" SLOF," slof-build-id here swap rmove here slof-build-id nip $cat encode-string s" model" property
178    0 0 s" relative-addressing" property
179 device-end
180
181 s" /aliases" find-device
182    : open  true ;
183    : close ;
184 device-end
185
186 s" /mmu" open-dev encode-int s" mmu" set-chosen
187
188 #include "available.fs"
189
190 \ Setup terminal IO
191
192 #include <term-io.fs>
193