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
Unified · Split
| @@ -1306,6 +1306,16 @@ void show_user_instructions(struct pt_regs *regs) · 1305 unmodified lines | ||
| 1306 | 1306 | |
| 1307 | 1307 | pc = regs->nip - (instructions_to_print * 3 / 4 * sizeof(int)); |
| 1308 | 1308 | |
| 1309 | + /* | |
| 1310 | + * Make sure the NIP points at userspace, not kernel text/data or | |
| 1311 | + * elsewhere. | |
| 1312 | + */ | |
| 1313 | + if (!__access_ok(pc, instructions_to_print * sizeof(int), USER_DS)) { | |
| 1314 | + pr_info("%s[%d]: Bad NIP, not dumping instructions.\n", | |
| 1315 | + current->comm, current->pid); | |
| 1316 | + return; | |
| 1317 | + } | |
| 1318 | + | |
| 1309 | 1319 | pr_info("%s[%d]: code: ", current->comm, current->pid); |
| 1310 | 1320 | |
| 1311 | 1321 | for (i = 0; i < instructions_to_print; i++) { |
| @@ -28,12 +28,6 @@ static int __patch_instruction(unsigned int *exec_addr, unsigned int instr, · 27 unmodified lines | ||
| 28 | 28 | { |
| 29 | 29 | int err; |
| 30 | 30 | |
| 31 | − /* Make sure we aren't patching a freed init section */ | |
| 32 | − if (init_mem_is_free && init_section_contains(exec_addr, 4)) { | |
| 33 | − pr_debug("Skipping init section patching addr: 0x%px\n", exec_addr); | |
| 34 | − return 0; | |
| 35 | − } | |
| 36 | − | |
| 37 | 31 | __put_user_size(instr, patch_addr, 4, err); |
| 38 | 32 | if (err) |
| 39 | 33 | return err; |
| @@ -148,7 +142,7 @@ static inline int unmap_patch_area(unsigned long addr) · 108 unmodified lines | ||
| 148 | 142 | return 0; |
| 149 | 143 | } |
| 150 | 144 | |
| 151 | −int patch_instruction(unsigned int *addr, unsigned int instr) | |
| 145 | +static int do_patch_instruction(unsigned int *addr, unsigned int instr) | |
| 152 | 146 | { |
| 153 | 147 | int err; |
| 154 | 148 | unsigned int *patch_addr = NULL; |
| @@ -188,12 +182,22 @@ out: · 33 unmodified lines | ||
| 188 | 182 | } |
| 189 | 183 | #else /* !CONFIG_STRICT_KERNEL_RWX */ |
| 190 | 184 | |
| 191 | −int patch_instruction(unsigned int *addr, unsigned int instr) | |
| 185 | +static int do_patch_instruction(unsigned int *addr, unsigned int instr) | |
| 192 | 186 | { |
| 193 | 187 | return raw_patch_instruction(addr, instr); |
| 194 | 188 | } |
| 195 | 189 | |
| 196 | 190 | #endif /* CONFIG_STRICT_KERNEL_RWX */ |
| 191 | + | |
| 192 | +int patch_instruction(unsigned int *addr, unsigned int instr) | |
| 193 | +{ | |
| 194 | + /* Make sure we aren't patching a freed init section */ | |
| 195 | + if (init_mem_is_free && init_section_contains(addr, 4)) { | |
| 196 | + pr_debug("Skipping init section patching addr: 0x%px\n", addr); | |
| 197 | + return 0; | |
| 198 | + } | |
| 199 | + return do_patch_instruction(addr, instr); | |
| 200 | +} | |
| 197 | 201 | NOKPROBE_SYMBOL(patch_instruction); |
| 198 | 202 | |
| 199 | 203 | int patch_branch(unsigned int *addr, unsigned long target, int flags) |
| @@ -1217,9 +1217,10 @@ int find_and_online_cpu_nid(int cpu) · 1216 unmodified lines | ||
| 1217 | 1217 | * Need to ensure that NODE_DATA is initialized for a node from |
| 1218 | 1218 | * available memory (see memblock_alloc_try_nid). If unable to |
| 1219 | 1219 | * init the node, then default to nearest node that has memory |
| 1220 | − * installed. | |
| 1220 | + * installed. Skip onlining a node if the subsystems are not | |
| 1221 | + * yet initialized. | |
| 1221 | 1222 | */ |
| 1222 | − if (try_online_node(new_nid)) | |
| 1223 | + if (!topology_inited || try_online_node(new_nid)) | |
| 1223 | 1224 | new_nid = first_online_node; |
| 1224 | 1225 | #else |
| 1225 | 1226 | /* |
| @@ -15,7 +15,6 @@ · 14 unmodified lines | ||
| 15 | 15 | * but they are bigger and use more memory for the lookup table. |
| 16 | 16 | */ |
| 17 | 17 | |
| 18 | −#include <linux/crc32poly.h> | |
| 19 | 18 | #include "xz_private.h" |
| 20 | 19 | |
| 21 | 20 | /* |
| @@ -102,6 +102,10 @@ · 101 unmodified lines | ||
| 102 | 102 | # endif |
| 103 | 103 | #endif |
| 104 | 104 | |
| 105 | +#ifndef CRC32_POLY_LE | |
| 106 | +#define CRC32_POLY_LE 0xedb88320 | |
| 107 | +#endif | |
| 108 | + | |
| 105 | 109 | /* |
| 106 | 110 | * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used |
| 107 | 111 | * before calling xz_dec_lzma2_run(). |