qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH RFC] target-ppc: Correctly handle translation ad


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH RFC] target-ppc: Correctly handle translation address when bus unit ID = 0x07F
Date: Mon, 13 Jun 2011 15:31:44 +0200

On 13.06.2011, at 12:13, Andreas Färber wrote:

> From: Hervé Poussineau <address@hidden>
> 
> In that case, we want to access memory space instead of I/O controller
> interface address space.
> 
> Signed-off-by: Hervé Poussineau <address@hidden>
> 
> Simplify by avoiding reindentation of existing code.
> 
> Cc: Alexander Graf <address@hidden>
> Signed-off-by: Andreas Färber <address@hidden>
> ---
> Hello Alex,
> 
> This patch fixes a hang when booting 40p, please review.
> 
> The only vaguely related section in Power ISA 2.06B I could find was the
> Programming Note on p. 764 (5.7.1).

The 601 is not 2.06 compliant, so you need to dig up earlier manuals. Google 
revealed this for the 601: 

  http://www.freescale.com/files/32bit/doc/user_guide/MPC601UM.pdf

> 6xx_pem.pdf identifies the masked SR bits as Bus unit ID, says nothing
> about the 0x07f value though - might that be machine-specific?
> 
> Andreas
> 
> target-ppc/helper.c |   10 ++++++++++
> 1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.c b/target-ppc/helper.c
> index cf2a368..cdf8d15 100644
> --- a/target-ppc/helper.c
> +++ b/target-ppc/helper.c
> @@ -949,8 +949,18 @@ static inline int get_segment(CPUState *env, mmu_ctx_t 
> *ctx,
>             ret = -3;
>         }
>     } else {
> +        target_ulong sr;
>         LOG_MMU("direct store...\n");

This is direct store, so you're in T=1

>         /* Direct-store segment : absolutely *BUGGY* for now */
> +
> +        sr = env->sr[eaddr >> 28];
> +        if ((sr & 0x1FF00000) >> 20 == 0x07f) {

This is the BUID, yes.
According to page 70 in the manual I mentioned above, the following passage 
applies:


Memory-forced I/O controller interface (BUID = x'07F')—Memory-forced I/O 
controller interface operations access memory space. They do not use the 
extensions to the memory protocol described for I/O controller interface 
accesses, and they bypass the page- and block-translation and protection 
mechanisms. The physical address is found by concatenating bits 28–31 of the 
respective segment register with bits 4–31 of the effective address. This 
address is marked as noncacheable, write- through, and global.
Because memory-forced I/O controller interface accesses address memory space, 
they are subject to the same coherency control as other memory reference 
operations. More generally, accesses to memory-forced I/O controller interface 
segments are considered to be cache-inhibited, write-through and 
memory-coherent operations with respect to the 601 cache and bus interface.


Since we don't implement any cache ourselves and MMIO is simply handled 
immediately, I don't think there's anything special that needs to be done, 
except for mapping it as EA=RA.

> +            /* Memory forced */
> +            ctx->raddr = ((sr & 0xF) << 28) | (eaddr & 0x0FFFFFFF);

This is exactly the same as ctx->raddr = eaddr, no?

So yes, in general the patch looks fine. Please add some comments to document 
what's going on though. I don't think everyone who reads the code wants to dig 
the out from the manuals :).



Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]