Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: Add insn_decode_kernel()

Add a helper to decode kernel instructions; there's no point in
endlessly repeating those last two arguments.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210326151259.379242587@infradead.org

authored by

Peter Zijlstra and committed by
Borislav Petkov
52fa82c2 2304d14d

+10 -6
+2
arch/x86/include/asm/insn.h
··· 150 150 151 151 extern int insn_decode(struct insn *insn, const void *kaddr, int buf_len, enum insn_mode m); 152 152 153 + #define insn_decode_kernel(_insn, _ptr) insn_decode((_insn), (_ptr), MAX_INSN_SIZE, INSN_MODE_KERN) 154 + 153 155 /* Attribute will be determined after getting ModRM (for opcode groups) */ 154 156 static inline void insn_get_attribute(struct insn *insn) 155 157 {
+1 -1
arch/x86/kernel/alternative.c
··· 1280 1280 if (!emulate) 1281 1281 emulate = opcode; 1282 1282 1283 - ret = insn_decode(&insn, emulate, MAX_INSN_SIZE, INSN_MODE_KERN); 1283 + ret = insn_decode_kernel(&insn, emulate); 1284 1284 1285 1285 BUG_ON(ret < 0); 1286 1286 BUG_ON(len != insn.length);
+1 -1
arch/x86/kernel/cpu/mce/severity.c
··· 225 225 if (copy_from_kernel_nofault(insn_buf, (void *)regs->ip, MAX_INSN_SIZE)) 226 226 return false; 227 227 228 - ret = insn_decode(&insn, insn_buf, MAX_INSN_SIZE, INSN_MODE_KERN); 228 + ret = insn_decode_kernel(&insn, insn_buf); 229 229 if (ret < 0) 230 230 return false; 231 231
+2 -2
arch/x86/kernel/kprobes/core.c
··· 285 285 if (!__addr) 286 286 return 0; 287 287 288 - ret = insn_decode(&insn, (void *)__addr, MAX_INSN_SIZE, INSN_MODE_KERN); 288 + ret = insn_decode_kernel(&insn, (void *)__addr); 289 289 if (ret < 0) 290 290 return 0; 291 291 ··· 322 322 MAX_INSN_SIZE)) 323 323 return 0; 324 324 325 - ret = insn_decode(insn, dest, MAX_INSN_SIZE, INSN_MODE_KERN); 325 + ret = insn_decode_kernel(insn, dest); 326 326 if (ret < 0) 327 327 return 0; 328 328
+1 -1
arch/x86/kernel/kprobes/opt.c
··· 324 324 if (!recovered_insn) 325 325 return 0; 326 326 327 - ret = insn_decode(&insn, (void *)recovered_insn, MAX_INSN_SIZE, INSN_MODE_KERN); 327 + ret = insn_decode_kernel(&insn, (void *)recovered_insn); 328 328 if (ret < 0) 329 329 return 0; 330 330
+1 -1
arch/x86/kernel/traps.c
··· 504 504 MAX_INSN_SIZE)) 505 505 return GP_NO_HINT; 506 506 507 - ret = insn_decode(&insn, insn_buf, MAX_INSN_SIZE, INSN_MODE_KERN); 507 + ret = insn_decode_kernel(&insn, insn_buf); 508 508 if (ret < 0) 509 509 return GP_NO_HINT; 510 510
+2
tools/arch/x86/include/asm/insn.h
··· 150 150 151 151 extern int insn_decode(struct insn *insn, const void *kaddr, int buf_len, enum insn_mode m); 152 152 153 + #define insn_decode_kernel(_insn, _ptr) insn_decode((_insn), (_ptr), MAX_INSN_SIZE, INSN_MODE_KERN) 154 + 153 155 /* Attribute will be determined after getting ModRM (for opcode groups) */ 154 156 static inline void insn_get_attribute(struct insn *insn) 155 157 {