--- SheepShaver/src/name_registry.cpp 2002/02/04 16:58:13 1.1 +++ SheepShaver/src/name_registry.cpp 2004/01/31 11:10:48 1.7 @@ -1,7 +1,7 @@ /* * name_registry.cpp - Name Registry handling * - * SheepShaver (C) 1997-2002 Christian Bauer and Marc Hellwig + * SheepShaver (C) 1997-2004 Christian Bauer and Marc Hellwig * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +25,8 @@ #include "main.h" #include "macos_util.h" #include "user_strings.h" +#include "emul_op.h" +#include "thunks.h" #define DEBUG 0 #include "debug.h" @@ -55,33 +57,46 @@ static const uint8 ethernet_driver[] = { #include "EthernetDriverStub.i" }; +// Helper for RegEntryID +struct SheepRegEntryID : public SheepArray { + RegEntryID *ptr() const { return (RegEntryID *)addr(); } +}; + +// Helper for a pair +struct SheepPair : public SheepArray<8> { + SheepPair(uint32 base, uint32 size) : SheepArray<8>() + { WriteMacInt32(addr(), base); WriteMacInt32(addr() + 4, size); } + uint32 *ptr() const + { return (uint32 *)addr(); } +}; + /* * Patch Name Registry during startup */ -static void patch_name_registry(void) +void DoPatchNameRegistry(void) { - uint32 u32; + SheepVar32 u32; D(bug("Patching Name Registry...")); // Create "device-tree" - RegEntryID device_tree; - if (!RegistryCStrEntryCreate(NULL, "Devices:device-tree", &device_tree)) { - u32 = BusClockSpeed; - RegistryPropertyCreate(&device_tree, "clock-frequency", &u32, 4); - RegistryPropertyCreateStr(&device_tree, "model", "Power Macintosh"); + SheepRegEntryID device_tree; + if (!RegistryCStrEntryCreate(NULL, "Devices:device-tree", device_tree.ptr())) { + u32.set_value(BusClockSpeed); + RegistryPropertyCreate(device_tree.ptr(), "clock-frequency", u32.ptr(), 4); + RegistryPropertyCreateStr(device_tree.ptr(), "model", "Power Macintosh"); // Create "AAPL,ROM" - RegEntryID aapl_rom; - if (!RegistryCStrEntryCreate(&device_tree, "AAPL,ROM", &aapl_rom)) { - RegistryPropertyCreateStr(&aapl_rom, "device_type", "rom"); - uint32 reg[2] = {ROM_BASE, ROM_SIZE}; - RegistryPropertyCreate(&aapl_rom, "reg", ®, 8); + SheepRegEntryID aapl_rom; + if (!RegistryCStrEntryCreate(device_tree.ptr(), "AAPL,ROM", aapl_rom.ptr())) { + RegistryPropertyCreateStr(aapl_rom.ptr(), "device_type", "rom"); + SheepPair reg(ROM_BASE, ROM_SIZE); + RegistryPropertyCreate(aapl_rom.ptr(), "reg", reg.ptr(), 8); } // Create "PowerPC,60x" - RegEntryID power_pc; + SheepRegEntryID power_pc; char *str; switch (PVR >> 16) { case 1: // 601 @@ -118,154 +133,174 @@ static void patch_name_registry(void) str = "PowerPC,???"; break; } - if (!RegistryCStrEntryCreate(&device_tree, str, &power_pc)) { - u32 = CPUClockSpeed; - RegistryPropertyCreate(&power_pc, "clock-frequency", &u32, 4); - RegistryPropertyCreate(&power_pc, "cpu-version", &PVR, 4); - RegistryPropertyCreateStr(&power_pc, "device_type", "cpu"); + if (!RegistryCStrEntryCreate(device_tree.ptr(), str, power_pc.ptr())) { + u32.set_value(CPUClockSpeed); + RegistryPropertyCreate(power_pc.ptr(), "clock-frequency", u32.ptr(), 4); + u32.set_value(PVR); + RegistryPropertyCreate(power_pc.ptr(), "cpu-version", u32.ptr(), 4); + RegistryPropertyCreateStr(power_pc.ptr(), "device_type", "cpu"); switch (PVR >> 16) { case 1: // 601 - u32 = 64; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 256; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(256); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; case 3: // 603 - u32 = 32; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x2000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x2000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x2000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x2000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; case 4: // 604 - u32 = 32; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x4000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x4000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x4000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x4000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; case 6: // 603e case 7: // 603ev - u32 = 32; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x4000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x4000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x4000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x4000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; case 8: // 750 - u32 = 32; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 256; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 256; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(256); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(256); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; case 9: // 604e case 10: // 604ev5 - u32 = 32; - RegistryPropertyCreate(&power_pc, "d-cache-block-size", &u32, 4); - u32 = 256; - RegistryPropertyCreate(&power_pc, "d-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "d-cache-size", &u32, 4); - u32 = 32; - RegistryPropertyCreate(&power_pc, "i-cache-block-size", &u32, 4); - u32 = 256; - RegistryPropertyCreate(&power_pc, "i-cache-sets", &u32, 4); - u32 = 0x8000; - RegistryPropertyCreate(&power_pc, "i-cache-size", &u32, 4); - u32 = 64; - RegistryPropertyCreate(&power_pc, "tlb-sets", &u32, 4); - u32 = 128; - RegistryPropertyCreate(&power_pc, "tlb-size", &u32, 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(256); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(256); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); + break; + case 0x8000: // 7400 + case 0x800c: // 7410 + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "d-cache-size", u32.ptr(), 4); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-block-size", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-sets", u32.ptr(), 4); + u32.set_value(0x8000); + RegistryPropertyCreate(power_pc.ptr(), "i-cache-size", u32.ptr(), 4); + u32.set_value(64); + RegistryPropertyCreate(power_pc.ptr(), "tlb-sets", u32.ptr(), 4); + u32.set_value(128); + RegistryPropertyCreate(power_pc.ptr(), "tlb-size", u32.ptr(), 4); break; default: break; } - u32 = 32; - RegistryPropertyCreate(&power_pc, "reservation-granularity", &u32, 4); - uint32 reg[2] = {0, 0}; - RegistryPropertyCreate(&power_pc, "reg", ®, 8); + u32.set_value(32); + RegistryPropertyCreate(power_pc.ptr(), "reservation-granularity", u32.ptr(), 4); + SheepPair reg(0, 0); + RegistryPropertyCreate(power_pc.ptr(), "reg", reg.ptr(), 8); } // Create "memory" - RegEntryID memory; - if (!RegistryCStrEntryCreate(&device_tree, "memory", &memory)) { - uint32 reg[2] = {RAMBase, RAMSize}; - RegistryPropertyCreateStr(&memory, "device_type", "memory"); - RegistryPropertyCreate(&memory, "reg", ®, 8); + SheepRegEntryID memory; + if (!RegistryCStrEntryCreate(device_tree.ptr(), "memory", memory.ptr())) { + SheepPair reg(RAMBase, RAMSize); + RegistryPropertyCreateStr(memory.ptr(), "device_type", "memory"); + RegistryPropertyCreate(memory.ptr(), "reg", reg.ptr(), 8); } // Create "video" - RegEntryID video; - if (!RegistryCStrEntryCreate(&device_tree, "video", &video)) { - RegistryPropertyCreateStr(&video, "AAPL,connector", "monitor"); - RegistryPropertyCreateStr(&video, "device_type", "display"); - RegistryPropertyCreate(&video, "driver,AAPL,MacOS,PowerPC", &video_driver, sizeof(video_driver)); - RegistryPropertyCreateStr(&video, "model", "SheepShaver Video"); + SheepRegEntryID video; + if (!RegistryCStrEntryCreate(device_tree.ptr(), "video", video.ptr())) { + RegistryPropertyCreateStr(video.ptr(), "AAPL,connector", "monitor"); + RegistryPropertyCreateStr(video.ptr(), "device_type", "display"); + RegistryPropertyCreate(video.ptr(), "driver,AAPL,MacOS,PowerPC", video_driver, sizeof(video_driver)); + RegistryPropertyCreateStr(video.ptr(), "model", "SheepShaver Video"); } // Create "ethernet" - RegEntryID ethernet; - if (!RegistryCStrEntryCreate(&device_tree, "ethernet", ðernet)) { - RegistryPropertyCreateStr(ðernet, "AAPL,connector", "ethernet"); - RegistryPropertyCreateStr(ðernet, "device_type", "network"); - RegistryPropertyCreate(ðernet, "driver,AAPL,MacOS,PowerPC", ðernet_driver, sizeof(ethernet_driver)); + SheepRegEntryID ethernet; + if (!RegistryCStrEntryCreate(device_tree.ptr(), "ethernet", ethernet.ptr())) { + RegistryPropertyCreateStr(ethernet.ptr(), "AAPL,connector", "ethernet"); + RegistryPropertyCreateStr(ethernet.ptr(), "device_type", "network"); + RegistryPropertyCreate(ethernet.ptr(), "driver,AAPL,MacOS,PowerPC", ethernet_driver, sizeof(ethernet_driver)); // local-mac-address // max-frame-size 2048 } @@ -286,5 +321,5 @@ void PatchNameRegistry(void) } // Main routine must be executed in PPC mode - ExecutePPC(patch_name_registry); + ExecuteNative(NATIVE_PATCH_NAME_REGISTRY); }