Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-16 Thread David Gibson
On Fri, Feb 15, 2013 at 08:59:35AM -0200, Erlon Cruz wrote:
 From: Erlon Cruz erlon.c...@br.flextronics.com
 
 This h_call is useful for DLPAR in future amongst other things. Given an index
 it fetches the corresponding PTE stored in the htab.
 
 Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
 ---
  hw/spapr_hcall.c |   34 ++
  1 file changed, 34 insertions(+)
 
 diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
 index 2889742..1065277 100644
 --- a/hw/spapr_hcall.c
 +++ b/hw/spapr_hcall.c
 @@ -323,6 +323,39 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
 sPAPREnvironment *spapr,
  return H_SUCCESS;
  }
  
 +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
 +target_ulong opcode, target_ulong *args)
 +{
 +CPUPPCState *env = cpu-env;
 +target_ulong flags = args[0];
 +target_ulong pte_index = args[1];
 +target_ulong v[4], r[4];
 +uint8_t *hpte;
 +int i, ridx, n_entries = 1;
 +
 +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
 +return H_PARAMETER;
 +}
 +
 +if (flags  H_READ_4) {
 +/* Clear the two low order bits */
 +pte_index = ~(3ULL);
 +n_entries = 4;
 +}
 +
 +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
 +
 +for (i = 0, ridx = 0; i  n_entries; i++) {
 +v[i] = ldq_p(hpte);
 +r[i] = ldq_p(hpte + (HASH_PTE_SIZE_64/2));

There's no need for the v and r arrays.  You can just need temporaries
for one entry as you store them one-by-one into args.

Otherwise looks good.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: Digital signature


Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-16 Thread Erlon Cruz
I left them only to make it easy to read and keep the same sintax used
in the other functions.

On Sat, Feb 16, 2013 at 9:46 PM, David Gibson d...@au1.ibm.com wrote:
 On Fri, Feb 15, 2013 at 08:59:35AM -0200, Erlon Cruz wrote:
 From: Erlon Cruz erlon.c...@br.flextronics.com

 This h_call is useful for DLPAR in future amongst other things. Given an 
 index
 it fetches the corresponding PTE stored in the htab.

 Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
 ---
  hw/spapr_hcall.c |   34 ++
  1 file changed, 34 insertions(+)

 diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
 index 2889742..1065277 100644
 --- a/hw/spapr_hcall.c
 +++ b/hw/spapr_hcall.c
 @@ -323,6 +323,39 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
 sPAPREnvironment *spapr,
  return H_SUCCESS;
  }

 +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
 +target_ulong opcode, target_ulong *args)
 +{
 +CPUPPCState *env = cpu-env;
 +target_ulong flags = args[0];
 +target_ulong pte_index = args[1];
 +target_ulong v[4], r[4];
 +uint8_t *hpte;
 +int i, ridx, n_entries = 1;
 +
 +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
 +return H_PARAMETER;
 +}
 +
 +if (flags  H_READ_4) {
 +/* Clear the two low order bits */
 +pte_index = ~(3ULL);
 +n_entries = 4;
 +}
 +
 +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
 +
 +for (i = 0, ridx = 0; i  n_entries; i++) {
 +v[i] = ldq_p(hpte);
 +r[i] = ldq_p(hpte + (HASH_PTE_SIZE_64/2));

 There's no need for the v and r arrays.  You can just need temporaries
 for one entry as you store them one-by-one into args.

 Otherwise looks good.

 --
 David Gibson| I'll have my music baroque, and my code
 david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
 | _way_ _around_!
 http://www.ozlabs.org/~dgibson



Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-16 Thread David Gibson
On Sat, Feb 16, 2013 at 11:42:35PM -0300, Erlon Cruz wrote:
 I left them only to make it easy to read and keep the same sintax used
 in the other functions.

I don't see how having the arrays helps either of those goals.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: Digital signature


Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-14 Thread Erlon Cruz
On Sun, Feb 10, 2013 at 10:10 PM, David Gibson
da...@gibson.dropbear.id.au wrote:

 On Thu, Feb 07, 2013 at 09:28:20AM -0200, Erlon Cruz wrote:
  From: Erlon Cruz erlon.c...@br.flextronics.com
 
  This h_call is useful for DLPAR in future amongst other things. Given an 
  index
  it fetches the corresponding PTE stored in the htab.

 Nice.  It would be good to add in this little bit of PAPR compliance.

 Couple of small nits in the implementation:

 
  Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
  ---
   hw/spapr_hcall.c |   58 
  ++
   1 file changed, 58 insertions(+)
 
  diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
  index 2889742..5ba07e5 100644
  --- a/hw/spapr_hcall.c
  +++ b/hw/spapr_hcall.c
  @@ -323,6 +323,63 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
  sPAPREnvironment *spapr,
   return H_SUCCESS;
   }
 
  +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
  +target_ulong opcode, target_ulong *args)
  +{
  +CPUPPCState *env = cpu-env;
  +target_ulong flags = args[0];
  +target_ulong pte_index = args[1];
  +uint8_t *hpte;
  +
  +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
  +return H_PARAMETER;
  +}
  +
  +if (!(flags  H_READ_4)) {

 It would be nice to combine the H_READ_4 and !H_READ_4 paths together,
 since except for the masking and stopping sooner the !H_READ_4 path is
 just like the H_READ_4 path.

Ok.



  +target_ulong v, r;
  +target_ulong *pteh = args[0];
  +target_ulong *ptel = args[1];
  +
  +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
  +
  +v = ldq_p(hpte);
  +r = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
  +
  +if (flags  H_R_XLATE) {
  +/* FIXME:  include a valid logical page num in the pte */

 This comment is misleading.  Since you do copy out both words of the
 hpte, and qemu stores the external_htab in terms of guest physical (==
 logical) addresses, in fact you're *always* supplying a valid logical
 page num.  So you've already correctly implemented the flag as a
 no-op.

 I believe that flag is included for the benefit of a true hypervisor,
 where the native htab would be stored as true physical addresses, and
 it might be expensive for the hypervisor to recompute the logical
 address.


Ok, then I think we can just skip this checking.

 That said, I actually wrote such helpers about 15 minutes ago as part
 of my MMU cleanup series.

 Should I wait for the helpers to send It again?


 --
 David Gibson| I'll have my music baroque, and my code
 david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
 | _way_ _around_!
 http://www.ozlabs.org/~dgibson



Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-14 Thread David Gibson
On Thu, Feb 14, 2013 at 10:44:34AM -0200, Erlon Cruz wrote:
 On Sun, Feb 10, 2013 at 10:10 PM, David Gibson
 da...@gibson.dropbear.id.au wrote:
 
  On Thu, Feb 07, 2013 at 09:28:20AM -0200, Erlon Cruz wrote:
   From: Erlon Cruz erlon.c...@br.flextronics.com
  
   This h_call is useful for DLPAR in future amongst other things. Given an 
   index
   it fetches the corresponding PTE stored in the htab.
 
  Nice.  It would be good to add in this little bit of PAPR compliance.
 
  Couple of small nits in the implementation:
 
  
   Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
   ---
hw/spapr_hcall.c |   58 
   ++
1 file changed, 58 insertions(+)
  
   diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
   index 2889742..5ba07e5 100644
   --- a/hw/spapr_hcall.c
   +++ b/hw/spapr_hcall.c
   @@ -323,6 +323,63 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
   sPAPREnvironment *spapr,
return H_SUCCESS;
}
  
   +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
   +target_ulong opcode, target_ulong *args)
   +{
   +CPUPPCState *env = cpu-env;
   +target_ulong flags = args[0];
   +target_ulong pte_index = args[1];
   +uint8_t *hpte;
   +
   +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
   +return H_PARAMETER;
   +}
   +
   +if (!(flags  H_READ_4)) {
 
  It would be nice to combine the H_READ_4 and !H_READ_4 paths together,
  since except for the masking and stopping sooner the !H_READ_4 path is
  just like the H_READ_4 path.
 
 Ok.
 
 
 
   +target_ulong v, r;
   +target_ulong *pteh = args[0];
   +target_ulong *ptel = args[1];
   +
   +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
   +
   +v = ldq_p(hpte);
   +r = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
   +
   +if (flags  H_R_XLATE) {
   +/* FIXME:  include a valid logical page num in the pte */
 
  This comment is misleading.  Since you do copy out both words of the
  hpte, and qemu stores the external_htab in terms of guest physical (==
  logical) addresses, in fact you're *always* supplying a valid logical
  page num.  So you've already correctly implemented the flag as a
  no-op.
 
  I believe that flag is included for the benefit of a true hypervisor,
  where the native htab would be stored as true physical addresses, and
  it might be expensive for the hypervisor to recompute the logical
  address.
 
 Ok, then I think we can just skip this checking.

Yes.

  That said, I actually wrote such helpers about 15 minutes ago as part
  of my MMU cleanup series.
 
  Should I wait for the helpers to send It again?

Probably not, my series will be a little while because it will
probably need to wait for the big cpu qomification series.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: Digital signature


Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-14 Thread Alexander Graf

On 13.02.2013, at 06:21, David Gibson wrote:

 On Tue, Feb 12, 2013 at 11:07:10PM +0100, Alexander Graf wrote:
 
 On 07.02.2013, at 12:28, Erlon Cruz wrote:
 
 From: Erlon Cruz erlon.c...@br.flextronics.com
 
 This h_call is useful for DLPAR in future amongst other things. Given an 
 index
 it fetches the corresponding PTE stored in the htab.
 
 Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
 ---
 hw/spapr_hcall.c |   58 
 ++
 1 file changed, 58 insertions(+)
 
 diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
 index 2889742..5ba07e5 100644
 --- a/hw/spapr_hcall.c
 +++ b/hw/spapr_hcall.c
 @@ -323,6 +323,63 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
 sPAPREnvironment *spapr,
return H_SUCCESS;
 }
 
 +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
 +target_ulong opcode, target_ulong *args)
 +{
 +CPUPPCState *env = cpu-env;
 +target_ulong flags = args[0];
 +target_ulong pte_index = args[1];
 +uint8_t *hpte;
 +
 +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
 +return H_PARAMETER;
 +}
 +
 +if (!(flags  H_READ_4)) {
 +target_ulong v, r;
 +target_ulong *pteh = args[0];
 +target_ulong *ptel = args[1];
 +
 +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
 
 You are not guaranteed that there is an external htab.
 
 Actually in the case of spapr, you are - the existing hash table
 management calls all assume the existence of an external htab.

Ok, just leave the code using external_htab and we'll make it use the helpers 
once they're there.


Alex

 
 In fact, looking at the external_htab users, we should probably
 introduce a few helper read functions for the htab that abstract the
 glorious external_htab/htab_base details away from you.
 
 That said, I actually wrote such helpers about 15 minutes ago as part
 of my MMU cleanup series.
 
 -- 
 David Gibson  | I'll have my music baroque, and my code
 david AT gibson.dropbear.id.au| minimalist, thank you.  NOT _the_ 
 _other_
   | _way_ _around_!
 http://www.ozlabs.org/~dgibson




Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-12 Thread David Gibson
On Tue, Feb 12, 2013 at 11:07:10PM +0100, Alexander Graf wrote:
 
 On 07.02.2013, at 12:28, Erlon Cruz wrote:
 
  From: Erlon Cruz erlon.c...@br.flextronics.com
  
  This h_call is useful for DLPAR in future amongst other things. Given an 
  index
  it fetches the corresponding PTE stored in the htab.
  
  Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
  ---
  hw/spapr_hcall.c |   58 
  ++
  1 file changed, 58 insertions(+)
  
  diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
  index 2889742..5ba07e5 100644
  --- a/hw/spapr_hcall.c
  +++ b/hw/spapr_hcall.c
  @@ -323,6 +323,63 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
  sPAPREnvironment *spapr,
  return H_SUCCESS;
  }
  
  +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
  +target_ulong opcode, target_ulong *args)
  +{
  +CPUPPCState *env = cpu-env;
  +target_ulong flags = args[0];
  +target_ulong pte_index = args[1];
  +uint8_t *hpte;
  +
  +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
  +return H_PARAMETER;
  +}
  +
  +if (!(flags  H_READ_4)) {
  +target_ulong v, r;
  +target_ulong *pteh = args[0];
  +target_ulong *ptel = args[1];
  +
  +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
 
 You are not guaranteed that there is an external htab.

Actually in the case of spapr, you are - the existing hash table
management calls all assume the existence of an external htab.

 In fact, looking at the external_htab users, we should probably
 introduce a few helper read functions for the htab that abstract the
 glorious external_htab/htab_base details away from you.

That said, I actually wrote such helpers about 15 minutes ago as part
of my MMU cleanup series.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: Digital signature


Re: [Qemu-devel] [Qemu-ppc] [PATCH] pseries: Implements h_read hcall

2013-02-10 Thread David Gibson
On Thu, Feb 07, 2013 at 09:28:20AM -0200, Erlon Cruz wrote:
 From: Erlon Cruz erlon.c...@br.flextronics.com
 
 This h_call is useful for DLPAR in future amongst other things. Given an index
 it fetches the corresponding PTE stored in the htab.

Nice.  It would be good to add in this little bit of PAPR compliance.

Couple of small nits in the implementation:

 
 Signed-off-by: Erlon Cruz erlon.c...@br.flextronics.com
 ---
  hw/spapr_hcall.c |   58 
 ++
  1 file changed, 58 insertions(+)
 
 diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
 index 2889742..5ba07e5 100644
 --- a/hw/spapr_hcall.c
 +++ b/hw/spapr_hcall.c
 @@ -323,6 +323,63 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
 sPAPREnvironment *spapr,
  return H_SUCCESS;
  }
  
 +static target_ulong h_read(PowerPCCPU *cpu, sPAPREnvironment *spapr,
 +target_ulong opcode, target_ulong *args)
 +{
 +CPUPPCState *env = cpu-env;
 +target_ulong flags = args[0];
 +target_ulong pte_index = args[1];
 +uint8_t *hpte;
 +
 +if ((pte_index * HASH_PTE_SIZE_64)  ~env-htab_mask) {
 +return H_PARAMETER;
 +}
 +
 +if (!(flags  H_READ_4)) {

It would be nice to combine the H_READ_4 and !H_READ_4 paths together,
since except for the masking and stopping sooner the !H_READ_4 path is
just like the H_READ_4 path.

 +target_ulong v, r;
 +target_ulong *pteh = args[0];
 +target_ulong *ptel = args[1];
 +
 +hpte = env-external_htab + (pte_index * HASH_PTE_SIZE_64);
 +
 +v = ldq_p(hpte);
 +r = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
 +
 +if (flags  H_R_XLATE) {
 +/* FIXME:  include a valid logical page num in the pte */

This comment is misleading.  Since you do copy out both words of the
hpte, and qemu stores the external_htab in terms of guest physical (==
logical) addresses, in fact you're *always* supplying a valid logical
page num.  So you've already correctly implemented the flag as a
no-op.

I believe that flag is included for the benefit of a true hypervisor,
where the native htab would be stored as true physical addresses, and
it might be expensive for the hypervisor to recompute the logical
address.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: Digital signature