Skip to content
Snippets Groups Projects
  1. Jan 23, 2013
    • Christoffer Dall's avatar
      KVM: ARM: Handle guest faults in KVM · 94f8e641
      Christoffer Dall authored
      
      Handles the guest faults in KVM by mapping in corresponding user pages
      in the 2nd stage page tables.
      
      We invalidate the instruction cache by MVA whenever we map a page to the
      guest (no, we cannot only do it when we have an iabt because the guest
      may happily read/write a page before hitting the icache) if the hardware
      uses VIPT or PIPT.  In the latter case, we can invalidate only that
      physical page.  In the first case, all bets are off and we simply must
      invalidate the whole affair.  Not that VIVT icaches are tagged with
      vmids, and we are out of the woods on that one.  Alexander Graf was nice
      enough to remind us of this massive pain.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      94f8e641
    • Rusty Russell's avatar
      KVM: ARM: VFP userspace interface · 4fe21e4c
      Rusty Russell authored
      
      We use space #18 for floating point regs.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      4fe21e4c
    • Christoffer Dall's avatar
      KVM: ARM: Demux CCSIDR in the userspace API · c27581ed
      Christoffer Dall authored
      
      The Cache Size Selection Register (CSSELR) selects the current Cache
      Size ID Register (CCSIDR).  You write which cache you are interested
      in to CSSELR, and read the information out of CCSIDR.
      
      Which cache numbers are valid is known by reading the Cache Level ID
      Register (CLIDR).
      
      To export this state to userspace, we add a KVM_REG_ARM_DEMUX
      numberspace (17), which uses 8 bits to represent which register is
      being demultiplexed (0 for CCSIDR), and the lower 8 bits to represent
      this demultiplexing (in our case, the CSSELR value, which is 4 bits).
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      c27581ed
    • Christoffer Dall's avatar
      KVM: ARM: User space API for getting/setting co-proc registers · 1138245c
      Christoffer Dall authored
      
      The following three ioctls are implemented:
       -  KVM_GET_REG_LIST
       -  KVM_GET_ONE_REG
       -  KVM_SET_ONE_REG
      
      Now we have a table for all the cp15 registers, we can drive a generic
      API.
      
      The register IDs carry the following encoding:
      
      ARM registers are mapped using the lower 32 bits.  The upper 16 of that
      is the register group type, or coprocessor number:
      
      ARM 32-bit CP15 registers have the following id bit patterns:
        0x4002 0000 000F <zero:1> <crn:4> <crm:4> <opc1:4> <opc2:3>
      
      ARM 64-bit CP15 registers have the following id bit patterns:
        0x4003 0000 000F <zero:1> <zero:4> <crm:4> <opc1:4> <zero:3>
      
      For futureproofing, we need to tell QEMU about the CP15 registers the
      host lets the guest access.
      
      It will need this information to restore a current guest on a future
      CPU or perhaps a future KVM which allow some of these to be changed.
      
      We use a separate table for these, as they're only for the userspace API.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      1138245c
    • Christoffer Dall's avatar
      KVM: ARM: Emulation framework and CP15 emulation · 5b3e5e5b
      Christoffer Dall authored
      
      Adds a new important function in the main KVM/ARM code called
      handle_exit() which is called from kvm_arch_vcpu_ioctl_run() on returns
      from guest execution. This function examines the Hyp-Syndrome-Register
      (HSR), which contains information telling KVM what caused the exit from
      the guest.
      
      Some of the reasons for an exit are CP15 accesses, which are
      not allowed from the guest and this commit handles these exits by
      emulating the intended operation in software and skipping the guest
      instruction.
      
      Minor notes about the coproc register reset:
      1) We reserve a value of 0 as an invalid cp15 offset, to catch bugs in our
         table, at cost of 4 bytes per vcpu.
      
      2) Added comments on the table indicating how we handle each register, for
         simplicity of understanding.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      5b3e5e5b
    • Christoffer Dall's avatar
      KVM: ARM: World-switch implementation · f7ed45be
      Christoffer Dall authored
      
      Provides complete world-switch implementation to switch to other guests
      running in non-secure modes. Includes Hyp exception handlers that
      capture necessary exception information and stores the information on
      the VCPU and KVM structures.
      
      The following Hyp-ABI is also documented in the code:
      
      Hyp-ABI: Calling HYP-mode functions from host (in SVC mode):
         Switching to Hyp mode is done through a simple HVC #0 instruction. The
         exception vector code will check that the HVC comes from VMID==0 and if
         so will push the necessary state (SPSR, lr_usr) on the Hyp stack.
         - r0 contains a pointer to a HYP function
         - r1, r2, and r3 contain arguments to the above function.
         - The HYP function will be called with its arguments in r0, r1 and r2.
         On HYP function return, we return directly to SVC.
      
      A call to a function executing in Hyp mode is performed like the following:
      
              <svc code>
              ldr     r0, =BSYM(my_hyp_fn)
              ldr     r1, =my_param
              hvc #0  ; Call my_hyp_fn(my_param) from HYP mode
              <svc code>
      
      Otherwise, the world-switch is pretty straight-forward. All state that
      can be modified by the guest is first backed up on the Hyp stack and the
      VCPU values is loaded onto the hardware. State, which is not loaded, but
      theoretically modifiable by the guest is protected through the
      virtualiation features to generate a trap and cause software emulation.
      Upon guest returns, all state is restored from hardware onto the VCPU
      struct and the original state is restored from the Hyp-stack onto the
      hardware.
      
      SMP support using the VMPIDR calculated on the basis of the host MPIDR
      and overriding the low bits with KVM vcpu_id contributed by Marc Zyngier.
      
      Reuse of VMIDs has been implemented by Antonios Motakis and adapated from
      a separate patch into the appropriate patches introducing the
      functionality. Note that the VMIDs are stored per VM as required by the ARM
      architecture reference manual.
      
      To support VFP/NEON we trap those instructions using the HPCTR. When
      we trap, we switch the FPU.  After a guest exit, the VFP state is
      returned to the host.  When disabling access to floating point
      instructions, we also mask FPEXC_EN in order to avoid the guest
      receiving Undefined instruction exceptions before we have a chance to
      switch back the floating point state.  We are reusing vfp_hard_struct,
      so we depend on VFPv3 being enabled in the host kernel, if not, we still
      trap cp10 and cp11 in order to inject an undefined instruction exception
      whenever the guest tries to use VFP/NEON. VFP/NEON developed by
      Antionios Motakis and Rusty Russell.
      
      Aborts that are permission faults, and not stage-1 page table walk, do
      not report the faulting address in the HPFAR.  We have to resolve the
      IPA, and store it just like the HPFAR register on the VCPU struct. If
      the IPA cannot be resolved, it means another CPU is playing with the
      page tables, and we simply restart the guest.  This quirk was fixed by
      Marc Zyngier.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarAntonios Motakis <a.motakis@virtualopensystems.com>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      f7ed45be
    • Christoffer Dall's avatar
      KVM: ARM: Inject IRQs and FIQs from userspace · 86ce8535
      Christoffer Dall authored
      
      All interrupt injection is now based on the VM ioctl KVM_IRQ_LINE.  This
      works semantically well for the GIC as we in fact raise/lower a line on
      a machine component (the gic).  The IOCTL uses the follwing struct.
      
      struct kvm_irq_level {
      	union {
      		__u32 irq;     /* GSI */
      		__s32 status;  /* not used for KVM_IRQ_LEVEL */
      	};
      	__u32 level;           /* 0 or 1 */
      };
      
      ARM can signal an interrupt either at the CPU level, or at the in-kernel irqchip
      (GIC), and for in-kernel irqchip can tell the GIC to use PPIs designated for
      specific cpus.  The irq field is interpreted like this:
      
        bits:  | 31 ... 24 | 23  ... 16 | 15    ...    0 |
        field: | irq_type  | vcpu_index |   irq_number   |
      
      The irq_type field has the following values:
      - irq_type[0]: out-of-kernel GIC: irq_number 0 is IRQ, irq_number 1 is FIQ
      - irq_type[1]: in-kernel GIC: SPI, irq_number between 32 and 1019 (incl.)
                     (the vcpu_index field is ignored)
      - irq_type[2]: in-kernel GIC: PPI, irq_number between 16 and 31 (incl.)
      
      The irq_number thus corresponds to the irq ID in as in the GICv2 specs.
      
      This is documented in Documentation/kvm/api.txt.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      86ce8535
    • Christoffer Dall's avatar
      KVM: ARM: Memory virtualization setup · d5d8184d
      Christoffer Dall authored
      
      This commit introduces the framework for guest memory management
      through the use of 2nd stage translation. Each VM has a pointer
      to a level-1 table (the pgd field in struct kvm_arch) which is
      used for the 2nd stage translations. Entries are added when handling
      guest faults (later patch) and the table itself can be allocated and
      freed through the following functions implemented in
      arch/arm/kvm/arm_mmu.c:
       - kvm_alloc_stage2_pgd(struct kvm *kvm);
       - kvm_free_stage2_pgd(struct kvm *kvm);
      
      Each entry in TLBs and caches are tagged with a VMID identifier in
      addition to ASIDs. The VMIDs are assigned consecutively to VMs in the
      order that VMs are executed, and caches and tlbs are invalidated when
      the VMID space has been used to allow for more than 255 simultaenously
      running guests.
      
      The 2nd stage pgd is allocated in kvm_arch_init_vm(). The table is
      freed in kvm_arch_destroy_vm(). Both functions are called from the main
      KVM code.
      
      We pre-allocate page table memory to be able to synchronize using a
      spinlock and be called under rcu_read_lock from the MMU notifiers.  We
      steal the mmu_memory_cache implementation from x86 and adapt for our
      specific usage.
      
      We support MMU notifiers (thanks to Marc Zyngier) through
      kvm_unmap_hva and kvm_set_spte_hva.
      
      Finally, define kvm_phys_addr_ioremap() to map a device at a guest IPA,
      which is used by VGIC support to map the virtual CPU interface registers
      to the guest. This support is added by Marc Zyngier.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      d5d8184d
    • Christoffer Dall's avatar
      KVM: ARM: Hypervisor initialization · 342cd0ab
      Christoffer Dall authored
      
      Sets up KVM code to handle all exceptions taken to Hyp mode.
      
      When the kernel is booted in Hyp mode, calling an hvc instruction with r0
      pointing to the new vectors, the HVBAR is changed to the the vector pointers.
      This allows subsystems (like KVM here) to execute code in Hyp-mode with the
      MMU disabled.
      
      We initialize other Hyp-mode registers and enables the MMU for Hyp-mode from
      the id-mapped hyp initialization code. Afterwards, the HVBAR is changed to
      point to KVM Hyp vectors used to catch guest faults and to switch to Hyp mode
      to perform a world-switch into a KVM guest.
      
      Also provides memory mapping code to map required code pages, data structures,
      and I/O regions  accessed in Hyp mode at the same virtual address as the host
      kernel virtual addresses, but which conforms to the architectural requirements
      for translations in Hyp mode. This interface is added in arch/arm/kvm/arm_mmu.c
      and comprises:
       - create_hyp_mappings(from, to);
       - create_hyp_io_mappings(from, to, phys_addr);
       - free_hyp_pmds();
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      342cd0ab
    • Christoffer Dall's avatar
      KVM: ARM: Initial skeleton to compile KVM support · 749cf76c
      Christoffer Dall authored
      
      Targets KVM support for Cortex A-15 processors.
      
      Contains all the framework components, make files, header files, some
      tracing functionality, and basic user space API.
      
      Only supported core is Cortex-A15 for now.
      
      Most functionality is in arch/arm/kvm/* or arch/arm/include/asm/kvm_*.h.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      749cf76c
    • Christoffer Dall's avatar
      ARM: Section based HYP idmap · 9e9a367c
      Christoffer Dall authored
      
      Add a method (hyp_idmap_setup) to populate a hyp pgd with an
      identity mapping of the code contained in the .hyp.idmap.text
      section.
      
      Offer a method to drop this identity mapping through
      hyp_idmap_teardown.
      
      Make all the above depend on CONFIG_ARM_VIRT_EXT and CONFIG_ARM_LPAE.
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Signed-off-by: default avatarChristoffer Dall <c.dall@virtualopensystems.com>
      9e9a367c
    • Christoffer Dall's avatar
      ARM: Add page table and page defines needed by KVM · cc577c26
      Christoffer Dall authored
      
      KVM uses the stage-2 page tables and the Hyp page table format,
      so we define the fields and page protection flags needed by KVM.
      
      The nomenclature is this:
       - page_hyp:        PL2 code/data mappings
       - page_hyp_device: PL2 device mappings (vgic access)
       - page_s2:         Stage-2 code/data page mappings
       - page_s2_device:  Stage-2 device mappings (vgic access)
      
      Reviewed-by: default avatarWill Deacon <will.deacon@arm.com>
      Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
      Christoffer Dall <c.dall@virtualopensystems.com>
      cc577c26
  2. Jan 11, 2013
  3. Dec 20, 2012
  4. Dec 14, 2012
  5. Dec 11, 2012
  6. Dec 03, 2012
    • Ming Lei's avatar
      ARM: dma-mapping: support debug_dma_mapping_error · a0157573
      Ming Lei authored
      
      Without the patch, kind of below warning will be dumped if DMA-API
      debug is enabled:
      
      [   11.069763] ------------[ cut here ]------------
      [   11.074645] WARNING: at lib/dma-debug.c:948 check_unmap+0x770/0x860()
      [   11.081420] ehci-omap ehci-omap.0: DMA-API: device driver failed to
      check map error[device address=0x0000000
      0adb78e80] [size=8 bytes] [mapped as single]
      [   11.095611] Modules linked in:
      
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Marek Szyprowski <m.szyprowski@samsung.com>
      Signed-off-by: default avatarMing Lei <ming.lei@canonical.com>
      Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
      a0157573
    • Rob Herring's avatar
      ARM: 7587/1: implement optimized percpu variable access · 14318efb
      Rob Herring authored
      
      Use the previously unused TPIDRPRW register to store percpu offsets.
      TPIDRPRW is only accessible in PL1, so it can only be used in the kernel.
      
      This replaces 2 loads with a mrc instruction for each percpu variable
      access. With hackbench, the performance improvement is 1.4% on Cortex-A9
      (highbank). Taking an average of 30 runs of "hackbench -l 1000" yields:
      
      Before: 6.2191
      After: 6.1348
      
      Will Deacon reported similar delta on v6 with 11MPCore.
      
      The asm "memory clobber" are needed here to ensure the percpu offset
      gets reloaded. Testing by Will found that this would not happen in
      __schedule() which is a bit of a special case as preemption is disabled
      but the execution can move cores.
      
      Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
      Acked-by: default avatarWill Deacon <will.deacon@arm.com>
      Acked-by: default avatarNicolas Pitre <nico@linaro.org>
      Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
      14318efb
  7. Nov 29, 2012
  8. Nov 26, 2012
  9. Nov 23, 2012
  10. Nov 21, 2012
  11. Nov 20, 2012
  12. Nov 19, 2012
  13. Nov 16, 2012
Loading