mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
x86/insn: Simplify for_each_insn_prefix()
Use the new-found freedom of allowing variable declarions inside for() to simplify the for_each_insn_prefix() iterator to no longer need an external temporary. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
This commit is contained in:
@@ -29,11 +29,10 @@
|
||||
bool insn_has_rep_prefix(struct insn *insn)
|
||||
{
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
insn_get_prefixes(insn);
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
if (p == 0xf2 || p == 0xf3)
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -312,7 +312,6 @@ static inline int insn_offset_immediate(struct insn *insn)
|
||||
/**
|
||||
* for_each_insn_prefix() -- Iterate prefixes in the instruction
|
||||
* @insn: Pointer to struct insn.
|
||||
* @idx: Index storage.
|
||||
* @prefix: Prefix byte.
|
||||
*
|
||||
* Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix
|
||||
@@ -321,8 +320,8 @@ static inline int insn_offset_immediate(struct insn *insn)
|
||||
* Since prefixes.nbytes can be bigger than 4 if some prefixes
|
||||
* are repeated, it cannot be used for looping over the prefixes.
|
||||
*/
|
||||
#define for_each_insn_prefix(insn, idx, prefix) \
|
||||
for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
|
||||
#define for_each_insn_prefix(insn, prefix) \
|
||||
for (int idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
|
||||
|
||||
#define POP_SS_OPCODE 0x1f
|
||||
#define MOV_SREG_OPCODE 0x8e
|
||||
|
||||
@@ -141,7 +141,6 @@ bool can_boost(struct insn *insn, void *addr)
|
||||
{
|
||||
kprobe_opcode_t opcode;
|
||||
insn_byte_t prefix;
|
||||
int i;
|
||||
|
||||
if (search_exception_tables((unsigned long)addr))
|
||||
return false; /* Page fault may occur on this address. */
|
||||
@@ -154,7 +153,7 @@ bool can_boost(struct insn *insn, void *addr)
|
||||
if (insn->opcode.nbytes != 1)
|
||||
return false;
|
||||
|
||||
for_each_insn_prefix(insn, i, prefix) {
|
||||
for_each_insn_prefix(insn, prefix) {
|
||||
insn_attr_t attr;
|
||||
|
||||
attr = inat_get_opcode_attribute(prefix);
|
||||
|
||||
@@ -259,9 +259,8 @@ static volatile u32 good_2byte_insns[256 / 32] = {
|
||||
static bool is_prefix_bad(struct insn *insn)
|
||||
{
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
insn_attr_t attr;
|
||||
|
||||
attr = inat_get_opcode_attribute(p);
|
||||
@@ -1404,7 +1403,6 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
{
|
||||
u8 opc1 = OPCODE1(insn);
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
if (insn_is_nop(insn))
|
||||
goto setup;
|
||||
@@ -1437,7 +1435,7 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
* Intel and AMD behavior differ in 64-bit mode: Intel ignores 66 prefix.
|
||||
* No one uses these insns, reject any branch insns with such prefix.
|
||||
*/
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
if (p == 0x66)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
@@ -63,11 +63,10 @@ static bool is_string_insn(struct insn *insn)
|
||||
bool insn_has_rep_prefix(struct insn *insn)
|
||||
{
|
||||
insn_byte_t p;
|
||||
int i;
|
||||
|
||||
insn_get_prefixes(insn);
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
if (p == 0xf2 || p == 0xf3)
|
||||
return true;
|
||||
}
|
||||
@@ -92,13 +91,13 @@ bool insn_has_rep_prefix(struct insn *insn)
|
||||
static int get_seg_reg_override_idx(struct insn *insn)
|
||||
{
|
||||
int idx = INAT_SEG_REG_DEFAULT;
|
||||
int num_overrides = 0, i;
|
||||
int num_overrides = 0;
|
||||
insn_byte_t p;
|
||||
|
||||
insn_get_prefixes(insn);
|
||||
|
||||
/* Look for any segment override prefixes. */
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
insn_attr_t attr;
|
||||
|
||||
attr = inat_get_opcode_attribute(p);
|
||||
@@ -1701,7 +1700,6 @@ bool insn_is_nop(struct insn *insn)
|
||||
u8 sib = 0, sib_scale, sib_index, sib_base;
|
||||
u8 nrex, rex;
|
||||
u8 p, rep = 0;
|
||||
int i;
|
||||
|
||||
if ((nrex = insn->rex_prefix.nbytes)) {
|
||||
rex = insn->rex_prefix.bytes[nrex-1];
|
||||
@@ -1741,7 +1739,7 @@ bool insn_is_nop(struct insn *insn)
|
||||
modrm_rm = sib_base;
|
||||
}
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
if (p == 0xf3) /* REPE */
|
||||
rep = 1;
|
||||
}
|
||||
@@ -1789,7 +1787,7 @@ bool insn_is_nop(struct insn *insn)
|
||||
if (sib && (sib_scale != 0 || sib_index != 4)) /* (%reg, %eiz, 1) */
|
||||
return false;
|
||||
|
||||
for_each_insn_prefix(insn, i, p) {
|
||||
for_each_insn_prefix(insn, p) {
|
||||
if (p != 0x3e) /* DS */
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -312,7 +312,6 @@ static inline int insn_offset_immediate(struct insn *insn)
|
||||
/**
|
||||
* for_each_insn_prefix() -- Iterate prefixes in the instruction
|
||||
* @insn: Pointer to struct insn.
|
||||
* @idx: Index storage.
|
||||
* @prefix: Prefix byte.
|
||||
*
|
||||
* Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix
|
||||
@@ -321,8 +320,8 @@ static inline int insn_offset_immediate(struct insn *insn)
|
||||
* Since prefixes.nbytes can be bigger than 4 if some prefixes
|
||||
* are repeated, it cannot be used for looping over the prefixes.
|
||||
*/
|
||||
#define for_each_insn_prefix(insn, idx, prefix) \
|
||||
for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
|
||||
#define for_each_insn_prefix(insn, prefix) \
|
||||
for (int idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++)
|
||||
|
||||
#define POP_SS_OPCODE 0x1f
|
||||
#define MOV_SREG_OPCODE 0x8e
|
||||
|
||||
Reference in New Issue
Block a user