Skip to content

Commit 73f0d1d

Browse files
committed
Merge tag 'x86-asm-2024-03-11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 asm updates from Ingo Molnar: "Two changes to simplify the x86 decoder logic a bit" * tag 'x86-asm-2024-03-11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/insn: Directly assign x86_64 state in insn_init() x86/insn: Remove superfluous checks from instruction decoding routines
2 parents 89c572e + 07a5d4b commit 73f0d1d

File tree

2 files changed

+44
-72
lines changed

2 files changed

+44
-72
lines changed

arch/x86/lib/insn.c

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64)
7171
insn->kaddr = kaddr;
7272
insn->end_kaddr = kaddr + buf_len;
7373
insn->next_byte = kaddr;
74-
insn->x86_64 = x86_64 ? 1 : 0;
74+
insn->x86_64 = x86_64;
7575
insn->opnd_bytes = 4;
7676
if (x86_64)
7777
insn->addr_bytes = 8;
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
268268
if (opcode->got)
269269
return 0;
270270

271-
if (!insn->prefixes.got) {
272-
ret = insn_get_prefixes(insn);
273-
if (ret)
274-
return ret;
275-
}
271+
ret = insn_get_prefixes(insn);
272+
if (ret)
273+
return ret;
276274

277275
/* Get first opcode */
278276
op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
339337
if (modrm->got)
340338
return 0;
341339

342-
if (!insn->opcode.got) {
343-
ret = insn_get_opcode(insn);
344-
if (ret)
345-
return ret;
346-
}
340+
ret = insn_get_opcode(insn);
341+
if (ret)
342+
return ret;
347343

348344
if (inat_has_modrm(insn->attr)) {
349345
mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
386382
if (!insn->x86_64)
387383
return 0;
388384

389-
if (!modrm->got) {
390-
ret = insn_get_modrm(insn);
391-
if (ret)
392-
return 0;
393-
}
385+
ret = insn_get_modrm(insn);
386+
if (ret)
387+
return 0;
394388
/*
395389
* For rip-relative instructions, the mod field (top 2 bits)
396390
* is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
417411
if (insn->sib.got)
418412
return 0;
419413

420-
if (!insn->modrm.got) {
421-
ret = insn_get_modrm(insn);
422-
if (ret)
423-
return ret;
424-
}
414+
ret = insn_get_modrm(insn);
415+
if (ret)
416+
return ret;
425417

426418
if (insn->modrm.nbytes) {
427419
modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
460452
if (insn->displacement.got)
461453
return 0;
462454

463-
if (!insn->sib.got) {
464-
ret = insn_get_sib(insn);
465-
if (ret)
466-
return ret;
467-
}
455+
ret = insn_get_sib(insn);
456+
if (ret)
457+
return ret;
468458

469459
if (insn->modrm.nbytes) {
470460
/*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
628618
if (insn->immediate.got)
629619
return 0;
630620

631-
if (!insn->displacement.got) {
632-
ret = insn_get_displacement(insn);
633-
if (ret)
634-
return ret;
635-
}
621+
ret = insn_get_displacement(insn);
622+
if (ret)
623+
return ret;
636624

637625
if (inat_has_moffset(insn->attr)) {
638626
if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
703691
if (insn->length)
704692
return 0;
705693

706-
if (!insn->immediate.got) {
707-
ret = insn_get_immediate(insn);
708-
if (ret)
709-
return ret;
710-
}
694+
ret = insn_get_immediate(insn);
695+
if (ret)
696+
return ret;
711697

712698
insn->length = (unsigned char)((unsigned long)insn->next_byte
713699
- (unsigned long)insn->kaddr);

tools/arch/x86/lib/insn.c

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64)
7171
insn->kaddr = kaddr;
7272
insn->end_kaddr = kaddr + buf_len;
7373
insn->next_byte = kaddr;
74-
insn->x86_64 = x86_64 ? 1 : 0;
74+
insn->x86_64 = x86_64;
7575
insn->opnd_bytes = 4;
7676
if (x86_64)
7777
insn->addr_bytes = 8;
@@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
268268
if (opcode->got)
269269
return 0;
270270

271-
if (!insn->prefixes.got) {
272-
ret = insn_get_prefixes(insn);
273-
if (ret)
274-
return ret;
275-
}
271+
ret = insn_get_prefixes(insn);
272+
if (ret)
273+
return ret;
276274

277275
/* Get first opcode */
278276
op = get_next(insn_byte_t, insn);
@@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
339337
if (modrm->got)
340338
return 0;
341339

342-
if (!insn->opcode.got) {
343-
ret = insn_get_opcode(insn);
344-
if (ret)
345-
return ret;
346-
}
340+
ret = insn_get_opcode(insn);
341+
if (ret)
342+
return ret;
347343

348344
if (inat_has_modrm(insn->attr)) {
349345
mod = get_next(insn_byte_t, insn);
@@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
386382
if (!insn->x86_64)
387383
return 0;
388384

389-
if (!modrm->got) {
390-
ret = insn_get_modrm(insn);
391-
if (ret)
392-
return 0;
393-
}
385+
ret = insn_get_modrm(insn);
386+
if (ret)
387+
return 0;
394388
/*
395389
* For rip-relative instructions, the mod field (top 2 bits)
396390
* is zero and the r/m field (bottom 3 bits) is 0x5.
@@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
417411
if (insn->sib.got)
418412
return 0;
419413

420-
if (!insn->modrm.got) {
421-
ret = insn_get_modrm(insn);
422-
if (ret)
423-
return ret;
424-
}
414+
ret = insn_get_modrm(insn);
415+
if (ret)
416+
return ret;
425417

426418
if (insn->modrm.nbytes) {
427419
modrm = insn->modrm.bytes[0];
@@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
460452
if (insn->displacement.got)
461453
return 0;
462454

463-
if (!insn->sib.got) {
464-
ret = insn_get_sib(insn);
465-
if (ret)
466-
return ret;
467-
}
455+
ret = insn_get_sib(insn);
456+
if (ret)
457+
return ret;
468458

469459
if (insn->modrm.nbytes) {
470460
/*
@@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
628618
if (insn->immediate.got)
629619
return 0;
630620

631-
if (!insn->displacement.got) {
632-
ret = insn_get_displacement(insn);
633-
if (ret)
634-
return ret;
635-
}
621+
ret = insn_get_displacement(insn);
622+
if (ret)
623+
return ret;
636624

637625
if (inat_has_moffset(insn->attr)) {
638626
if (!__get_moffset(insn))
@@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
703691
if (insn->length)
704692
return 0;
705693

706-
if (!insn->immediate.got) {
707-
ret = insn_get_immediate(insn);
708-
if (ret)
709-
return ret;
710-
}
694+
ret = insn_get_immediate(insn);
695+
if (ret)
696+
return ret;
711697

712698
insn->length = (unsigned char)((unsigned long)insn->next_byte
713699
- (unsigned long)insn->kaddr);

0 commit comments

Comments
 (0)