Author: kallisti5 Date: 2011-07-19 06:20:38 +0200 (Tue, 19 Jul 2011) New Revision: 42449 Changeset: https://dev.haiku-os.org/changeset/42449 Modified: haiku/trunk/src/system/boot/platform/openfirmware/arch/ppc/mmu.cpp Log: * Clean up debugging of PowerPC mmu code to be consistent * Clean up messge and error text * Begin use B_PRI* macros Modified: haiku/trunk/src/system/boot/platform/openfirmware/arch/ppc/mmu.cpp =================================================================== --- haiku/trunk/src/system/boot/platform/openfirmware/arch/ppc/mmu.cpp 2011-07-19 03:52:42 UTC (rev 42448) +++ haiku/trunk/src/system/boot/platform/openfirmware/arch/ppc/mmu.cpp 2011-07-19 04:20:38 UTC (rev 42449) @@ -30,6 +30,14 @@ //#define PHYSINVAL ((void *)-1) #define PHYSINVAL NULL +//#define TRACE_MMU +#ifdef TRACE_MMU +# define TRACE(x...) dprintf(x) +#else +# define TRACE(x...) ; +#endif + + segment_descriptor sSegments[16]; page_table_entry_group *sPageTable; uint32 sPageTableHashMask; @@ -62,7 +70,7 @@ find_physical_memory_ranges(size_t &total) { int memory, package; - printf("checking for memory...\n"); + dprintf("checking for memory...\n"); if (of_getprop(gChosen, "memory", &memory, sizeof(int)) == OF_FAILED) return B_ERROR; package = of_instance_to_package(memory); @@ -80,17 +88,18 @@ for (int32 i = 0; i < count; i++) { if (regions[i].size <= 0) { - printf("%ld: empty region\n", i); + dprintf("%ld: empty region\n", i); continue; } - printf("%ld: base = %p, size = %lu\n", i, regions[i].base, - regions[i].size); + dprintf("%" B_PRIu32 ": base = %p, size = %" B_PRIu32 "\n", i, + regions[i].base, regions[i].size); total += regions[i].size; if (insert_physical_memory_range((addr_t)regions[i].base, regions[i].size) != B_OK) { - printf("cannot map physical memory range (num ranges = %lu)!\n", + dprintf("cannot map physical memory range " + "(num ranges = %" B_PRIu32 ")!\n", gKernelArgs.num_physical_memory_ranges); return B_ERROR; } @@ -184,7 +193,8 @@ fill_page_table_entry(&group->entry[i], virtualSegmentID, virtualAddress, physicalAddress, mode, false); - //printf("map: va = %p -> %p, mode = %d, hash = %lu\n", virtualAddress, physicalAddress, mode, hash); + //TRACE("map: va = %p -> %p, mode = %d, hash = %lu\n", + // virtualAddress, physicalAddress, mode, hash); return; } @@ -197,12 +207,12 @@ fill_page_table_entry(&group->entry[i], virtualSegmentID, virtualAddress, physicalAddress, mode, true); - //printf("map: va = %p -> %p, mode = %d, second hash = %lu\n", virtualAddress, physicalAddress, mode, hash); + //TRACE("map: va = %p -> %p, mode = %d, second hash = %lu\n", + // virtualAddress, physicalAddress, mode, hash); return; } - panic("out of page table entries! (you would think this could not happen " - "in a boot loader...)\n"); + panic("%s: out of page table entries!\n", __func__); } @@ -226,7 +236,7 @@ // we have proper driver support for the target hardware). int mmu; if (of_getprop(gChosen, "mmu", &mmu, sizeof(int)) == OF_FAILED) { - puts("no OF mmu"); + dprintf("%s: Error: no OpenFirmware mmu\n", __func__); return B_ERROR; } mmu = of_instance_to_package(mmu); @@ -241,30 +251,33 @@ int length = of_getprop(mmu, "translations", &translations, sizeof(translations)); if (length == OF_FAILED) { - puts("no OF translations"); + dprintf("Error: no OF translations.\n"); return B_ERROR; } length = length / sizeof(struct translation_map); uint32 total = 0; - printf("found %d translations\n", length); + dprintf("found %d translations\n", length); for (int i = 0; i < length; i++) { struct translation_map *map = &translations[i]; bool keepRange = true; - //printf("%i: map: %p, length %d -> physical: %p, mode %d\n", i, map->virtual_address, map->length, map->physical_address, map->mode); + TRACE("%i: map: %p, length %d -> physical: %p, mode %d\n", i, + map->virtual_address, map->length, + map->physical_address, map->mode); // insert range in physical allocated, if it points to physical memory if (is_physical_memory(map->physical_address) && insert_physical_allocated_range((addr_t)map->physical_address, map->length) != B_OK) { - printf("cannot map physical allocated range (num ranges = %lu)!\n", + dprintf("cannot map physical allocated range " + "(num ranges = %" B_PRIu32 ")!\n", gKernelArgs.num_physical_allocated_ranges); return B_ERROR; } if (map->virtual_address == pageTable) { - puts("found page table!"); + dprintf("found page table\n"); *_physicalPageTable = (page_table_entry_group *)map->physical_address; keepRange = false; @@ -272,7 +285,7 @@ } if ((addr_t)map->physical_address <= 0x100 && (addr_t)map->physical_address + map->length >= 0x1000) { - puts("found exception handlers!"); + dprintf("found exception handlers\n"); *_exceptionHandlers = map->virtual_address; keepRange = false; // we keep it explicitely anyway @@ -284,7 +297,8 @@ if (insert_virtual_allocated_range((addr_t)map->virtual_address, map->length) != B_OK) { - printf("cannot map virtual allocated range (num ranges = %lu)!\n", + dprintf("cannot map virtual allocated range " + "(num ranges = %" B_PRIu32 ")!\n", gKernelArgs.num_virtual_allocated_ranges); } @@ -298,20 +312,21 @@ if (keepRange) { if (insert_virtual_range_to_keep(map->virtual_address, map->length) != B_OK) { - printf("cannot map virtual range to keep (num ranges = %lu)!\n", + dprintf("cannot map virtual range to keep " + "(num ranges = %" B_PRIu32 ")\n", gKernelArgs.num_virtual_allocated_ranges); } } total += map->length; } - //printf("total mapped: %lu\n", total); + dprintf("total mapped: %" B_PRIu32 "\n", total); // remove the boot loader code from the virtual ranges to keep in the // kernel if (remove_virtual_range_to_keep(&__text_begin, &_end - &__text_begin) != B_OK) { - printf("find_allocated_ranges(): Failed to remove boot loader range " + dprintf("find_allocated_ranges(): Failed to remove boot loader range " "from virtual ranges to keep.\n"); } @@ -431,7 +446,7 @@ // fail if the exact address was requested, but is not free if (exactAddress && _virtualAddress && virtualAddress != _virtualAddress) { dprintf("arch_mmu_allocate(): exact address requested, but virtual " - "range (base: %p, size: %lu) is not free.\n", + "range (base: %p, size: %" B_PRIuSIZE ") is not free.\n", _virtualAddress, size); return NULL; } @@ -443,14 +458,14 @@ void *physicalAddress = find_free_physical_range(size); if (physicalAddress == PHYSINVAL) { - dprintf("arch_mmu_allocate(base: %p, size: %lu) no free physical " - "address\n", virtualAddress, size); + dprintf("arch_mmu_allocate(base: %p, size: %" B_PRIuSIZE ") " + "no free physical address\n", virtualAddress, size); return NULL; } // everything went fine, so lets mark the space as used. - printf("mmu_alloc: va %p, pa %p, size %u\n", virtualAddress, + dprintf("mmu_alloc: va %p, pa %p, size %" B_PRIuSIZE "\n", virtualAddress, physicalAddress, size); insert_virtual_allocated_range((addr_t)virtualAddress, size); insert_physical_allocated_range((addr_t)physicalAddress, size); @@ -618,7 +633,7 @@ callback(struct of_arguments *args) { const char *name = args->name; -printf("CALLBACK: %s\n", name); + TRACE("OF CALLBACK: %s\n", name); if (!strcmp(name, "map")) return map_callback(args); @@ -642,10 +657,10 @@ void *oldCallback = NULL; if (of_call_client_function("set-callback", 1, 1, &callback, &oldCallback) == OF_FAILED) { - puts("set-callback failed!"); + dprintf("Error: OpenFirmware set-callback failed\n"); return B_ERROR; } - //printf("old callback = %p\n", oldCallback); + TRACE("old callback = %p; new callback = %p\n", oldCallback, callback); return B_OK; } @@ -658,10 +673,10 @@ size_t total; if (find_physical_memory_ranges(total) != B_OK) { - puts("could not find physical memory ranges!"); + dprintf("Error: could not find physical memory ranges!\n"); return B_ERROR; } - printf("total physical memory = %u MB\n", total / (1024*1024)); + dprintf("total physical memory = %" B_PRId32 "MB\n", total / (1024 * 1024)); // get OpenFirmware's current page table @@ -679,23 +694,25 @@ // can we just keep the page table? size_t suggestedTableSize = suggested_page_table_size(total); - printf("suggested page table size = %u\n", suggestedTableSize); + dprintf("suggested page table size = %" B_PRIuSIZE "\n", + suggestedTableSize); if (tableSize < suggestedTableSize) { // nah, we need a new one! - printf("need new page table, size = %u!\n", suggestedTableSize); + dprintf("need new page table, size = %" B_PRIuSIZE "!\n", + suggestedTableSize); table = (page_table_entry_group *)of_claim(NULL, suggestedTableSize, suggestedTableSize); // KERNEL_BASE would be better as virtual address, but // at least with Apple's OpenFirmware, it makes no // difference - we will have to remap it later if (table == (void *)OF_FAILED) { - panic("Could not allocate new page table (size = %ld)!!\n", - suggestedTableSize); + panic("Could not allocate new page table " + "(size = %" B_PRIuSIZE ")!!\n", suggestedTableSize); return B_NO_MEMORY; } if (table == NULL) { // work-around for the broken Pegasos OpenFirmware - puts("broken OpenFirmware detected (claim doesn't work)."); + dprintf("broken OpenFirmware detected (claim doesn't work)\n"); realMode = true; addr_t tableBase = 0; @@ -706,7 +723,7 @@ table = (page_table_entry_group *)tableBase; } - printf("new table at: %p\n", table); + dprintf("new table at: %p\n", table); sPageTable = table; tableSize = suggestedTableSize; } else { @@ -723,9 +740,9 @@ // turn off address translation via the page table/segment mechanism, // identity map the first 256 MB (where our code/data reside) - printf("MSR: %p\n", (void *)get_msr()); + dprintf("MSR: %p\n", (void *)get_msr()); -#if 0 + #if 0 block_address_translation bat; bat.length = BAT_LENGTH_256MB; @@ -736,7 +753,7 @@ set_ibat0(&bat); set_dbat0(&bat); isync(); -#endif + #endif // initialize segment descriptors, but don't set the registers // until we're about to take over the page table - we're mapping @@ -752,8 +769,8 @@ void *exceptionHandlers = (void *)-1; if (find_allocated_ranges(oldTable, table, &physicalTable, &exceptionHandlers) != B_OK) { - puts("find_allocated_ranges() failed!"); - //return B_ERROR; + dprintf("Error: find_allocated_ranges() failed\n"); + return B_ERROR; } #if 0 @@ -766,14 +783,18 @@ #endif if (physicalTable == NULL) { - puts("arch_mmu_init(): Didn't find physical address of page table!"); + dprintf("%s: Didn't find physical address of page table\n", __func__); if (!realMode) return B_ERROR; // Pegasos work-around - //map_range((void *)realBase, (void *)realBase, realSize * 2, PAGE_READ_WRITE); - //map_range((void *)(total - realSize), (void *)(total - realSize), realSize, PAGE_READ_WRITE); - //map_range((void *)table, (void *)table, tableSize, PAGE_READ_WRITE); + #if 0 + map_range((void *)realBase, (void *)realBase, + realSize * 2, PAGE_READ_WRITE); + map_range((void *)(total - realSize), (void *)(total - realSize), + realSize, PAGE_READ_WRITE); + map_range((void *)table, (void *)table, tableSize, PAGE_READ_WRITE); + #endif insert_physical_allocated_range(realBase, realSize * 2); insert_virtual_allocated_range(realBase, realSize * 2); insert_physical_allocated_range(total - realSize, realSize); @@ -790,7 +811,7 @@ if (exceptionHandlers == (void *)-1) { // TODO: create mapping for the exception handlers - puts("no mapping for the exception handlers!"); + dprintf("Error: no mapping for the exception handlers!\n"); } // Set the Open Firmware memory callback. From now on the Open Firmware @@ -820,9 +841,12 @@ // set kernel args - printf("virt_allocated: %lu\n", gKernelArgs.num_virtual_allocated_ranges); - printf("phys_allocated: %lu\n", gKernelArgs.num_physical_allocated_ranges); - printf("phys_memory: %lu\n", gKernelArgs.num_physical_memory_ranges); + dprintf("virt_allocated: %" B_PRIu32 "\n", + gKernelArgs.num_virtual_allocated_ranges); + dprintf("phys_allocated: %" B_PRIu32 "\n", + gKernelArgs.num_physical_allocated_ranges); + dprintf("phys_memory: %" B_PRIu32 "\n", + gKernelArgs.num_physical_memory_ranges); gKernelArgs.arch_args.page_table.start = (addr_t)sPageTable; gKernelArgs.arch_args.page_table.size = tableSize;