Merge remote-tracking branch 'qemu-kvm/memory/exec-obsolete' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Mon, 19 Dec 2011 15:45:17 +0000 (09:45 -0600)
committerAnthony Liguori <aliguori@us.ibm.com>
Mon, 19 Dec 2011 15:45:17 +0000 (09:45 -0600)
1  2 
memory.c

diff --combined memory.c
index 37e4f0905b8e3e36facfff8b4c34d69a9ad1427e,cbd6988ccbb50b976709e3f3f60b39dc01420dda..a7e615ad15f018fec2dbc01157801c9237d77153
+++ b/memory.c
  #include "kvm.h"
  #include <assert.h>
  
+ #define WANT_EXEC_OBSOLETE
+ #include "exec-obsolete.h"
  unsigned memory_region_transaction_depth = 0;
 +static bool memory_region_update_pending = false;
  
  typedef struct AddrRange AddrRange;
  
@@@ -529,10 -531,6 +532,10 @@@ static void render_memory_region(FlatVi
      FlatRange fr;
      AddrRange tmp;
  
 +    if (!mr->enabled) {
 +        return;
 +    }
 +
      int128_addto(&base, int128_make64(mr->addr));
      readonly |= mr->readonly;
  
@@@ -755,14 -753,9 +758,14 @@@ static void address_space_update_topolo
      address_space_update_ioeventfds(as);
  }
  
 -static void memory_region_update_topology(void)
 +static void memory_region_update_topology(MemoryRegion *mr)
  {
      if (memory_region_transaction_depth) {
 +        memory_region_update_pending |= !mr || mr->enabled;
 +        return;
 +    }
 +
 +    if (mr && !mr->enabled) {
          return;
      }
  
      if (address_space_io.root) {
          address_space_update_topology(&address_space_io);
      }
 +
 +    memory_region_update_pending = false;
  }
  
  void memory_region_transaction_begin(void)
@@@ -785,9 -776,7 +788,9 @@@ void memory_region_transaction_commit(v
  {
      assert(memory_region_transaction_depth);
      --memory_region_transaction_depth;
 -    memory_region_update_topology();
 +    if (!memory_region_transaction_depth && memory_region_update_pending) {
 +        memory_region_update_topology(NULL);
 +    }
  }
  
  static void memory_region_destructor_none(MemoryRegion *mr)
@@@ -827,7 -816,6 +830,7 @@@ void memory_region_init(MemoryRegion *m
      }
      mr->addr = 0;
      mr->offset = 0;
 +    mr->enabled = true;
      mr->terminates = false;
      mr->readable = true;
      mr->readonly = false;
@@@ -1073,7 -1061,7 +1076,7 @@@ void memory_region_set_log(MemoryRegio
      uint8_t mask = 1 << client;
  
      mr->dirty_log_mask = (mr->dirty_log_mask & ~mask) | (log * mask);
 -    memory_region_update_topology();
 +    memory_region_update_topology(mr);
  }
  
  bool memory_region_get_dirty(MemoryRegion *mr, target_phys_addr_t addr,
@@@ -1105,7 -1093,7 +1108,7 @@@ void memory_region_set_readonly(MemoryR
  {
      if (mr->readonly != readonly) {
          mr->readonly = readonly;
 -        memory_region_update_topology();
 +        memory_region_update_topology(mr);
      }
  }
  
@@@ -1113,7 -1101,7 +1116,7 @@@ void memory_region_rom_device_set_reada
  {
      if (mr->readable != readable) {
          mr->readable = readable;
 -        memory_region_update_topology();
 +        memory_region_update_topology(mr);
      }
  }
  
@@@ -1218,7 -1206,7 +1221,7 @@@ void memory_region_add_eventfd(MemoryRe
      memmove(&mr->ioeventfds[i+1], &mr->ioeventfds[i],
              sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb-1 - i));
      mr->ioeventfds[i] = mrfd;
 -    memory_region_update_topology();
 +    memory_region_update_topology(mr);
  }
  
  void memory_region_del_eventfd(MemoryRegion *mr,
      --mr->ioeventfd_nb;
      mr->ioeventfds = g_realloc(mr->ioeventfds,
                                    sizeof(*mr->ioeventfds)*mr->ioeventfd_nb + 1);
 -    memory_region_update_topology();
 +    memory_region_update_topology(mr);
  }
  
  static void memory_region_add_subregion_common(MemoryRegion *mr,
      }
      QTAILQ_INSERT_TAIL(&mr->subregions, subregion, subregions_link);
  done:
 -    memory_region_update_topology();
 +    memory_region_update_topology(mr);
  }
  
  
@@@ -1318,63 -1306,19 +1321,63 @@@ void memory_region_del_subregion(Memory
      assert(subregion->parent == mr);
      subregion->parent = NULL;
      QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link);
 -    memory_region_update_topology();
 +    memory_region_update_topology(mr);
 +}
 +
 +void memory_region_set_enabled(MemoryRegion *mr, bool enabled)
 +{
 +    if (enabled == mr->enabled) {
 +        return;
 +    }
 +    mr->enabled = enabled;
 +    memory_region_update_topology(NULL);
 +}
 +
 +void memory_region_set_address(MemoryRegion *mr, target_phys_addr_t addr)
 +{
 +    MemoryRegion *parent = mr->parent;
 +    unsigned priority = mr->priority;
 +    bool may_overlap = mr->may_overlap;
 +
 +    if (addr == mr->addr || !parent) {
 +        mr->addr = addr;
 +        return;
 +    }
 +
 +    memory_region_transaction_begin();
 +    memory_region_del_subregion(parent, mr);
 +    if (may_overlap) {
 +        memory_region_add_subregion_overlap(parent, addr, mr, priority);
 +    } else {
 +        memory_region_add_subregion(parent, addr, mr);
 +    }
 +    memory_region_transaction_commit();
 +}
 +
 +void memory_region_set_alias_offset(MemoryRegion *mr, target_phys_addr_t offset)
 +{
 +    target_phys_addr_t old_offset = mr->alias_offset;
 +
 +    assert(mr->alias);
 +    mr->alias_offset = offset;
 +
 +    if (offset == old_offset || !mr->parent) {
 +        return;
 +    }
 +
 +    memory_region_update_topology(mr);
  }
  
  void set_system_memory_map(MemoryRegion *mr)
  {
      address_space_memory.root = mr;
 -    memory_region_update_topology();
 +    memory_region_update_topology(NULL);
  }
  
  void set_system_io_map(MemoryRegion *mr)
  {
      address_space_io.root = mr;
 -    memory_region_update_topology();
 +    memory_region_update_topology(NULL);
  }
  
  typedef struct MemoryRegionList MemoryRegionList;