]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Merge tag 'x86-paravirt-2020-10-12' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Oct 2020 22:15:24 +0000 (15:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Oct 2020 22:15:24 +0000 (15:15 -0700)
Pull x86 paravirt cleanup from Ingo Molnar:
 "Clean up the paravirt code after the removal of 32-bit Xen PV support"

* tag 'x86-paravirt-2020-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/paravirt: Avoid needless paravirt step clearing page table entries
  x86/paravirt: Remove set_pte_at() pv-op
  x86/entry/32: Simplify CONFIG_XEN_PV build dependency
  x86/paravirt: Use CONFIG_PARAVIRT_XXL instead of CONFIG_PARAVIRT
  x86/paravirt: Clean up paravirt macros
  x86/paravirt: Remove 32-bit support from CONFIG_PARAVIRT_XXL

1  2 
arch/x86/entry/entry_64.S
arch/x86/include/asm/idtentry.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/kprobes/core.c
arch/x86/kernel/kprobes/opt.c

Simple merge
Simple merge
Simple merge
index 882b95313ad64c0109513121e9bb945a188be98e,2ca10b770cfff081888f4bb198c035099ec293e4..db8f8693ab8d0f3eff78ddd0db3a293f0c3d10ce
@@@ -776,13 -775,115 +776,12 @@@ __used __visible void *trampoline_handl
        /* fixup registers */
        regs->cs = __KERNEL_CS;
  #ifdef CONFIG_X86_32
-       regs->cs |= get_kernel_rpl();
        regs->gs = 0;
  #endif
 -      /* We use pt_regs->sp for return address holder. */
 -      frame_pointer = &regs->sp;
 -      regs->ip = trampoline_address;
 +      regs->ip = (unsigned long)&kretprobe_trampoline;
        regs->orig_ax = ~0UL;
  
 -      /*
 -       * It is possible to have multiple instances associated with a given
 -       * task either because multiple functions in the call path have
 -       * return probes installed on them, and/or more than one
 -       * return probe was registered for a target function.
 -       *
 -       * We can handle this because:
 -       *     - instances are always pushed into the head of the list
 -       *     - when multiple return probes are registered for the same
 -       *       function, the (chronologically) first instance's ret_addr
 -       *       will be the real return address, and all the rest will
 -       *       point to kretprobe_trampoline.
 -       */
 -      hlist_for_each_entry(ri, head, hlist) {
 -              if (ri->task != current)
 -                      /* another task is sharing our hash bucket */
 -                      continue;
 -              /*
 -               * Return probes must be pushed on this hash list correct
 -               * order (same as return order) so that it can be popped
 -               * correctly. However, if we find it is pushed it incorrect
 -               * order, this means we find a function which should not be
 -               * probed, because the wrong order entry is pushed on the
 -               * path of processing other kretprobe itself.
 -               */
 -              if (ri->fp != frame_pointer) {
 -                      if (!skipped)
 -                              pr_warn("kretprobe is stacked incorrectly. Trying to fixup.\n");
 -                      skipped = true;
 -                      continue;
 -              }
 -
 -              orig_ret_address = (unsigned long)ri->ret_addr;
 -              if (skipped)
 -                      pr_warn("%ps must be blacklisted because of incorrect kretprobe order\n",
 -                              ri->rp->kp.addr);
 -
 -              if (orig_ret_address != trampoline_address)
 -                      /*
 -                       * This is the real return address. Any other
 -                       * instances associated with this task are for
 -                       * other calls deeper on the call stack
 -                       */
 -                      break;
 -      }
 -
 -      kretprobe_assert(ri, orig_ret_address, trampoline_address);
 -
 -      correct_ret_addr = ri->ret_addr;
 -      hlist_for_each_entry_safe(ri, tmp, head, hlist) {
 -              if (ri->task != current)
 -                      /* another task is sharing our hash bucket */
 -                      continue;
 -              if (ri->fp != frame_pointer)
 -                      continue;
 -
 -              orig_ret_address = (unsigned long)ri->ret_addr;
 -              if (ri->rp && ri->rp->handler) {
 -                      __this_cpu_write(current_kprobe, &ri->rp->kp);
 -                      ri->ret_addr = correct_ret_addr;
 -                      ri->rp->handler(ri, regs);
 -                      __this_cpu_write(current_kprobe, &kprobe_busy);
 -              }
 -
 -              recycle_rp_inst(ri, &empty_rp);
 -
 -              if (orig_ret_address != trampoline_address)
 -                      /*
 -                       * This is the real return address. Any other
 -                       * instances associated with this task are for
 -                       * other calls deeper on the call stack
 -                       */
 -                      break;
 -      }
 -
 -      kretprobe_hash_unlock(current, &flags);
 -
 -      kprobe_busy_end();
 -
 -      hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
 -              hlist_del(&ri->hlist);
 -              kfree(ri);
 -      }
 -      return (void *)orig_ret_address;
 +      return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline, &regs->sp);
  }
  NOKPROBE_SYMBOL(trampoline_handler);
  
Simple merge