qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2] ppc: initialize GPRs as per epapr


From: Bhushan Bharat-R65777
Subject: Re: [Qemu-devel] [PATCH v2] ppc: initialize GPRs as per epapr
Date: Mon, 29 Apr 2013 19:10:14 +0000


> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Monday, April 29, 2013 11:21 PM
> To: Bhushan Bharat-R65777
> Cc: address@hidden; address@hidden; address@hidden; Yoder Stuart-
> B08248; address@hidden; Bhushan Bharat-R65777; Bhushan Bharat-
> R65777
> Subject: Re: [PATCH v2] ppc: initialize GPRs as per epapr
> 
> On 04/29/2013 09:40:56 AM, Bharat Bhushan wrote:
> > ePAPR defines the initial values of cpu registers.
> > This patch initialize the GPRs as per ePAPR specification.
> >
> > This resolves the issue of guest reboot/reset (guest hang on reboot).
> >
> > Signed-off-by: Bharat Bhushan <address@hidden>
> > ---
> > v1-->v2
> >  - Dynemic seting of initial map size in gpr[7]
> >  - For this the tlb size calculation is moved into a function.
> >
> >  hw/ppc/e500.c |   29 ++++++++++++++++++++++++++---
> >  1 files changed, 26 insertions(+), 3 deletions(-)
> >
> > diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index c1bdb6b..decd86c
> > 100644
> > --- a/hw/ppc/e500.c
> > +++ b/hw/ppc/e500.c
> > @@ -37,6 +37,7 @@
> >  #include "qemu/host-utils.h"
> >  #include "hw/pci-host/ppce500.h"
> >
> > +#define EPAPR_MAGIC                (0x45504150)
> >  #define BINARY_DEVICE_TREE_FILE    "mpc8544ds.dtb"
> >  #define UIMAGE_LOAD_BASE           0
> >  #define DTC_LOAD_PAD               0x1800000
> > @@ -393,11 +394,10 @@ static inline hwaddr
> > booke206_page_size_to_tlb(uint64_t size)
> >      return 63 - clz64(size >> 10);
> >  }
> >
> > -static void mmubooke_create_initial_mapping(CPUPPCState *env)
> > +static int booke206_initial_map_tsize(CPUPPCState *env)
> >  {
> >      struct boot_info *bi = env->load_info;
> > -    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
> > -    hwaddr size, dt_end;
> > +    hwaddr dt_end;
> >      int ps;
> >
> >      /* Our initial TLB entry needs to cover everything from 0 to @@
> > -408,6 +408,23 @@ static void
> > mmubooke_create_initial_mapping(CPUPPCState *env)
> >          /* e500v2 can only do even TLB size bits */
> >          ps++;
> >      }
> > +    return ps;
> > +}
> > +static uint64_t mmubooke_initial_mapsize(CPUPPCState *env)
> 
> Please leave a blank line after each of those } lines.
> 
> You change the function name to look like it's simply returning
> information, but it still creates the TLB entry as far as I can see.

This is just returning the tlb size . not creating the tlb entry.



> Then you go calling it multiple times (why?).  This may not be harmful, but it
> is ugly.
> 
> > +{
> > +    int tsize;
> > +
> > +    tsize = booke206_initial_map_tsize(env);
> > +    return (1ULL << 10 << tsize);
> > +}
> 
> What value does this wrapper have?

This returning the size on initial tlb entry in bytes.

>  The caller needs both the "tsize"
> and the size in bytes, and you only call this wrapper once, so let the caller 
> do
> the conversion instead.

Caller does not need to know both. It only need to know the size in bytes.

I think git diff make a mess of this. just trying to put the code for clarity 

----
static int booke206_initial_map_tsize(CPUPPCState *env)
{
    struct boot_info *bi = env->load_info;
    hwaddr dt_end;
    int ps;

    /* Our initial TLB entry needs to cover everything from 0 to
       the device tree top */
    dt_end = bi->dt_base + bi->dt_size;
    ps = booke206_page_size_to_tlb(dt_end) + 1;
    if (ps & 1) {
        /* e500v2 can only do even TLB size bits */
        ps++;
    }
    return ps;
}
static uint64_t mmubooke_initial_mapsize(CPUPPCState *env)
{
    int tsize;

    tsize = booke206_initial_map_tsize(env);
    return (1ULL << 10 << tsize);
}

static void mmubooke_create_initial_mapping(CPUPPCState *env)
{
    ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
    hwaddr size;
    int ps;

    ps = booke206_initial_map_tsize(env);
    size = (ps << MAS1_TSIZE_SHIFT);
    tlb->mas1 = MAS1_VALID | size;
    tlb->mas2 = 0;
    tlb->mas7_3 = 0;
    tlb->mas7_3 |= MAS3_UR | MAS3_UW | MAS3_UX | MAS3_SR | MAS3_SW | MAS3_SX;

    env->tlb_dirty = true;
}

--------------

Thanks
-Bharat
> 
> -Scott




reply via email to

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