1. 05 3月, 2014 3 次提交
  2. 11 2月, 2014 2 次提交
  3. 22 3月, 2013 11 次提交
    • D
      mmu-hash64: Implement Virtual Page Class Key Protection · f80872e2
      David Gibson 提交于
      Version 2.06 of the Power architecture describes an additional page
      protection mechanism.  Each virtual page has a "class" (0-31) recorded in
      the PTE.  The AMR register contains bits which can prohibit reads and/or
      writes on a class by class basis.  Interestingly, the AMR is userspace
      readable and writable, however user mode writes are masked by the contents
      of the UAMOR which is privileged.
      
      This patch implements this protection mechanism, along with the AMR and
      UAMOR SPRs.  The architecture also specifies a hypervisor-privileged AMOR
      register which masks user and supervisor writes to the AMR and UAMOR.  We
      leave this out for now, since we don't at present model hypervisor mode
      correctly in any case.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      [agraf: fix 32-bit hosts]
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      f80872e2
    • D
      mmu-hash*: Separate PTEG searching from permissions checking · aea390e4
      David Gibson 提交于
      find_pte{32,64{() do several things.  First they search through a PTEG
      ooking for a PTE matching our virtual address.  Then they do permissions
      checking and other processing on that PTE.
      
      This patch separates the search by VA out from the rest.  The search is
      combined with the pte{32,64}_match() functions into new
      ppc_has{32,64}_pteg_search() functions.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      aea390e4
    • D
      mmu-hash*: Add hash pte load/store helpers · dffdaf61
      David Gibson 提交于
      On real hardware the ppc hash page table is stored in memory; accordingly
      our mmu emulation code can read a hash page table in guest memory.  But,
      when paravirtualized under PAPR, the real hash page table is in host
      memory, accessible to the guest only via hypercalls.  We model this by
      also allowing the MMU emulation code to access a specially allocated hash
      page table outside the guest's memory image. At present these two options
      are implemented with some ugly conditionals at each access point in the mmu
      emulation code.  In the implementation of the PAPR hypercalls, we assume
      the external hash table.
      
      This patch cleans things up by adding helpers to load and store from the
      hash table for both 32-bit and 64-bit hash mmus.  The 64-bit versions
      handle both the in-guest-memory and outside guest memory cases.  The 32-bit
      versions only handle the in-guest-memory case since no 32-bit systems can
      have an external hash table at present.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      dffdaf61
    • D
      mmu-hash*: Add header file for definitions · d5aea6f3
      David Gibson 提交于
      Currently cpu.h contains a number of definitions relating to the 64-bit
      hash MMU.  Some are used in the MMU emulation code, but some are only used
      in the spapr MMU management hcall implementations.
      
      This patch moves these definitions (except for a few that are needed
      more widely) into mmu-hash64.h header, shared between the MMU emulation
      code and the spapr hcall code.  The MMU emulation code is also updated to
      actually use a number of those definitions in place of hard coded
      constants.
      
      Similarly, we add new analogous definitions to mmu-hash32.h and use those
      in place of many hard-coded constants in mmu-hash32.c
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      [agraf: fix 32-bit hosts]
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      d5aea6f3
    • D
      target-ppc: Disentangle hash mmu versions of cpu_get_phys_page_debug() · f2ad6be8
      David Gibson 提交于
      cpu_get_phys_page_debug() is a trivial wrapper around
      get_physical_address().  But even the signature of
      get_physical_address() has some things we'd like to clean up on a
      per-mmu basis, so this patch moves the test on mmu model out to
      cpu_get_phys_page_debug(), moving the version for 64-bit hash MMUs out
      to mmu-hash64.c and the version for 32-bit hash MMUs to mmu-hash32.c
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      f2ad6be8
    • D
      target-ppc: Disentangle hash mmu paths for cpu_ppc_handle_mmu_fault · 25de24ab
      David Gibson 提交于
      cpu_ppc_handle_mmu_fault() calls get_physical_address() (whose behaviour
      depends on MMU type) then, if that fails, issues an appropriate exception
      - which again has a number of dependencies on MMU type.
      
      This patch starts converting cpu_ppc_handle_mmu_fault() to have a
      single switch on MMU type, calling MMU specific fault handler
      functions which deal with both translation and exception delivery
      appropriately for the MMU type.  We convert 32-bit and 64-bit hash
      MMUs to this new model, but the existing code is left in place for
      other MMU types for now.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      25de24ab
    • D
      target-ppc: Disentangle get_physical_address() paths · 629bd516
      David Gibson 提交于
      Depending on the MSR state, for 64-bit hash MMUs, get_physical_address
      can either call check_physical (which has further tests for mmu type)
      or get_segment64.  Similarly for 32-bit hash MMUs we can either call
      check_physucal or get_bat() and get_segment32().
      
      This patch splits off the whole get_physical_addresss() path for hash
      MMUs into 32-bit and 64-bit versions, handling real mode correctly for
      such MMUs without going to check_physical and rechecking the mmu type.
      Correspondingly, the hash MMU specific paths in check_physical() are
      removed.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      629bd516
    • D
      target-ppc: Disentangle get_segment() · 0480884f
      David Gibson 提交于
      The poorly named get_segment() function handles most of the address
      translation logic for hash-based MMUs.  It has many ugly conditionals on
      whether the MMU is 32-bit or 64-bit.
      
      This patch splits the function into 32 and 64-bit versions, using the
      switch on mmu_type that's already in the caller
      (get_physical_address()) to select the right one.  Most of the
      original function remains in mmu_helper.c to support the 6xx software
      loaded TLB implementations (cleaning those up is a project for another
      day).
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      0480884f
    • D
      target-ppc: Disentangle find_pte() · c69b6151
      David Gibson 提交于
      32-bit and 64-bit hash MMU implementations currently share a find_pte
      function.  This results in a whole bunch of ugly conditionals in the shared
      function, and not all that much actually shared code.
      
      This patch separates out the 32-bit and 64-bit versions, putting then
      in mmu-hash64.c and mmu-has32.c, and removes the conditionals from
      both versions.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      c69b6151
    • D
      target-ppc: Disentangle pte_check() · 9d7c3f4a
      David Gibson 提交于
      Currently support for both 32-bit and 64-bit hash MMUs share an
      implementation of pte_check.  But there are enough differences that this
      means the shared function has several very ugly conditionals on "is_64b".
      
      This patch cleans things up by separating out the 64-bit version
      (putting it into mmu-hash64.c) and the 32-bit hash version (putting it
      in mmu-hash32.c).  Another copy remains in mmu_helper.c, which is used
      for the 6xx software loaded TLB paths.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      9d7c3f4a
    • D
      target-ppc: Move SLB handling into a mmu-hash64.c · 10b46525
      David Gibson 提交于
      As a first step to disentangling the handling for 64-bit hash MMUs from
      the rest, we move the code handling the Segment Lookaside Buffer (SLB)
      (which only exists on 64-bit hash MMUs) into a new mmu-hash64.c file.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      10b46525