Author: afaerber Date: Sun Nov 21 11:36:35 2010 New Revision: 963 URL: http://tracker.coreboot.org/trac/openbios/changeset/963
Log: ppc: Use mtmsrd on ppc64
On ppc64 the mtmsr instruction only sets the low 32 bits of the MSR. mtmsrd must be used to set the high bits such as Sixty-Four Bit Mode as well.
v2: * Introduce MTMSRD macro as seen on Linux, suggested by Alex. * Introduce inline functions {mfmsr,mtmsr} as suggested by Alex.
Signed-off-by: Alexander Graf agraf@suse.de Signed-off-by: Andreas Färber andreas.faerber@web.de
Modified: trunk/openbios-devel/arch/ppc/qemu/ofmem.c trunk/openbios-devel/include/arch/ppc/asmdefs.h trunk/openbios-devel/include/arch/ppc/processor.h
Modified: trunk/openbios-devel/arch/ppc/qemu/ofmem.c ============================================================================== --- trunk/openbios-devel/arch/ppc/qemu/ofmem.c Sat Nov 20 22:14:59 2010 (r962) +++ trunk/openbios-devel/arch/ppc/qemu/ofmem.c Sun Nov 21 11:36:35 2010 (r963) @@ -387,7 +387,7 @@ setup_mmu( unsigned long ramsize ) { ofmem_t *ofmem; - unsigned long sdr1, sr_base, msr; + unsigned long sdr1, sr_base; unsigned long hash_base; unsigned long hash_mask = 0xfff00000; /* alignment for ppc64 */ int i; @@ -415,9 +415,7 @@
/* Enable MMU */
- asm volatile("mfmsr %0" : "=r" (msr) : ); - msr |= MSR_IR | MSR_DR; - asm volatile("mtmsr %0" :: "r" (msr) ); + mtmsr(mfmsr() | MSR_IR | MSR_DR); }
void
Modified: trunk/openbios-devel/include/arch/ppc/asmdefs.h ============================================================================== --- trunk/openbios-devel/include/arch/ppc/asmdefs.h Sat Nov 20 22:14:59 2010 (r962) +++ trunk/openbios-devel/include/arch/ppc/asmdefs.h Sun Nov 21 11:36:35 2010 (r963) @@ -90,8 +90,10 @@
#ifdef __powerpc64__ #define RFI rfid +#define MTMSRD(r) mtmsrd r #else #define RFI rfi +#define MTMSRD(r) mtmsr r #endif
#ifndef __darwin__
Modified: trunk/openbios-devel/include/arch/ppc/processor.h ============================================================================== --- trunk/openbios-devel/include/arch/ppc/processor.h Sat Nov 20 22:14:59 2010 (r962) +++ trunk/openbios-devel/include/arch/ppc/processor.h Sun Nov 21 11:36:35 2010 (r963) @@ -403,8 +403,28 @@
/* C helpers */
+#ifndef __ASSEMBLER__ + #define __stringify_1(x) #x #define __stringify(x) __stringify_1(x) #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v))
+static inline unsigned long mfmsr(void) +{ + unsigned long msr; + asm volatile("mfmsr %0" : "=r" (msr)); + return msr; +} + +static inline void mtmsr(unsigned long msr) +{ +#ifdef __powerpc64__ + asm volatile("mtmsrd %0" :: "r" (msr)); +#else + asm volatile("mtmsr %0" :: "r" (msr)); +#endif +} + +#endif /* !__ASSEMBLER__ */ + #endif /* _H_PROCESSOR */