ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/name_registry.cpp
Revision: 1.18
Committed: 2005-03-19T04:31:59Z (19 years, 1 month ago) by gbeauche
Branch: MAIN
Changes since 1.17: +3 -0 lines
Log Message:
the current ethernet code is not direct addressing clean, so enable it only
if real addressing mode is available (e.g. this excludes win32 platforms for
now)

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * name_registry.cpp - Name Registry handling
3     *
4 gbeauche 1.17 * SheepShaver (C) 1997-2005 Christian Bauer and Marc Hellwig
5 cebix 1.1 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #include <string.h>
22    
23     #include "sysdeps.h"
24     #include "name_registry.h"
25     #include "main.h"
26     #include "macos_util.h"
27     #include "user_strings.h"
28 gbeauche 1.2 #include "emul_op.h"
29 gbeauche 1.4 #include "thunks.h"
30 cebix 1.1
31     #define DEBUG 0
32     #include "debug.h"
33    
34    
35     // Function pointers
36     typedef int16 (*rcec_ptr)(const RegEntryID *, const char *, RegEntryID *);
37     static uint32 rcec_tvect = 0;
38 gbeauche 1.13 static inline int16 RegistryCStrEntryCreate(uintptr arg1, const char *arg2, uint32 arg3)
39 cebix 1.1 {
40 gbeauche 1.14 SheepString arg2str(arg2);
41     return (int16)CallMacOS3(rcec_ptr, rcec_tvect, (const RegEntryID *)arg1, arg2str.addr(), arg3);
42 cebix 1.1 }
43     typedef int16 (*rpc_ptr)(const RegEntryID *, const char *, const void *, uint32);
44     static uint32 rpc_tvect = 0;
45 gbeauche 1.13 static inline int16 RegistryPropertyCreate(uintptr arg1, const char *arg2, uintptr arg3, uint32 arg4)
46 cebix 1.1 {
47 gbeauche 1.14 SheepString arg2str(arg2);
48     return (int16)CallMacOS4(rpc_ptr, rpc_tvect, (const RegEntryID *)arg1, arg2str.addr(), (const void *)arg3, arg4);
49     }
50     static inline int16 RegistryPropertyCreateStr(uintptr arg1, const char *arg2, const char *arg3)
51     {
52     SheepString arg3str(arg3);
53     return RegistryPropertyCreate(arg1, arg2, arg3str.addr(), strlen(arg3) + 1);
54 cebix 1.1 }
55    
56     // Video driver stub
57     static const uint8 video_driver[] = {
58     #include "VideoDriverStub.i"
59     };
60    
61     // Ethernet driver stub
62     static const uint8 ethernet_driver[] = {
63     #include "EthernetDriverStub.i"
64     };
65    
66 gbeauche 1.4 // Helper for RegEntryID
67 gbeauche 1.13 typedef SheepArray<sizeof(RegEntryID)> SheepRegEntryID;
68 gbeauche 1.4
69     // Helper for a <uint32, uint32> pair
70     struct SheepPair : public SheepArray<8> {
71     SheepPair(uint32 base, uint32 size) : SheepArray<8>()
72     { WriteMacInt32(addr(), base); WriteMacInt32(addr() + 4, size); }
73     };
74    
75 cebix 1.1
76     /*
77     * Patch Name Registry during startup
78     */
79    
80 gbeauche 1.2 void DoPatchNameRegistry(void)
81 cebix 1.1 {
82 gbeauche 1.4 SheepVar32 u32;
83 cebix 1.1 D(bug("Patching Name Registry..."));
84    
85     // Create "device-tree"
86 gbeauche 1.4 SheepRegEntryID device_tree;
87 gbeauche 1.13 if (!RegistryCStrEntryCreate(0, "Devices:device-tree", device_tree.addr())) {
88 gbeauche 1.4 u32.set_value(BusClockSpeed);
89 gbeauche 1.13 RegistryPropertyCreate(device_tree.addr(), "clock-frequency", u32.addr(), 4);
90     RegistryPropertyCreateStr(device_tree.addr(), "model", "Power Macintosh");
91 cebix 1.1
92     // Create "AAPL,ROM"
93 gbeauche 1.4 SheepRegEntryID aapl_rom;
94 gbeauche 1.13 if (!RegistryCStrEntryCreate(device_tree.addr(), "AAPL,ROM", aapl_rom.addr())) {
95     RegistryPropertyCreateStr(aapl_rom.addr(), "device_type", "rom");
96 gbeauche 1.4 SheepPair reg(ROM_BASE, ROM_SIZE);
97 gbeauche 1.13 RegistryPropertyCreate(aapl_rom.addr(), "reg", reg.addr(), 8);
98 cebix 1.1 }
99    
100     // Create "PowerPC,60x"
101 gbeauche 1.4 SheepRegEntryID power_pc;
102 cebix 1.1 char *str;
103     switch (PVR >> 16) {
104     case 1: // 601
105     str = "PowerPC,601";
106     break;
107     case 3: // 603
108     str = "PowerPC,603";
109     break;
110     case 4: // 604
111     str = "PowerPC,604";
112     break;
113     case 6: // 603e
114     str = "PowerPC,603e";
115     break;
116     case 7: // 603ev
117     str = "PowerPC,603ev";
118     break;
119     case 8: // 750
120     str = "PowerPC,750";
121     break;
122     case 9: // 604e
123     str = "PowerPC,604e";
124     break;
125     case 10: // 604ev5
126     str = "PowerPC,604ev";
127     break;
128     case 50: // 821
129     str = "PowerPC,821";
130     break;
131     case 80: // 860
132     str = "PowerPC,860";
133     break;
134 gbeauche 1.16 case 12: // 7400, 7410, 7450, 7455, 7457
135     case 0x800c:
136     case 0x8000:
137     case 0x8001:
138     case 0x8002:
139     str = "PowerPC,G4";
140     break;
141 cebix 1.1 default:
142     str = "PowerPC,???";
143     break;
144     }
145 gbeauche 1.13 if (!RegistryCStrEntryCreate(device_tree.addr(), str, power_pc.addr())) {
146 gbeauche 1.4 u32.set_value(CPUClockSpeed);
147 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "clock-frequency", u32.addr(), 4);
148 gbeauche 1.9 u32.set_value(BusClockSpeed);
149 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "bus-frequency", u32.addr(), 4);
150 gbeauche 1.12 u32.set_value(TimebaseSpeed);
151 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "timebase-frequency", u32.addr(), 4);
152 gbeauche 1.4 u32.set_value(PVR);
153 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "cpu-version", u32.addr(), 4);
154     RegistryPropertyCreateStr(power_pc.addr(), "device_type", "cpu");
155 cebix 1.1 switch (PVR >> 16) {
156     case 1: // 601
157 gbeauche 1.4 u32.set_value(64);
158 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
159 gbeauche 1.4 u32.set_value(128);
160 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
161 gbeauche 1.4 u32.set_value(0x8000);
162 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
163 gbeauche 1.4 u32.set_value(64);
164 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
165 gbeauche 1.4 u32.set_value(128);
166 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
167 gbeauche 1.4 u32.set_value(0x8000);
168 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
169 gbeauche 1.4 u32.set_value(128);
170 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
171 gbeauche 1.4 u32.set_value(256);
172 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
173 cebix 1.1 break;
174     case 3: // 603
175 gbeauche 1.4 u32.set_value(32);
176 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
177 gbeauche 1.4 u32.set_value(64);
178 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
179 gbeauche 1.4 u32.set_value(0x2000);
180 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
181 gbeauche 1.4 u32.set_value(32);
182 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
183 gbeauche 1.4 u32.set_value(64);
184 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
185 gbeauche 1.4 u32.set_value(0x2000);
186 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
187 gbeauche 1.4 u32.set_value(32);
188 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
189 gbeauche 1.4 u32.set_value(64);
190 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
191 cebix 1.1 break;
192     case 4: // 604
193 gbeauche 1.4 u32.set_value(32);
194 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
195 gbeauche 1.4 u32.set_value(128);
196 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
197 gbeauche 1.4 u32.set_value(0x4000);
198 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
199 gbeauche 1.4 u32.set_value(32);
200 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
201 gbeauche 1.4 u32.set_value(128);
202 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
203 gbeauche 1.4 u32.set_value(0x4000);
204 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
205 gbeauche 1.4 u32.set_value(64);
206 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
207 gbeauche 1.4 u32.set_value(128);
208 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
209 cebix 1.1 break;
210     case 6: // 603e
211     case 7: // 603ev
212 gbeauche 1.4 u32.set_value(32);
213 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
214 gbeauche 1.4 u32.set_value(128);
215 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
216 gbeauche 1.4 u32.set_value(0x4000);
217 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
218 gbeauche 1.4 u32.set_value(32);
219 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
220 gbeauche 1.4 u32.set_value(128);
221 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
222 gbeauche 1.4 u32.set_value(0x4000);
223 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
224 gbeauche 1.4 u32.set_value(32);
225 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
226 gbeauche 1.4 u32.set_value(64);
227 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
228 cebix 1.1 break;
229 gbeauche 1.10 case 8: // 750, 750FX
230     case 0x7000:
231 gbeauche 1.4 u32.set_value(32);
232 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
233 gbeauche 1.4 u32.set_value(256);
234 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
235 gbeauche 1.4 u32.set_value(0x8000);
236 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
237 gbeauche 1.4 u32.set_value(32);
238 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
239 gbeauche 1.4 u32.set_value(256);
240 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
241 gbeauche 1.4 u32.set_value(0x8000);
242 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
243 gbeauche 1.4 u32.set_value(64);
244 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
245 gbeauche 1.4 u32.set_value(128);
246 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
247 cebix 1.1 break;
248     case 9: // 604e
249     case 10: // 604ev5
250 gbeauche 1.4 u32.set_value(32);
251 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
252 gbeauche 1.4 u32.set_value(256);
253 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
254 gbeauche 1.4 u32.set_value(0x8000);
255 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
256 gbeauche 1.4 u32.set_value(32);
257 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
258 gbeauche 1.4 u32.set_value(256);
259 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
260 gbeauche 1.4 u32.set_value(0x8000);
261 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
262 gbeauche 1.4 u32.set_value(64);
263 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
264 gbeauche 1.4 u32.set_value(128);
265 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
266 cebix 1.1 break;
267 gbeauche 1.10 case 12: // 7400, 7410, 7450, 7455, 7457
268 gbeauche 1.8 case 0x800c:
269 gbeauche 1.10 case 0x8000:
270     case 0x8001:
271     case 0x8002:
272 gbeauche 1.7 u32.set_value(32);
273 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
274 gbeauche 1.7 u32.set_value(128);
275 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
276 gbeauche 1.7 u32.set_value(0x8000);
277 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
278 gbeauche 1.7 u32.set_value(32);
279 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
280 gbeauche 1.7 u32.set_value(128);
281 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
282 gbeauche 1.7 u32.set_value(0x8000);
283 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
284 gbeauche 1.7 u32.set_value(64);
285 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
286 gbeauche 1.7 u32.set_value(128);
287 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
288 gbeauche 1.7 break;
289 gbeauche 1.11 case 0x39: // 970
290     u32.set_value(128);
291 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-block-size", u32.addr(), 4);
292 gbeauche 1.11 u32.set_value(128);
293 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-sets", u32.addr(), 4);
294 gbeauche 1.11 u32.set_value(0x8000);
295 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "d-cache-size", u32.addr(), 4);
296 gbeauche 1.11 u32.set_value(128);
297 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-block-size", u32.addr(), 4);
298 gbeauche 1.11 u32.set_value(512);
299 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-sets", u32.addr(), 4);
300 gbeauche 1.11 u32.set_value(0x10000);
301 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "i-cache-size", u32.addr(), 4);
302 gbeauche 1.11 u32.set_value(256);
303 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-sets", u32.addr(), 4);
304 gbeauche 1.11 u32.set_value(0x1000);
305 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "tlb-size", u32.addr(), 4);
306 gbeauche 1.11 break;
307 cebix 1.1 default:
308     break;
309     }
310 gbeauche 1.4 u32.set_value(32);
311 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "reservation-granularity", u32.addr(), 4);
312 gbeauche 1.4 SheepPair reg(0, 0);
313 gbeauche 1.13 RegistryPropertyCreate(power_pc.addr(), "reg", reg.addr(), 8);
314 cebix 1.1 }
315    
316     // Create "memory"
317 gbeauche 1.4 SheepRegEntryID memory;
318 gbeauche 1.13 if (!RegistryCStrEntryCreate(device_tree.addr(), "memory", memory.addr())) {
319 gbeauche 1.4 SheepPair reg(RAMBase, RAMSize);
320 gbeauche 1.13 RegistryPropertyCreateStr(memory.addr(), "device_type", "memory");
321     RegistryPropertyCreate(memory.addr(), "reg", reg.addr(), 8);
322 cebix 1.1 }
323    
324     // Create "video"
325 gbeauche 1.4 SheepRegEntryID video;
326 gbeauche 1.13 if (!RegistryCStrEntryCreate(device_tree.addr(), "video", video.addr())) {
327     RegistryPropertyCreateStr(video.addr(), "AAPL,connector", "monitor");
328     RegistryPropertyCreateStr(video.addr(), "device_type", "display");
329 gbeauche 1.14 SheepArray<sizeof(video_driver)> the_video_driver;
330     Host2Mac_memcpy(the_video_driver.addr(), video_driver, sizeof(video_driver));
331     RegistryPropertyCreate(video.addr(), "driver,AAPL,MacOS,PowerPC", the_video_driver.addr(), sizeof(video_driver));
332 gbeauche 1.13 RegistryPropertyCreateStr(video.addr(), "model", "SheepShaver Video");
333 cebix 1.1 }
334    
335     // Create "ethernet"
336 gbeauche 1.18 // XXX the current ethernet driver is not direct addressing clean
337     #if REAL_ADDRESSING
338 gbeauche 1.4 SheepRegEntryID ethernet;
339 gbeauche 1.13 if (!RegistryCStrEntryCreate(device_tree.addr(), "ethernet", ethernet.addr())) {
340     RegistryPropertyCreateStr(ethernet.addr(), "AAPL,connector", "ethernet");
341     RegistryPropertyCreateStr(ethernet.addr(), "device_type", "network");
342 gbeauche 1.14 SheepArray<sizeof(ethernet_driver)> the_ethernet_driver;
343     Host2Mac_memcpy(the_ethernet_driver.addr(), ethernet_driver, sizeof(ethernet_driver));
344     RegistryPropertyCreate(ethernet.addr(), "driver,AAPL,MacOS,PowerPC", the_ethernet_driver.addr(), sizeof(ethernet_driver));
345 cebix 1.1 // local-mac-address
346     // max-frame-size 2048
347     }
348 gbeauche 1.18 #endif
349 cebix 1.1 }
350     D(bug("done.\n"));
351     }
352    
353     void PatchNameRegistry(void)
354     {
355     // Find RegistryCStrEntryCreate() and RegistryPropertyCreate() TVECTs
356 gbeauche 1.15 rcec_tvect = FindLibSymbol("\017NameRegistryLib", "\027RegistryCStrEntryCreate");
357 cebix 1.1 D(bug("RegistryCStrEntryCreate TVECT at %08x\n", rcec_tvect));
358 gbeauche 1.15 rpc_tvect = FindLibSymbol("\017NameRegistryLib", "\026RegistryPropertyCreate");
359 cebix 1.1 D(bug("RegistryPropertyCreate TVECT at %08x\n", rpc_tvect));
360     if (rcec_tvect == 0 || rpc_tvect == 0) {
361     ErrorAlert(GetString(STR_NO_NAME_REGISTRY_ERR));
362     QuitEmulator();
363     }
364    
365     // Main routine must be executed in PPC mode
366 gbeauche 1.2 ExecuteNative(NATIVE_PATCH_NAME_REGISTRY);
367 cebix 1.1 }