Commit 4e80effcf961b0ce3b794d239225aacb7f48f38c

Authored by j_mayer
1 parent 7a3a6927

Implement exception prefix feature for PowerPC 601.

Fix PowerPC 601 hardware reset vector.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3352 c046a42c-6fe2-441c-8c8c-71466251a162
target-ppc/helper.c
@@ -1996,16 +1996,17 @@ int do_store_msr (CPUPPCState *env, target_ulong value) @@ -1996,16 +1996,17 @@ int do_store_msr (CPUPPCState *env, target_ulong value)
1996 tlb_flush(env, 1); 1996 tlb_flush(env, 1);
1997 env->interrupt_request |= CPU_INTERRUPT_EXITTB; 1997 env->interrupt_request |= CPU_INTERRUPT_EXITTB;
1998 } 1998 }
1999 -#if 0  
2000 - if (loglevel != 0) {  
2001 - fprintf(logfile, "%s: T0 %08lx\n", __func__, value);  
2002 - }  
2003 -#endif 1999 +#if !defined (CONFIG_USER_ONLY)
2004 if (unlikely((env->flags & POWERPC_FLAG_TGPR) && 2000 if (unlikely((env->flags & POWERPC_FLAG_TGPR) &&
2005 ((value >> MSR_TGPR) & 1) != msr_tgpr)) { 2001 ((value >> MSR_TGPR) & 1) != msr_tgpr)) {
2006 /* Swap temporary saved registers with GPRs */ 2002 /* Swap temporary saved registers with GPRs */
2007 swap_gpr_tgpr(env); 2003 swap_gpr_tgpr(env);
2008 } 2004 }
  2005 + if (unlikely((value >> MSR_EP) & 1) != msr_ep) {
  2006 + /* Change the exception prefix on PowerPC 601 */
  2007 + env->excp_prefix = ((value >> MSR_EP) & 1) * 0xFFF00000;
  2008 + }
  2009 +#endif
2009 #if defined (TARGET_PPC64) 2010 #if defined (TARGET_PPC64)
2010 msr_sf = (value >> MSR_SF) & 1; 2011 msr_sf = (value >> MSR_SF) & 1;
2011 msr_isf = (value >> MSR_ISF) & 1; 2012 msr_isf = (value >> MSR_ISF) & 1;
@@ -2899,7 +2900,7 @@ void cpu_ppc_reset (void *opaque) @@ -2899,7 +2900,7 @@ void cpu_ppc_reset (void *opaque)
2899 #endif 2900 #endif
2900 msr_ap = 0; /* TO BE CHECKED */ 2901 msr_ap = 0; /* TO BE CHECKED */
2901 msr_sa = 0; /* TO BE CHECKED */ 2902 msr_sa = 0; /* TO BE CHECKED */
2902 - msr_ip = 0; /* TO BE CHECKED */ 2903 + msr_ep = 1;
2903 #if defined (DO_SINGLE_STEP) && 0 2904 #if defined (DO_SINGLE_STEP) && 0
2904 /* Single step trace mode */ 2905 /* Single step trace mode */
2905 msr_se = 1; 2906 msr_se = 1;
target-ppc/translate_init.c
@@ -2322,7 +2322,7 @@ static void init_excp_601 (CPUPPCState *env) @@ -2322,7 +2322,7 @@ static void init_excp_601 (CPUPPCState *env)
2322 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000; 2322 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000;
2323 env->excp_prefix = 0xFFF00000; 2323 env->excp_prefix = 0xFFF00000;
2324 /* Hardware reset vector */ 2324 /* Hardware reset vector */
2325 - env->hreset_vector = 0xFFFFFFFCUL; 2325 + env->hreset_vector = 0x00000100UL;
2326 #endif 2326 #endif
2327 } 2327 }
2328 2328