Commit 5b129817 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86_urgent_for_v6.2_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Borislav Petkov:

 - Two fixes to correct how kprobes handles INT3 now that they're added
   by other functionality like the rethunks and not only kgdb

 - Remove __init section markings of two functions which are referenced
   by a function in the .text section

* tag 'x86_urgent_for_v6.2_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/kprobes: Fix optprobe optimization check with CONFIG_RETHUNK
  x86/kprobes: Fix kprobes instruction boudary check with CONFIG_RETHUNK
  x86/calldepth: Fix incorrect init section references
parents 95d248d1 63dc6325
...@@ -119,7 +119,7 @@ static bool is_coretext(const struct core_text *ct, void *addr) ...@@ -119,7 +119,7 @@ static bool is_coretext(const struct core_text *ct, void *addr)
return within_module_coretext(addr); return within_module_coretext(addr);
} }
static __init_or_module bool skip_addr(void *dest) static bool skip_addr(void *dest)
{ {
if (dest == error_entry) if (dest == error_entry)
return true; return true;
...@@ -181,7 +181,7 @@ static const u8 nops[] = { ...@@ -181,7 +181,7 @@ static const u8 nops[] = {
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
}; };
static __init_or_module void *patch_dest(void *dest, bool direct) static void *patch_dest(void *dest, bool direct)
{ {
unsigned int tsize = SKL_TMPL_SIZE; unsigned int tsize = SKL_TMPL_SIZE;
u8 *pad = dest - tsize; u8 *pad = dest - tsize;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/extable.h> #include <linux/extable.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/kgdb.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <linux/kasan.h> #include <linux/kasan.h>
#include <linux/moduleloader.h> #include <linux/moduleloader.h>
...@@ -281,12 +282,15 @@ static int can_probe(unsigned long paddr) ...@@ -281,12 +282,15 @@ static int can_probe(unsigned long paddr)
if (ret < 0) if (ret < 0)
return 0; return 0;
#ifdef CONFIG_KGDB
/* /*
* Another debugging subsystem might insert this breakpoint. * If there is a dynamically installed kgdb sw breakpoint,
* In that case, we can't recover it. * this function should not be probed.
*/ */
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE) if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
kgdb_has_hit_break(addr))
return 0; return 0;
#endif
addr += insn.length; addr += insn.length;
} }
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/extable.h> #include <linux/extable.h>
#include <linux/kdebug.h> #include <linux/kdebug.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/kgdb.h>
#include <linux/ftrace.h> #include <linux/ftrace.h>
#include <linux/objtool.h> #include <linux/objtool.h>
#include <linux/pgtable.h> #include <linux/pgtable.h>
...@@ -279,19 +280,6 @@ static int insn_is_indirect_jump(struct insn *insn) ...@@ -279,19 +280,6 @@ static int insn_is_indirect_jump(struct insn *insn)
return ret; return ret;
} }
static bool is_padding_int3(unsigned long addr, unsigned long eaddr)
{
unsigned char ops;
for (; addr < eaddr; addr++) {
if (get_kernel_nofault(ops, (void *)addr) < 0 ||
ops != INT3_INSN_OPCODE)
return false;
}
return true;
}
/* Decode whole function to ensure any instructions don't jump into target */ /* Decode whole function to ensure any instructions don't jump into target */
static int can_optimize(unsigned long paddr) static int can_optimize(unsigned long paddr)
{ {
...@@ -334,15 +322,15 @@ static int can_optimize(unsigned long paddr) ...@@ -334,15 +322,15 @@ static int can_optimize(unsigned long paddr)
ret = insn_decode_kernel(&insn, (void *)recovered_insn); ret = insn_decode_kernel(&insn, (void *)recovered_insn);
if (ret < 0) if (ret < 0)
return 0; return 0;
#ifdef CONFIG_KGDB
/* /*
* In the case of detecting unknown breakpoint, this could be * If there is a dynamically installed kgdb sw breakpoint,
* a padding INT3 between functions. Let's check that all the * this function should not be probed.
* rest of the bytes are also INT3.
*/ */
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE) if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
return is_padding_int3(addr, paddr - offset + size) ? 1 : 0; kgdb_has_hit_break(addr))
return 0;
#endif
/* Recover address */ /* Recover address */
insn.kaddr = (void *)addr; insn.kaddr = (void *)addr;
insn.next_byte = (void *)(addr + insn.length); insn.next_byte = (void *)(addr + insn.length);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment