[OpenBIOS] ppc64 MMU issues (was: ppc(64) debugging)

Andreas Färber andreas.faerber at web.de
Sun Nov 7 23:13:39 CET 2010

Am 01.11.2010 um 17:36 schrieb Andreas Färber:

> Latest state with local patches is that hell breaks loose once the  
> MMU is set up. I get a 0x400 (ISI) exception and when the bctrl to  
> isi_exception() is executed, we end up at trap_error, where it  
> branches to unexpected_excep() and tries to printk() to the serial  
> port that's not yet set up. I'll put a few patches together.

Since r945 everything except for the trampoline issue should be in SVN.

I've made no more progress throughout the week though:

Directly after we set the MSR_IR|MSR_DR bits in the MSR (arch/ppc/qemu/ 
ofmem.c:setup_mmu), we get an ISI exception and end up in arch/ppc/ 
qemu/start.S:vector__0x400 (the 0xfffxxxxx one). We proceed up to the  
bctrl which should take us to arch/ppc/qemu/ofmem.c:isi_exception, but  
then get a 0x700 program exception. The value in ctr looks sensible,  
it's some 0xfffxxxxx address.

i) I read that mtsrin were not allowed in 64-bit mode and its results  
unpredictable, so I tried switching MSR_SF off before and back on  
after the loop, without luck.

ii) If I exit the setup_mmu() function without turning the MMU on, we  
proceed to arch/ppc/qemu/init.c:entry() but are unsuccessful reading  
the magic fw_cfg signature. Stepping through the code it seemed as if  
some variable assignments like in drivers/fw_cfg.c:fw_cfg_init() were  
having no effect - could that be due to OpenBIOS code execution  
happening in ROM rather than ea_to_phys()-mapped to RAM? (i.e., write- 
only storage?:)) Or would this be some memory caching issue for the  
fw_cfg ports?

iii) Before turning on the MMU, I tried implementing the early-mapping  
of pages by calling hash_page() from ofmem_arch_early_map_pages() and  
calling ofmem_map() for the ROM-to-RAM translation and for identity- 
mapping the code. This leads to a hang in libopenbios/ 
ofmem_common.c:ofmem_update_memory_available() in a code path (a  
printk in ofmem_realloc()) that would normally only be taken if  
libopenbios/ofmem_common.c:s_phandle_memory were non-zero, at a point  
where it should still be zero.

Any clue why ppc works but ppc64 doesn't?


More information about the OpenBIOS mailing list