On Tue, Mar 07, 2017 at 04:32:37PM -0800, Ricardo Neri wrote:
Other kernel submodules can benefit from using the utility functions defined in mpx.c to obtain the addresses and values of operands contained in the general purpose registers. An instance of this is the emulation code used for instructions protected by the Intel User-Mode Instruction Prevention feature.
Thus, these functions are relocated to a new insn-eval.c file. The reason to not relocate these utilities into insn.c is that the latter solely analyses instructions given by a struct insn without any knowledge of the meaning of the values of instruction operands. This new utility insn- eval.c aims to be used to resolve effective and userspace linear addresses based on the contents of the instruction operands as well as the contents of pt_regs structure.
These utilities come with a separate header. This is to avoid taking insn.c out of sync from the instructions decoders under tools/obj and tools/perf. This also avoids adding cumbersome #ifdef's for the #include'd files required to decode instructions in a kernel context.
Functions are simply relocated. There are not functional or indentation changes.
...
- case REG_TYPE_BASE:
regno = X86_SIB_BASE(insn->sib.value);
/*
* If mod is 0 and register R/EBP (regno=5) is indicated in the
* base part of the SIB byte, the value of such register should
* not be used in the address computation. Also, a 32-bit
* displacement is expected in this case; the instruction
* decoder takes care of it. This is true for both R13 and
* R/EBP as REX.B will not be decoded.
*/
if (regno == 5 && X86_MODRM_MOD(insn->modrm.value) == 0)
return -EDOM;
if (X86_REX_B(insn->rex_prefix.value))
regno += 8;
break;
- default:
pr_err("invalid register type");
BUG();
WARNING: Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON() #211: FILE: arch/x86/lib/insn-eval.c:90: + BUG();
And checkpatch is kinda right. We need to warn here, not explode. Oh and that function returns negative values on error...
Please change that with a patch ontop of the move.
Thanks.