From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:39640) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKrop-0002Pu-W3 for qemu-devel@nongnu.org; Wed, 27 Mar 2013 10:59:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UKrol-0005Pv-Oq for qemu-devel@nongnu.org; Wed, 27 Mar 2013 10:59:15 -0400 Message-ID: <5153093D.6040802@adacore.com> Date: Wed, 27 Mar 2013 15:59:09 +0100 From: Fabien Chouteau MIME-Version: 1.0 References: <1364392235-6193-1-git-send-email-chouteau@adacore.com> <4427FBE0-BA0D-4BFD-9D7C-F1406DF5239A@suse.de> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH] PPC: init_excp_7x0: fix hreset entry point. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org On 03/27/2013 03:04 PM, Alexander Graf wrote: > On 27.03.2013, at 15:00, Alexander Graf wrote: >> On 27.03.2013, at 14:54, Alexander Graf wrote: >>> On 27.03.2013, at 14:50, Fabien Chouteau wrote: >>>> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c >>>> index 781170f..a5bae1e 100644 >>>> --- a/target-ppc/translate_init.c >>>> +++ b/target-ppc/translate_init.c >>>> @@ -2885,7 +2885,7 @@ static void init_excp_7x0 (CPUPPCState *env) >>>> env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; >>>> env->hreset_excp_prefix = 0x00000000UL; >>>> /* Hardware reset vector */ >>>> - env->hreset_vector = 0xFFFFFFFCUL; >>>> + env->hreset_vector = 0xFFF00100UL; >>> >>> As you properly explained above, the reset vector is 0x100 according to the spec. However, hreset_excp_prefix is 0x0. How do we end up getting to 0xfff00100 here? >> >> According to 7xx_um.pdf (740 / 750 User manual), the IP bit in MSR (bit 25 in ppc notion) controls whether excp_prefix is 0xfff00000 or 0x00000000. The spec also says: >> >> When either HRESET is negated or SRESET transitions to asserted, the processor attempts to fetch code from the system reset exception vector. The vector is located at offset 0x00100 from the exception prefix (all zeros or ones, depending on the setting of the exception prefix bit in the machine state register (MSR[IP]). The MSR[IP] bit is set for HRESET. >> >> So on reset, MSR[IP] = 1. That means that hreset_excp_prefix is also wrong here. >> >> Please add the respective logic that sets hreset_excp_prefix according to MSR[IP] on 740 / 750, otherwise whatever you're trying to execute will break as soon as it gets its first real exception :). > It's actually already implemented (helper_regs.h:96). The question is: what is the value of MSR[IP] at reset? Also, we might want to call hreg_store_msr() in ppc_cpu_reset() instead of just setting the value env->msr, this way we don't need hreset_excp_prefix as the MSR[IP] will be used to set the value of env->excp_prefix. Something like: +++ b/target-ppc/translate_init.c @@ -8182,19 +8182,23 @@ static void ppc_cpu_reset(CPUState *s) msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */ msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */ msr |= (target_ulong)1 << MSR_PR; -#else - env->excp_prefix = env->hreset_excp_prefix; - env->nip = env->hreset_vector | env->excp_prefix; - if (env->mmu_model != POWERPC_MMU_REAL) { - ppc_tlb_invalidate_all(env); - } #endif - env->msr = msr & env->msr_mask; + #if defined(TARGET_PPC64) if (env->mmu_model & POWERPC_MMU_64) { env->msr |= (1ULL << MSR_SF); } #endif + + hreg_store_msr(env, msr, 1); + +#if !defined(CONFIG_USER_ONLY) + env->nip = env->hreset_vector | env->excp_prefix; + if (env->mmu_model != POWERPC_MMU_REAL) { + ppc_tlb_invalidate_all(env); + } +#endif + hreg_compute_hflags(env); env->reserve_addr = (target_ulong)-1ULL; /* Be sure no exception or interrupt is pending */ > While at it, on exception delivery ILE, ME and IP do not get modified according to the spec. Please verify that we don't accidentally set them to 0 when we deliver an interrupt. They seems to be preserved. > Except for machine check interrupts, where MSR.ME = 0. This is done, excp_helper.c:148. > > Also, MSR.LE becomes the previous value of MSR.ILE. Not that we'd implement LE mode properly ;). > This is also already done, excp_helper.c:615. Thanks, -- Fabien Chouteau