qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] pseries: Allow TCG h_enter to work with hotplug


From: Alexey Kardashevskiy
Subject: Re: [Qemu-devel] [PATCH] pseries: Allow TCG h_enter to work with hotplugged memory
Date: Thu, 21 Jan 2016 12:48:46 +1100
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0

On 01/21/2016 12:41 PM, David Gibson wrote:
The implementation of the H_ENTER hypercall for PAPR guests needs to
enforce correct access attributes on the inserted HPTE.  This means
determining if the HPTE's real address is a regular RAM address (which
requires attributes for coherent access) or an IO address (which requires
attributes for cache-inhibited access).

At the moment this check is implemented with (raddr < machine->ram_size),
but that only handles addresses in the base RAM area, not any hotplugged
RAM.

This patch corrects the problem with a new helper.

Signed-off-by: David Gibson <address@hidden>


Reviewed-by: Alexey Kardashevskiy <address@hidden>



---
  hw/ppc/spapr_hcall.c | 19 +++++++++++++++++--
  1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index cebceea..ea33bc7 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -84,10 +84,25 @@ static inline bool valid_pte_index(CPUPPCState *env, 
target_ulong pte_index)
      return true;
  }

+static bool is_ram_address(sPAPRMachineState *spapr, hwaddr addr)
+{
+    MachineState *machine = MACHINE(spapr);
+    MemoryHotplugState *hpms = &spapr->hotplug_memory;
+
+    if (addr < machine->ram_size) {
+        return true;
+    }
+    if ((addr >= hpms->base)
+        && ((addr - hpms->base) < memory_region_size(&hpms->mr))) {
+        return true;
+    }
+
+    return false;
+}
+
  static target_ulong h_enter(PowerPCCPU *cpu, sPAPRMachineState *spapr,
                              target_ulong opcode, target_ulong *args)
  {
-    MachineState *machine = MACHINE(spapr);
      CPUPPCState *env = &cpu->env;
      target_ulong flags = args[0];
      target_ulong pte_index = args[1];
@@ -119,7 +134,7 @@ static target_ulong h_enter(PowerPCCPU *cpu, 
sPAPRMachineState *spapr,

      raddr = (ptel & HPTE64_R_RPN) & ~((1ULL << page_shift) - 1);

-    if (raddr < machine->ram_size) {
+    if (is_ram_address(spapr, raddr)) {
          /* Regular RAM - should have WIMG=0010 */
          if ((ptel & HPTE64_R_WIMG) != HPTE64_R_M) {
              return H_PARAMETER;



--
Alexey



reply via email to

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