Commit cd2093cb authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'powerpc-4.19-4' of https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Michael writes:
  "powerpc fixes for 4.19 #4

   Four regression fixes.

   A fix for a change to lib/xz which broke our zImage loader when
   building with XZ compression. OK'ed by Herbert who merged the
   original patch.

   The recent fix we did to avoid patching __init text broke some 32-bit
   machines, fix that.

   Our show_user_instructions() could be tricked into printing kernel
   memory, add a check to avoid that.

   And a fix for a change to our NUMA initialisation logic, which causes
   crashes in some kdump configurations.

   Thanks to:
     Christophe Leroy, Hari Bathini, Jann Horn, Joel Stanley, Meelis
     Roos, Murilo Opsfelder Araujo, Srikar Dronamraju."

* tag 'powerpc-4.19-4' of https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/numa: Skip onlining a offline node in kdump path
  powerpc: Don't print kernel instructions in show_user_instructions()
  powerpc/lib: fix book3s/32 boot failure due to code patching
  lib/xz: Put CRC32_POLY_LE in xz_private.h
parents c1d84a1b ac1788cc
...@@ -1306,6 +1306,16 @@ void show_user_instructions(struct pt_regs *regs) ...@@ -1306,6 +1306,16 @@ void show_user_instructions(struct pt_regs *regs)
pc = regs->nip - (instructions_to_print * 3 / 4 * sizeof(int)); pc = regs->nip - (instructions_to_print * 3 / 4 * sizeof(int));
/*
* Make sure the NIP points at userspace, not kernel text/data or
* elsewhere.
*/
if (!__access_ok(pc, instructions_to_print * sizeof(int), USER_DS)) {
pr_info("%s[%d]: Bad NIP, not dumping instructions.\n",
current->comm, current->pid);
return;
}
pr_info("%s[%d]: code: ", current->comm, current->pid); pr_info("%s[%d]: code: ", current->comm, current->pid);
for (i = 0; i < instructions_to_print; i++) { for (i = 0; i < instructions_to_print; i++) {
......
...@@ -28,12 +28,6 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, ...@@ -28,12 +28,6 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr,
{ {
int err; int err;
/* Make sure we aren't patching a freed init section */
if (init_mem_is_free && init_section_contains(exec_addr, 4)) {
pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr);
return 0;
}
__put_user_size(instr, patch_addr, 4, err); __put_user_size(instr, patch_addr, 4, err);
if (err) if (err)
return err; return err;
...@@ -148,7 +142,7 @@ static inline int unmap_patch_area(unsigned long addr) ...@@ -148,7 +142,7 @@ static inline int unmap_patch_area(unsigned long addr)
return 0; return 0;
} }
int patch_instruction(unsigned int *addr, unsigned int instr) static int do_patch_instruction(unsigned int *addr, unsigned int instr)
{ {
int err; int err;
unsigned int *patch_addr = NULL; unsigned int *patch_addr = NULL;
...@@ -188,12 +182,22 @@ int patch_instruction(unsigned int *addr, unsigned int instr) ...@@ -188,12 +182,22 @@ int patch_instruction(unsigned int *addr, unsigned int instr)
} }
#else /* !CONFIG_STRICT_KERNEL_RWX */ #else /* !CONFIG_STRICT_KERNEL_RWX */
int patch_instruction(unsigned int *addr, unsigned int instr) static int do_patch_instruction(unsigned int *addr, unsigned int instr)
{ {
return raw_patch_instruction(addr, instr); return raw_patch_instruction(addr, instr);
} }
#endif /* CONFIG_STRICT_KERNEL_RWX */ #endif /* CONFIG_STRICT_KERNEL_RWX */
int patch_instruction(unsigned int *addr, unsigned int instr)
{
/* Make sure we aren't patching a freed init section */
if (init_mem_is_free && init_section_contains(addr, 4)) {
pr_debug("Skipping init section patching addr: 0x%px\n", addr);
return 0;
}
return do_patch_instruction(addr, instr);
}
NOKPROBE_SYMBOL(patch_instruction); NOKPROBE_SYMBOL(patch_instruction);
int patch_branch(unsigned int *addr, unsigned long target, int flags) int patch_branch(unsigned int *addr, unsigned long target, int flags)
......
...@@ -1217,9 +1217,10 @@ int find_and_online_cpu_nid(int cpu) ...@@ -1217,9 +1217,10 @@ int find_and_online_cpu_nid(int cpu)
* Need to ensure that NODE_DATA is initialized for a node from * Need to ensure that NODE_DATA is initialized for a node from
* available memory (see memblock_alloc_try_nid). If unable to * available memory (see memblock_alloc_try_nid). If unable to
* init the node, then default to nearest node that has memory * init the node, then default to nearest node that has memory
* installed. * installed. Skip onlining a node if the subsystems are not
* yet initialized.
*/ */
if (try_online_node(new_nid)) if (!topology_inited || try_online_node(new_nid))
new_nid = first_online_node; new_nid = first_online_node;
#else #else
/* /*
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
* but they are bigger and use more memory for the lookup table. * but they are bigger and use more memory for the lookup table.
*/ */
#include <linux/crc32poly.h>
#include "xz_private.h" #include "xz_private.h"
/* /*
......
...@@ -102,6 +102,10 @@ ...@@ -102,6 +102,10 @@
# endif # endif
#endif #endif
#ifndef CRC32_POLY_LE
#define CRC32_POLY_LE 0xedb88320
#endif
/* /*
* Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used
* before calling xz_dec_lzma2_run(). * before calling xz_dec_lzma2_run().
......
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