]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'next/kvm' into mips-for-linux-next
authorRalf Baechle <ralf@linux-mips.org>
Thu, 9 May 2013 15:56:40 +0000 (17:56 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 9 May 2013 15:56:40 +0000 (17:56 +0200)
1  2 
arch/mips/Kconfig
arch/mips/include/asm/mmu_context.h
arch/mips/kernel/traps.c
arch/mips/mm/c-r4k.c
virt/kvm/kvm_main.c

diff --combined arch/mips/Kconfig
index c1997db9c57c7e52c2ed99ed9b46967f08ec19ce,87d50d73d3b324cc9db1234fd51347b919a93170..0cb6f5ffeecd47d5f1cfcff27cbce78f4dc02914
@@@ -18,7 -18,7 +18,7 @@@ config MIP
        select HAVE_KRETPROBES
        select HAVE_DEBUG_KMEMLEAK
        select ARCH_BINFMT_ELF_RANDOMIZE_PIE
 -      select HAVE_ARCH_TRANSPARENT_HUGEPAGE
 +      select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT
        select RTC_LIB if !MACH_LOONGSON
        select GENERIC_ATOMIC64 if !64BIT
        select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
@@@ -38,7 -38,7 +38,7 @@@
        select GENERIC_CLOCKEVENTS
        select GENERIC_CMOS_UPDATE
        select HAVE_MOD_ARCH_SPECIFIC
 -      select HAVE_VIRT_TO_BUS
 +      select VIRT_TO_BUS
        select MODULES_USE_ELF_REL if MODULES
        select MODULES_USE_ELF_RELA if MODULES && 64BIT
        select CLONE_BACKWARDS
@@@ -306,6 -306,7 +306,6 @@@ config MIPS_MALT
        select HW_HAS_PCI
        select I8253
        select I8259
 -      select MIPS_BOARDS_GEN
        select MIPS_BONITO64
        select MIPS_CPU_SCACHE
        select PCI_GT64XXX_PCI0
@@@ -341,6 -342,7 +341,6 @@@ config MIPS_SEAD
        select DMA_NONCOHERENT
        select IRQ_CPU
        select IRQ_GIC
 -      select MIPS_BOARDS_GEN
        select MIPS_CPU_SCACHE
        select MIPS_MSC
        select SYS_HAS_CPU_MIPS32_R1
@@@ -655,7 -657,7 +655,7 @@@ config SNI_R
        bool "SNI RM200/300/400"
        select FW_ARC if CPU_LITTLE_ENDIAN
        select FW_ARC32 if CPU_LITTLE_ENDIAN
 -      select SNIPROM if CPU_BIG_ENDIAN
 +      select FW_SNIPROM if CPU_BIG_ENDIAN
        select ARCH_MAY_HAVE_PC_FDC
        select BOOT_ELF32
        select CEVT_R4K
@@@ -981,6 -983,9 +981,6 @@@ config MIPS_MS
  config MIPS_NILE4
        bool
  
 -config MIPS_DISABLE_OBSOLETE_IDE
 -      bool
 -
  config SYNC_R4K
        bool
  
@@@ -1074,6 -1079,9 +1074,6 @@@ config IRQ_GT641X
  config IRQ_GIC
        bool
  
 -config MIPS_BOARDS_GEN
 -      bool
 -
  config PCI_GT64XXX_PCI0
        bool
  
@@@ -1136,7 -1144,7 +1136,7 @@@ config DEFAULT_SGI_PARTITIO
  config FW_ARC32
        bool
  
 -config SNIPROM
 +config FW_SNIPROM
        bool
  
  config BOOT_ELF32
  
  config MIPS_L1_CACHE_SHIFT
        int
 -      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL
 +      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL || SOC_RT288X
        default "6" if MIPS_CPU_SCACHE
        default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM || CPU_CAVIUM_OCTEON
        default "5"
@@@ -1234,6 -1242,7 +1234,7 @@@ config CPU_MIPS32_R
        select CPU_HAS_PREFETCH
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
+       select HAVE_KVM
        help
          Choose this option to build a kernel for release 2 or later of the
          MIPS32 architecture.  Most modern embedded systems with a 32-bit
@@@ -1485,6 -1494,7 +1486,6 @@@ config CPU_XL
        select CPU_SUPPORTS_32BIT_KERNEL
        select CPU_SUPPORTS_64BIT_KERNEL
        select CPU_SUPPORTS_HIGHMEM
 -      select CPU_HAS_LLSC
        select WEAK_ORDERING
        select WEAK_REORDERING_BEYOND_LLSC
        select CPU_HAS_PREFETCH
@@@ -1734,6 -1744,20 +1735,20 @@@ config 64BI
  
  endchoice
  
+ config KVM_GUEST
+       bool "KVM Guest Kernel"
+       help
+         Select this option if building a guest kernel for KVM (Trap & Emulate) mode
+ config KVM_HOST_FREQ
+       int "KVM Host Processor Frequency (MHz)"
+       depends on KVM_GUEST
+       default 500
+       help
+         Select this option if building a guest kernel for KVM to skip
+         RTC emulation when determining guest CPU Frequency.  Instead, the guest
+         processor frequency is automatically derived from the host frequency.
  choice
        prompt "Kernel page size"
        default PAGE_SIZE_4KB
@@@ -2014,6 -2038,7 +2029,7 @@@ config SB1_PASS_2_1_WORKAROUND
        depends on CPU_SB1 && CPU_SB1_PASS_2
        default y
  
  config 64BIT_PHYS_ADDR
        bool
  
@@@ -2547,3 -2572,5 +2563,5 @@@ source "security/Kconfig
  source "crypto/Kconfig"
  
  source "lib/Kconfig"
+ source "arch/mips/kvm/Kconfig"
index 952701c3ad2e844e70026a8d2b18ece4e2e6e3bb,c42562d801c5093636c075e72aa7884ab0f20e67..820116067c101070c6a4c35727d1e4cfb24563ee
  
  #ifdef CONFIG_MIPS_PGD_C0_CONTEXT
  
 -#define TLBMISS_HANDLER_SETUP_PGD(pgd)                                \
 -      tlbmiss_handler_setup_pgd((unsigned long)(pgd))
 -
 -extern void tlbmiss_handler_setup_pgd(unsigned long pgd);
 +#define TLBMISS_HANDLER_SETUP_PGD(pgd)                                        \
 +do {                                                                  \
 +      void (*tlbmiss_handler_setup_pgd)(unsigned long);               \
 +      extern u32 tlbmiss_handler_setup_pgd_array[16];                 \
 +                                                                      \
 +      tlbmiss_handler_setup_pgd =                                     \
 +              (__typeof__(tlbmiss_handler_setup_pgd)) tlbmiss_handler_setup_pgd_array; \
 +      tlbmiss_handler_setup_pgd((unsigned long)(pgd));                \
 +} while (0)
  
  #define TLBMISS_HANDLER_SETUP()                                               \
        do {                                                            \
@@@ -111,15 -106,21 +111,21 @@@ static inline void enter_lazy_tlb(struc
  static inline void
  get_new_mmu_context(struct mm_struct *mm, unsigned long cpu)
  {
+       extern void kvm_local_flush_tlb_all(void);
        unsigned long asid = asid_cache(cpu);
  
        if (! ((asid += ASID_INC) & ASID_MASK) ) {
                if (cpu_has_vtag_icache)
                        flush_icache_all();
+ #ifdef CONFIG_VIRTUALIZATION
+               kvm_local_flush_tlb_all();      /* start new asid cycle */
+ #else
                local_flush_tlb_all();  /* start new asid cycle */
+ #endif
                if (!asid)              /* fix version if needed */
                        asid = ASID_FIRST_VERSION;
        }
        cpu_context(cpu, mm) = asid_cache(cpu) = asid;
  }
  
@@@ -138,7 -139,7 +144,7 @@@ init_new_context(struct task_struct *ts
  {
        int i;
  
 -      for_each_online_cpu(i)
 +      for_each_possible_cpu(i)
                cpu_context(i, mm) = 0;
  
        return 0;
diff --combined arch/mips/kernel/traps.c
index 3b98b7b8487f42485b6f68e9e4731b70141c5f86,59351e5d05918062c20fcd56908abced59b7612f..7a99e60dadbd6da60dd6efdf1138ac8e9d94ff74
@@@ -60,9 -60,9 +60,9 @@@ extern void check_wait(void)
  extern asmlinkage void r4k_wait(void);
  extern asmlinkage void rollback_handle_int(void);
  extern asmlinkage void handle_int(void);
 -extern asmlinkage void handle_tlbm(void);
 -extern asmlinkage void handle_tlbl(void);
 -extern asmlinkage void handle_tlbs(void);
 +extern u32 handle_tlbl[];
 +extern u32 handle_tlbs[];
 +extern u32 handle_tlbm[];
  extern asmlinkage void handle_adel(void);
  extern asmlinkage void handle_ades(void);
  extern asmlinkage void handle_ibe(void);
@@@ -1390,8 -1390,9 +1390,8 @@@ unsigned long vi_handlers[64]
  void __init *set_except_vector(int n, void *addr)
  {
        unsigned long handler = (unsigned long) addr;
 -      unsigned long old_handler = exception_handlers[n];
 +      unsigned long old_handler = xchg(&exception_handlers[n], handler);
  
 -      exception_handlers[n] = handler;
        if (n == 0 && cpu_has_divec) {
                unsigned long jump_mask = ~((1 << 28) - 1);
                u32 *buf = (u32 *)(ebase + 0x200);
        return (void *)old_handler;
  }
  
 -static asmlinkage void do_default_vi(void)
 +static void do_default_vi(void)
  {
        show_regs(get_irq_regs());
        panic("Caught unexpected vectored interrupt.");
@@@ -1570,7 -1571,7 +1570,7 @@@ void __cpuinit per_cpu_trap_init(bool i
  #ifdef CONFIG_64BIT
        status_set |= ST0_FR|ST0_KX|ST0_SX|ST0_UX;
  #endif
 -      if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV)
 +      if (current_cpu_data.isa_level & MIPS_CPU_ISA_IV)
                status_set |= ST0_XX;
        if (cpu_has_dsp)
                status_set |= ST0_MX;
@@@ -1712,7 -1713,12 +1712,12 @@@ void __init trap_init(void
                ebase = (unsigned long)
                        __alloc_bootmem(size, 1 << fls(size), 0);
        } else {
-               ebase = CKSEG0;
+ #ifdef CONFIG_KVM_GUEST
+ #define KVM_GUEST_KSEG0     0x40000000
+         ebase = KVM_GUEST_KSEG0;
+ #else
+         ebase = CKSEG0;
+ #endif
                if (cpu_has_mips_r2)
                        ebase += (read_c0_ebase() & 0x3ffff000);
        }
diff --combined arch/mips/mm/c-r4k.c
index 2078915eacb9c9ff740ec2daa1a65274ad1de7a9,b5aedb2ea91453bcbf87c07381adc6fcf192ea03..96f4d5a6c21c8d9e5a75fc1f8246b374071df8e3
@@@ -136,7 -136,8 +136,8 @@@ static void __cpuinit r4k_blast_dcache_
                r4k_blast_dcache_page_indexed = blast_dcache64_page_indexed;
  }
  
- static void (* r4k_blast_dcache)(void);
+ void (* r4k_blast_dcache)(void);
+ EXPORT_SYMBOL(r4k_blast_dcache);
  
  static void __cpuinit r4k_blast_dcache_setup(void)
  {
@@@ -264,7 -265,8 +265,8 @@@ static void __cpuinit r4k_blast_icache_
                r4k_blast_icache_page_indexed = blast_icache64_page_indexed;
  }
  
- static void (* r4k_blast_icache)(void);
+ void (* r4k_blast_icache)(void);
+ EXPORT_SYMBOL(r4k_blast_icache);
  
  static void __cpuinit r4k_blast_icache_setup(void)
  {
@@@ -1247,8 -1249,10 +1249,8 @@@ static void __cpuinit setup_scache(void
                return;
  
        default:
 -              if (c->isa_level == MIPS_CPU_ISA_M32R1 ||
 -                  c->isa_level == MIPS_CPU_ISA_M32R2 ||
 -                  c->isa_level == MIPS_CPU_ISA_M64R1 ||
 -                  c->isa_level == MIPS_CPU_ISA_M64R2) {
 +              if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M32R2 |
 +                                  MIPS_CPU_ISA_M64R1 | MIPS_CPU_ISA_M64R2)) {
  #ifdef CONFIG_MIPS_CPU_SCACHE
                        if (mips_sc_init ()) {
                                scache_size = c->scache.ways * c->scache.sets * c->scache.linesz;
diff --combined virt/kvm/kvm_main.c
index f18013f09e68423d68d4033d1e22fe1f8701886b,845cd9cf5189b39e5926c5653a1de491ca322d02..1fc942048521085a960074affc2663d93a70e93e
@@@ -1541,38 -1541,21 +1541,38 @@@ int kvm_write_guest(struct kvm *kvm, gp
  }
  
  int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
 -                            gpa_t gpa)
 +                            gpa_t gpa, unsigned long len)
  {
        struct kvm_memslots *slots = kvm_memslots(kvm);
        int offset = offset_in_page(gpa);
 -      gfn_t gfn = gpa >> PAGE_SHIFT;
 +      gfn_t start_gfn = gpa >> PAGE_SHIFT;
 +      gfn_t end_gfn = (gpa + len - 1) >> PAGE_SHIFT;
 +      gfn_t nr_pages_needed = end_gfn - start_gfn + 1;
 +      gfn_t nr_pages_avail;
  
        ghc->gpa = gpa;
        ghc->generation = slots->generation;
 -      ghc->memslot = gfn_to_memslot(kvm, gfn);
 -      ghc->hva = gfn_to_hva_many(ghc->memslot, gfn, NULL);
 -      if (!kvm_is_error_hva(ghc->hva))
 +      ghc->len = len;
 +      ghc->memslot = gfn_to_memslot(kvm, start_gfn);
 +      ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail);
 +      if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) {
                ghc->hva += offset;
 -      else
 -              return -EFAULT;
 -
 +      } else {
 +              /*
 +               * If the requested region crosses two memslots, we still
 +               * verify that the entire region is valid here.
 +               */
 +              while (start_gfn <= end_gfn) {
 +                      ghc->memslot = gfn_to_memslot(kvm, start_gfn);
 +                      ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn,
 +                                                 &nr_pages_avail);
 +                      if (kvm_is_error_hva(ghc->hva))
 +                              return -EFAULT;
 +                      start_gfn += nr_pages_avail;
 +              }
 +              /* Use the slow path for cross page reads and writes. */
 +              ghc->memslot = NULL;
 +      }
        return 0;
  }
  EXPORT_SYMBOL_GPL(kvm_gfn_to_hva_cache_init);
@@@ -1583,13 -1566,8 +1583,13 @@@ int kvm_write_guest_cached(struct kvm *
        struct kvm_memslots *slots = kvm_memslots(kvm);
        int r;
  
 +      BUG_ON(len > ghc->len);
 +
        if (slots->generation != ghc->generation)
 -              kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa);
 +              kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len);
 +
 +      if (unlikely(!ghc->memslot))
 +              return kvm_write_guest(kvm, ghc->gpa, data, len);
  
        if (kvm_is_error_hva(ghc->hva))
                return -EFAULT;
@@@ -1609,13 -1587,8 +1609,13 @@@ int kvm_read_guest_cached(struct kvm *k
        struct kvm_memslots *slots = kvm_memslots(kvm);
        int r;
  
 +      BUG_ON(len > ghc->len);
 +
        if (slots->generation != ghc->generation)
 -              kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa);
 +              kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len);
 +
 +      if (unlikely(!ghc->memslot))
 +              return kvm_read_guest(kvm, ghc->gpa, data, len);
  
        if (kvm_is_error_hva(ghc->hva))
                return -EFAULT;
@@@ -1981,7 -1954,7 +1981,7 @@@ static long kvm_vcpu_ioctl(struct file 
        if (vcpu->kvm->mm != current->mm)
                return -EIO;
  
- #if defined(CONFIG_S390) || defined(CONFIG_PPC)
+ #if defined(CONFIG_S390) || defined(CONFIG_PPC) || defined(CONFIG_MIPS)
        /*
         * Special cases: vcpu ioctls that are asynchronous to vcpu execution,
         * so vcpu_load() would break it.