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

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>

+13 -21
+1 -2
arch/x86/boot/compressed/sev-handle-vc.c
··· 29 29 bool insn_has_rep_prefix(struct insn *insn) 30 30 { 31 31 insn_byte_t p; 32 - int i; 33 32 34 33 insn_get_prefixes(insn); 35 34 36 - for_each_insn_prefix(insn, i, p) { 35 + for_each_insn_prefix(insn, p) { 37 36 if (p == 0xf2 || p == 0xf3) 38 37 return true; 39 38 }
+2 -3
arch/x86/include/asm/insn.h
··· 312 312 /** 313 313 * for_each_insn_prefix() -- Iterate prefixes in the instruction 314 314 * @insn: Pointer to struct insn. 315 - * @idx: Index storage. 316 315 * @prefix: Prefix byte. 317 316 * 318 317 * Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix ··· 320 321 * Since prefixes.nbytes can be bigger than 4 if some prefixes 321 322 * are repeated, it cannot be used for looping over the prefixes. 322 323 */ 323 - #define for_each_insn_prefix(insn, idx, prefix) \ 324 - for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++) 324 + #define for_each_insn_prefix(insn, prefix) \ 325 + for (int idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++) 325 326 326 327 #define POP_SS_OPCODE 0x1f 327 328 #define MOV_SREG_OPCODE 0x8e
+1 -2
arch/x86/kernel/kprobes/core.c
··· 141 141 { 142 142 kprobe_opcode_t opcode; 143 143 insn_byte_t prefix; 144 - int i; 145 144 146 145 if (search_exception_tables((unsigned long)addr)) 147 146 return false; /* Page fault may occur on this address. */ ··· 153 154 if (insn->opcode.nbytes != 1) 154 155 return false; 155 156 156 - for_each_insn_prefix(insn, i, prefix) { 157 + for_each_insn_prefix(insn, prefix) { 157 158 insn_attr_t attr; 158 159 159 160 attr = inat_get_opcode_attribute(prefix);
+2 -4
arch/x86/kernel/uprobes.c
··· 259 259 static bool is_prefix_bad(struct insn *insn) 260 260 { 261 261 insn_byte_t p; 262 - int i; 263 262 264 - for_each_insn_prefix(insn, i, p) { 263 + for_each_insn_prefix(insn, p) { 265 264 insn_attr_t attr; 266 265 267 266 attr = inat_get_opcode_attribute(p); ··· 1403 1404 { 1404 1405 u8 opc1 = OPCODE1(insn); 1405 1406 insn_byte_t p; 1406 - int i; 1407 1407 1408 1408 if (insn_is_nop(insn)) 1409 1409 goto setup; ··· 1435 1437 * Intel and AMD behavior differ in 64-bit mode: Intel ignores 66 prefix. 1436 1438 * No one uses these insns, reject any branch insns with such prefix. 1437 1439 */ 1438 - for_each_insn_prefix(insn, i, p) { 1440 + for_each_insn_prefix(insn, p) { 1439 1441 if (p == 0x66) 1440 1442 return -ENOTSUPP; 1441 1443 }
+5 -7
arch/x86/lib/insn-eval.c
··· 63 63 bool insn_has_rep_prefix(struct insn *insn) 64 64 { 65 65 insn_byte_t p; 66 - int i; 67 66 68 67 insn_get_prefixes(insn); 69 68 70 - for_each_insn_prefix(insn, i, p) { 69 + for_each_insn_prefix(insn, p) { 71 70 if (p == 0xf2 || p == 0xf3) 72 71 return true; 73 72 } ··· 91 92 static int get_seg_reg_override_idx(struct insn *insn) 92 93 { 93 94 int idx = INAT_SEG_REG_DEFAULT; 94 - int num_overrides = 0, i; 95 + int num_overrides = 0; 95 96 insn_byte_t p; 96 97 97 98 insn_get_prefixes(insn); 98 99 99 100 /* Look for any segment override prefixes. */ 100 - for_each_insn_prefix(insn, i, p) { 101 + for_each_insn_prefix(insn, p) { 101 102 insn_attr_t attr; 102 103 103 104 attr = inat_get_opcode_attribute(p); ··· 1700 1701 u8 sib = 0, sib_scale, sib_index, sib_base; 1701 1702 u8 nrex, rex; 1702 1703 u8 p, rep = 0; 1703 - int i; 1704 1704 1705 1705 if ((nrex = insn->rex_prefix.nbytes)) { 1706 1706 rex = insn->rex_prefix.bytes[nrex-1]; ··· 1739 1741 modrm_rm = sib_base; 1740 1742 } 1741 1743 1742 - for_each_insn_prefix(insn, i, p) { 1744 + for_each_insn_prefix(insn, p) { 1743 1745 if (p == 0xf3) /* REPE */ 1744 1746 rep = 1; 1745 1747 } ··· 1787 1789 if (sib && (sib_scale != 0 || sib_index != 4)) /* (%reg, %eiz, 1) */ 1788 1790 return false; 1789 1791 1790 - for_each_insn_prefix(insn, i, p) { 1792 + for_each_insn_prefix(insn, p) { 1791 1793 if (p != 0x3e) /* DS */ 1792 1794 return false; 1793 1795 }
+2 -3
tools/arch/x86/include/asm/insn.h
··· 312 312 /** 313 313 * for_each_insn_prefix() -- Iterate prefixes in the instruction 314 314 * @insn: Pointer to struct insn. 315 - * @idx: Index storage. 316 315 * @prefix: Prefix byte. 317 316 * 318 317 * Iterate prefix bytes of given @insn. Each prefix byte is stored in @prefix ··· 320 321 * Since prefixes.nbytes can be bigger than 4 if some prefixes 321 322 * are repeated, it cannot be used for looping over the prefixes. 322 323 */ 323 - #define for_each_insn_prefix(insn, idx, prefix) \ 324 - for (idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++) 324 + #define for_each_insn_prefix(insn, prefix) \ 325 + for (int idx = 0; idx < ARRAY_SIZE(insn->prefixes.bytes) && (prefix = insn->prefixes.bytes[idx]) != 0; idx++) 325 326 326 327 #define POP_SS_OPCODE 0x1f 327 328 #define MOV_SREG_OPCODE 0x8e