1. 22 3月, 2013 40 次提交
    • R
      target-ppc: Use NARROW_MODE macro for addresses · c791fe84
      Richard Henderson 提交于
      Removing conditional compilation in the process.
      Signed-off-by: NRichard Henderson <rth@twiddle.net>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      c791fe84
    • R
      target-ppc: Use NARROW_MODE macro for comparisons · 02765534
      Richard Henderson 提交于
      Removing conditional compilation in the process.
      Signed-off-by: NRichard Henderson <rth@twiddle.net>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      02765534
    • R
      target-ppc: Use NARROW_MODE macro for branches · e0c8f9ce
      Richard Henderson 提交于
      Removing conditional compilation in the process.
      Signed-off-by: NRichard Henderson <rth@twiddle.net>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      e0c8f9ce
    • R
      target-ppc: Fix add and subf carry generation in narrow mode · 79482e5a
      Richard Henderson 提交于
      The set of computations used in b5a73f8d
      are only valid if the current word size == target_long size.  This failed
      to take ppc64 in 32-bit (narrow) mode into account.
      
      Add a NARROW_MODE macro to avoid conditional compilation.
      Signed-off-by: NRichard Henderson <rth@twiddle.net>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      79482e5a
    • D
      target-ppc: Use QOM method dispatch for MMU fault handling · b632a148
      David Gibson 提交于
      After previous cleanups, the many scattered checks of env->mmu_model in
      the ppc MMU implementation have, at least for "classic" hash MMUs been
      reduced (almost) to a single switch at the top of
      cpu_ppc_handle_mmu_fault().
      
      An explicit switch is still a pretty ugly way of handling this though.  Now
      that Andreas Färber's CPU QOM cleanups for ppc have gone in, it's quite
      straightforward to instead make the handle_mmu_fault function a QOM method
      on the CPU object.
      
      This patch implements such a scheme, initializing the method pointer at
      the same time as the mmu_model variable.  We need to keep the latter around
      for now, because of the MMU types (BookE, 4xx, et al) which haven't been
      converted to the new scheme yet, and also for a few other uses.  It would
      be good to clean those up eventually.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      b632a148
    • D
      target-ppc: Move ppc tlb_fill implementation into mmu_helper.c · eb20c1c6
      David Gibson 提交于
      For softmmu builds the interface from the generic code to the target
      specific MMU implementation is through the tlb_fill() function.  For ppc
      this is currently in mem_helper.c, whereas it would make more sense in
      mmu_helper.c.  This patch moves it, which also allows
      cpu_ppc_handle_mmu_fault() to become a local function in mmu_helper.c
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      eb20c1c6
    • D
      target-ppc: Split user only code out of mmu_helper.c · cc8eae8a
      David Gibson 提交于
      mmu_helper.c is, for obvious reasons, almost entirely concerned with
      softmmu builds of qemu.  However, it does contain one stub function which
      is used when CONFIG_USER_ONLY=y - the user only versoin of
      cpu_ppc_handle_mmu_fault, which always triggers an exception.  The entire
      rest of the file is surrounded by #if !defined(CONFIG_USER_ONLY).
      
      We clean this up by moving the user only stub into its own new file,
      removing the ifdefs and building mmu_helper.c only when CONFIG_SOFTMMU
      is set.  This also lets us remove the #define of cpu_handle_mmu_fault to
      cpu_ppc_handle_mmu_fault - that name is only used from generic code for
      user only - so we just name our split user version by the generic name.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      cc8eae8a
    • 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*: Merge translate and fault handling functions · caa597bd
      David Gibson 提交于
      ppc_hash{32,64}_handle_mmu_fault() is now the only caller of
      ppc_hash{32,64{_translate(), so this patch combines them together.  This
      means that instead of one returning a variety of non-obvious error codes
      which then get translated into the various mmu exception conditions, we can
      just generate the exceptions as we discover problems in the translation
      path.  This also removes the last usage of mmu_ctx_hash{32,64}.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      caa597bd
    • D
      mmu-hash*: Don't use full ppc_hash{32, 64}_translate() path for get_phys_page_debug() · 5883d8b2
      David Gibson 提交于
      Currently the hash mmu versionsof get_phys_page_debug() use the same
      ppc64_hash64_translate() function to do the translation logic as the normal
      mm fault handler code.
      
      That sounds like a good idea, but has some complications. The debug path
      doesn't need, or even want some parts of the full translation path, like
      permissions checking.  Furthermore, the pte flags update included in the
      normal path means that the debug call is not quite side effect free.
      
      This patch, therefore, reimplements get_phys_page_debug as the minimal
      required subset of the full translation path.
      
      Signed-off-by: David Gibson <david@gibson.dropbear.id.au>`z
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      5883d8b2
    • D
      mmu-hash*: Correctly mask RPN from hash PTE · 75d5ec89
      David Gibson 提交于
      BEHAVIOUR CHANGE
      
      At present we take the whole of word 1 of the hash PTE as the real page
      number used to calculate the translated address.  This is incorrect,
      because it leaves the flags from the low bits of PTE word 1 in place in the
      rpm.  We mostly get away with that because the value is later masked by
      TARGET_PAGE_MASK.
      
      More recent 64-bit CPUs also have a small number of flag bits (PP0 and
      KEY) in the top bits of PTE word 1.  Any guest which used those bits would
      fail with the current code.
      
      This patch fixes the problem by correctly masking out the RPN field of
      PTE word 1.  This is safe, even for older CPUs which didn't have PP0 and
      KEY, because although the RPN notionally extended to the very top of PTE
      word 1, none of those CPUs actually implemented that many real address
      bits.
      
      We add analogous masking to the 32-bit code, even though it also doesn't
      have the high flag bits, for consistency and clarity.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      75d5ec89
    • D
      mmu-hash*: Clean up real address calculation · 6d11d998
      David Gibson 提交于
      More recent 64-bit hash MMUs support multiple page sizes, and PTEs for
      large pages only include the offset of the whole large page.  But the qemu
      tlb only handles pages of the base size (4k) so we need to break up the
      large pages into 4k pieces for the qemu tlb.  To do that we have a somewhat
      awkward piece of code that adds the folds address bits 4k and the page size
      from the virtual address into the real address from the pte.
      
      This patch simplifies this redefining the raddr output of
      ppc_hash64_translate() to be the full real address of the faulting address,
      rather than just the (4k) page offset.  Computing that turns out to be
      simpler, and is fine for the caller, since it already masks with
      TARGET_PAGE_MASK before inserting into the qemu tlb.
      
      The multiple page size complication doesn't exist for 32-bit hash mmus, but
      we make an analogous cleanup there for consistency.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      6d11d998
    • D
      mmu-hash*: Clean up PTE flags update · b3440746
      David Gibson 提交于
      Currently the ppc_hash{32,64}_pte_update_flags() helper functions update a
      PTE's referenced and changed bits as necessary to reflect the access.  It
      is somewhat long winded, though.  This patch open codes them in their
      (single) callers, in a simpler way.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      b3440746
    • D
      mmu-hash64: Factor SLB N bit into permissions bits · 57d0a39d
      David Gibson 提交于
      BEHAVIOUR CHANGE
      
      Currently, for 64-bit hash mmu, the execute protection bit placed into the
      qemu tlb is based only on the N (No execute) bit from the PTE.  However,
      No Execute can also be set at the segment level.  We do check this on
      execute faults, but this still means we could incorrectly allow execution
      of code from a No Execute segment, if a prior read or write fault caused
      the page to be loaded into the qemu tlb with PROT_EXEC set.
      
      To correct this, we (re-)check the segment level no execute permission when
      generating the protection bits for the qemu tlb.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      57d0a39d
    • D
      mmu-hash*: Clean up permission checking · e01b4445
      David Gibson 提交于
      Currently checking of PTE permission bits is split messily amongst
      ppc_hash{32,64}_pp_check(), ppc_hash{32,64}_check_prot() and their callers.
      This patch cleans this up to have the new function
      ppc_hash{32,64}_pte_prot() compute the page permissions from the SLBE (for
      64-bit) or segment register (32-bit) and the pte.  A greatly simplified
      version of the actual permissions check is then open coded in the callers.
      
      The 32-bit version of ppc_hash32_pte_prot() is implemented in terms of
      ppc_hash32_pp_prot(), a renamed and slightly cleaned up version of the old
      ppc_hash32_pp_check(), which is also used for checking BAT permissions on
      the 601.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      e01b4445
    • D
      mmu-hash32: Remove nx from context structure · e1a53ba2
      David Gibson 提交于
      Previous cleanups have meant the nx field of the mmu_ctx_hash32 structure
      is now only used within ppc_hash32_translate(), and so it can be replaced
      by a local variable.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      e1a53ba2
    • D
      mmu-hash*: Don't update PTE flags when permission is denied · 87dc3fd1
      David Gibson 提交于
      BEHAVIOUR CHANGE
      
      Currently if ppc_hash{32,64}_translate() finds a PTE matching the given
      virtual address, it will always update the PTE's R & C (Referenced and
      Changed) bits.  This happens even if the PTE's permissions mean we are
      about to deny the translation.
      
      This is clearly a bug, although we get away with it because:
        a) It will only incorrectly set, never reset the bits, which should not
      cause guest correctness problems.
        b) Linux guests never use the R & C bits anyway.
      
      This patch fixes the behaviour, only updating R & C when access is granted
      by the PTE.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      87dc3fd1
    • D
      mmu-hash32: Don't look up page tables on BAT permission error · 59acbe28
      David Gibson 提交于
      BEHAVIOUR CHANGE
      
      Currently, on any failure translating an address with BATs, we proceed to
      normal segment and page table translation.  That's incorrect if the
      BAT error was due to permissions, rather than not finding a matching BAT.
      We've gotten away with it because a guest would not usually put
      translations for the same address in both BATs and page table.  Nonetheless
      this patch corrects the logic, only doing page table lookup if no BAT
      is found.  A matching BAT with bad permissions will now correctly trigger
      an exception.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      59acbe28
    • D
      mmu-hash32: Cleanup BAT lookup · 145e52f3
      David Gibson 提交于
      This patch makes a general cleanup of the ppc_hash32_get_bat() function,
      renaming it to ppc_hash32_bat_lookup().  In particular, the new function
      only looks for a matching BAT, with the permissions check from the old
      function moved to the caller.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      145e52f3
    • D
      mmu-hash32: Clean up BAT matching logic · 6fc76aa9
      David Gibson 提交于
      The code to search for a matching BAT for a virtual address is somewhat
      longwinded and awkward.  In particular, it relies on seperate size and
      validity information being returned from the hash32_bat_size() function
      (and 601 specific variant).
      
      We simplify this by having hash32_bat_size() return instead a mask of the
      virtual address bits to match, and 0 for invalid (since a BAT can never
      match the entire address space).
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      6fc76aa9
    • D
      mmu-hash32: Split BAT size logic from permissions logic · e1d49515
      David Gibson 提交于
      hash32_bat_size_prot() and its 601 variant, as the name suggests, returns
      both a BAT's size - needed to search for a matching BAT - and its
      permissions, only relevant once a matching BAT has been located.
      
      There's no particular advantage to combining these, so we split these roles
      into seperate functions for clarity.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      e1d49515
    • D
      mmu-hash32: Remove odd pointer usage from BAT code · 9986ed1e
      David Gibson 提交于
      In the code for handling BATs, the hash32_bat_size_prot() and
      hash32_bat_601_size_prot() functions are passed the BAT contents by
      reference (pointer) for no clear reason, since they only need the values
      within.
      
      This patch removes this odd usage, and uses the resulting change to clean
      up the caller slightly.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      9986ed1e
    • D
      mmu-hash*: Fold pte_check*() logic into caller · 6a980110
      David Gibson 提交于
      With previous cleanups made, the 32-bit and 64-bit pte_check*() functions
      are pretty trivial and only have one call site.  This patch therefore
      clarifies the overall code flow by folding those functions into their
      call site.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      6a980110
    • D
      mmu-hash64: Clean up ppc_hash64_htab_lookup() · 18148898
      David Gibson 提交于
      This patch makes a general cleanup of the address mangling logic in
      ppc_hash64_htab_lookup().  In particular it now avoids repeatedly switching
      on the segment size.  The lack of SLB and multiple segment sizes on 32-bit
      means an analogous cleanup is not needed there.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      18148898
    • D
      mmu-hash*: Remove permission checking from find_pte{32, 64}() · 7f3bdc2d
      David Gibson 提交于
      find_pte{32,64}() are poorly named, since they both find a PTE and do
      permissions checking of it.  This patch makes them only locate a matching
      PTE, moving the permission checking and other logic to the caller.  We
      rename the resulting search functions ppc_hash{32,64}_htab_lookup().
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      7f3bdc2d
    • D
      mmu-hash*: Make find_pte{32, 64} do more of the job of finding ptes · a1ff751a
      David Gibson 提交于
      find_pte{32,64}() are not particularly well named.  They only "find" a PTE
      within a given PTE group, and they also do permissions checking and other
      things.
      
      This patch makes it somewhat close to matching the name, by folding the
      search of both primary and secondary hash bucket into it, along with the
      various address bit shuffling to determine the right hash buckets.
      
      In the 32-bit case we also remove the code for splitting large pages into
      4k pieces for the qemu tlb, since no 32-bit hash MMUs support multiple page
      sizes.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      a1ff751a
    • 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*: Don't keep looking for PTEs after we find a match · f95d7cc7
      David Gibson 提交于
      BEHAVIOUR CHANGE
      
      The ppc hash mmu hashes each virtual address to a primary and secondary
      possible hash bucket (aka PTE group or PTEG) each with 8 PTEs.  Then we
      need a linear search through the PTEs to find the correct one for the
      virtual address we're translating.
      
      It is a programming error for the guest to insert multiple PTEs mapping the
      same virtual address into a PTEG - in this case the ppc architecture says
      the MMU can either act as if just one was present, or give a machine check.
      Currently our code takes the first matching PTE in a PTEG if it finds a
      successful translation.  But if a matching PTE is found, but permission
      bits don't allow the access, we keep looking through the PTEG, checking
      that any other matching PTEs contain an identical translation.
      
      That behaviour is perhaps not exactly wrong, but it's certainly not useful.
      This patch changes it to always just find the first matching PTE in a PTEG.
      
      In addition, if we get a permissions problem on the primary PTEG, we then
      search the secondary PTEG.  This is incorrect - a permission denying PTE
      in the primary PTEG should not be overwritten by an access granting PTE in
      the secondary (although again, it would be a programming error for the
      guest to set up such a situation anyway).  So additionally we update the
      code to only search the secondary PTEG if no matching PTE is found in the
      primary at all.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      f95d7cc7
    • D
      mmu-hash*: Cleanup segment-level NX check · bb218042
      David Gibson 提交于
      On the ppc hash mmus, no-execute can be set at the segment level (on more
      recent 64-bit hash mmus it can also be set at the page level).  This patch
      separates out this check to make it clearer what is going on, and avoiding
      excessive indentation of the remaining translation code.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      bb218042
    • D
      mmu-hash32: Split direct store segment handling into a helper · 723ed73a
      David Gibson 提交于
      This further separates the unusual case handling of direct store segments
      from the main translation path by moving its logic into a helper function,
      with some tiny cleanups along the way.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      723ed73a
    • D
      mmu-hash32: Split out handling of direct store segments · 4b9605a5
      David Gibson 提交于
      At present a large chunk of ppc_hash32_translate() is taken up with an
      ugly if selecting between direct store segments (hardly ever used) and
      normal paged segments.  This patch clarifies the flow of code by
      handling direct store segments immediately then returning, leaving the
      straight line code to describe the normal MMU path.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      4b9605a5
    • D
      mmu-hash*: Combine ppc_hash{32, 64}_get_physical_address and get_segment{32, 64}() · 65d61643
      David Gibson 提交于
      After previous work, ppc_hash{32,64}_get_physical_address() are almost
      trivial wrappers around get_segment{32,64}() which does nearly all the work of
      translating an address according to the hash mmu model.  Therefore combine the
      two functions into one, under the better name of
      ppc_hash{32,64}_translate().
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      65d61643
    • D
      mmu-hash*: Remove eaddr field from mmu_ctx_hash{32, 64} · f078cd46
      David Gibson 提交于
      The eaddr field of mmu_ctx_hash{32,64} is effectively just used to pass the
      effective address from get_segment{32,64}() to find_pte{32,64}().  Just
      pass it as a normal parameter instead.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      f078cd46
    • D
      mmu-hash64: Remove nx from mmu_ctx_hash64 · ba36ed10
      David Gibson 提交于
      The nx field in mmu_ctx_hash64 is used in two different functions.  But its
      used for slightly different things in each place, and the value is never
      propagated between them.  In other words, it might as well be two local
      variables.  This patch makes it so.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      ba36ed10
    • D
      mmu-hash*: Reduce use of access_type · 91cda45b
      David Gibson 提交于
      In ppc env->access_type is updated by e.g. integer load/stores with
      ACCESS_INT floating point load/stores with ACCESS_FLOAT and so forth.  In
      hash mmu fault paths it can also b set to ACCESS_CODE for instruction
      fetch accesses.
      
      But the only place which uses anything more of the access_type than
      whether it is instruction fetch or data access is the direct store segment
      handling.  Instruction versus data access can be more simply determined
      from the rw value passed down from the top.
      
      This changes the code to use rw in preference to checking access_type.
      For the 32-bit case there is a small amount of code (for direct store
      segments) that still needs the full access type.  Instead of passing it
      all the way down the stack, we retrieve it from the env structure, which
      is where it came anyway, before this patch.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      91cda45b
    • 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: mmu_ctx_t should not be a global type · 5dc68eb0
      David Gibson 提交于
      mmu_ctx_t is currently defined in cpu.h.  However it is used for temporary
      information relating to mmu translation, and is only used in mmu_helper.c
      and (now) mmu-hash{32,64}.c.  Furthermore it contains information which
      should be specific to particular MMU types.  Therefore, move its definition
      to mmu_helper.c.  mmu-hash{32,64}.c are converted to use new data types
      private to the relevant MMUs (identical to mmu_ctx_t for now, but that will
      change in future patches).
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      5dc68eb0
    • D
      target-ppc: Disentangle BAT code for 32-bit hash MMUs · 98132796
      David Gibson 提交于
      The functions for looking up BATs (Block Address Translation - essentially
      a level 0 TLB) are shared between the classic 32-bit hash MMUs and the
      6xx style software loaded TLB implementations.
      
      This patch splits out a copy for the 32-bit hash MMUs, to facilitate
      cleaning it up.  The remaining version is left, but cleaned up slightly
      to no longer deal with PowerPC 601 peculiarities (601 has a hash MMU).
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      98132796
    • D
      target-ppc: Don't share get_pteg_offset() between 32 and 64-bit · 59191721
      David Gibson 提交于
      The get_pteg_offset() helper function is currently shared between 32-bit
      and 64-bit hash mmus, taking a parameter for the hash pte size.  In the
      64-bit paths, it's only called in one place, and it's a trivial
      calculation.  This patch, therefore, open codes it for 64-bit.  The
      remaining version, which is used in two places is made 32-bit only and
      moved to mmu-hash32.c.
      Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
      Signed-off-by: NAlexander Graf <agraf@suse.de>
      59191721