A recent attempt to restrict the use of rfi on 64bit cpus in qemu broke 32bit OpenBIOS when run under a 970.
This patches memory to replace rfi instructions with rfid in the vector code.
Signed-off-by: Cédric Le Goater clg@kaod.org Suggested-by: Alexander Graf agraf@suse.de ---
Tested on qemu.
arch/ppc/qemu/ofmem.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
Index: openbios.git/arch/ppc/qemu/ofmem.c =================================================================== --- openbios.git.orig/arch/ppc/qemu/ofmem.c +++ openbios.git/arch/ppc/qemu/ofmem.c @@ -478,6 +478,26 @@ isi_exception(void) hash_page(nip, phys, mode); }
+/* When running on ppc64, we cannot use rfi anymore. Let's patch the + * vectors to use rfid instead. + */ +#define RFI 0x4c000064 +#define RFID 0x4c000024 + +static void patch_rfi(char *from, uint32_t len) +{ + int i; + + for (i = 0; i < len; i += 4) { + uint32_t* addr = (uint32_t *) (from + i); + if (*addr == RFI) + *addr = RFID; + } + flush_icache_range(from, from + len); +} + +extern char __vectors[]; +extern char __vectors_end[];
/************************************************************************/ /* init / cleanup */ @@ -532,6 +552,10 @@ setup_mmu(unsigned long ramsize)
memcpy((void *)get_rom_base(), (void *)OF_CODE_START, OF_CODE_SIZE);
+ if (is_ppc64()) { + patch_rfi(0x0, (uint32_t) __vectors_end - (uint32_t) __vectors); + } + /* Enable MMU */
mtmsr(mfmsr() | MSR_IR | MSR_DR);