mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
x86/insn: Remove superfluous checks from instruction decoding routines
It's pointless checking if a particular part of an instruction is decoded before calling the routine responsible for decoding it as this check is duplicated in the routines itself. Streamline the code by removing the superfluous checks. No functional difference. Signed-off-by: Nikolay Borisov <nik.borisov@suse.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Link: https://lore.kernel.org/r/20240222111636.2214523-2-nik.borisov@suse.com
This commit is contained in:
parent
b401b62175
commit
427e1646f1
@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
|
|||||||
if (opcode->got)
|
if (opcode->got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->prefixes.got) {
|
ret = insn_get_prefixes(insn);
|
||||||
ret = insn_get_prefixes(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get first opcode */
|
/* Get first opcode */
|
||||||
op = get_next(insn_byte_t, insn);
|
op = get_next(insn_byte_t, insn);
|
||||||
@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
|
|||||||
if (modrm->got)
|
if (modrm->got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->opcode.got) {
|
ret = insn_get_opcode(insn);
|
||||||
ret = insn_get_opcode(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inat_has_modrm(insn->attr)) {
|
if (inat_has_modrm(insn->attr)) {
|
||||||
mod = get_next(insn_byte_t, insn);
|
mod = get_next(insn_byte_t, insn);
|
||||||
@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
|
|||||||
if (!insn->x86_64)
|
if (!insn->x86_64)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!modrm->got) {
|
ret = insn_get_modrm(insn);
|
||||||
ret = insn_get_modrm(insn);
|
if (ret)
|
||||||
if (ret)
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* For rip-relative instructions, the mod field (top 2 bits)
|
* For rip-relative instructions, the mod field (top 2 bits)
|
||||||
* is zero and the r/m field (bottom 3 bits) is 0x5.
|
* is zero and the r/m field (bottom 3 bits) is 0x5.
|
||||||
@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
|
|||||||
if (insn->sib.got)
|
if (insn->sib.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->modrm.got) {
|
ret = insn_get_modrm(insn);
|
||||||
ret = insn_get_modrm(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insn->modrm.nbytes) {
|
if (insn->modrm.nbytes) {
|
||||||
modrm = insn->modrm.bytes[0];
|
modrm = insn->modrm.bytes[0];
|
||||||
@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
|
|||||||
if (insn->displacement.got)
|
if (insn->displacement.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->sib.got) {
|
ret = insn_get_sib(insn);
|
||||||
ret = insn_get_sib(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insn->modrm.nbytes) {
|
if (insn->modrm.nbytes) {
|
||||||
/*
|
/*
|
||||||
@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
|
|||||||
if (insn->immediate.got)
|
if (insn->immediate.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->displacement.got) {
|
ret = insn_get_displacement(insn);
|
||||||
ret = insn_get_displacement(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inat_has_moffset(insn->attr)) {
|
if (inat_has_moffset(insn->attr)) {
|
||||||
if (!__get_moffset(insn))
|
if (!__get_moffset(insn))
|
||||||
@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
|
|||||||
if (insn->length)
|
if (insn->length)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->immediate.got) {
|
ret = insn_get_immediate(insn);
|
||||||
ret = insn_get_immediate(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
||||||
- (unsigned long)insn->kaddr);
|
- (unsigned long)insn->kaddr);
|
||||||
|
@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
|
|||||||
if (opcode->got)
|
if (opcode->got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->prefixes.got) {
|
ret = insn_get_prefixes(insn);
|
||||||
ret = insn_get_prefixes(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get first opcode */
|
/* Get first opcode */
|
||||||
op = get_next(insn_byte_t, insn);
|
op = get_next(insn_byte_t, insn);
|
||||||
@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
|
|||||||
if (modrm->got)
|
if (modrm->got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->opcode.got) {
|
ret = insn_get_opcode(insn);
|
||||||
ret = insn_get_opcode(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inat_has_modrm(insn->attr)) {
|
if (inat_has_modrm(insn->attr)) {
|
||||||
mod = get_next(insn_byte_t, insn);
|
mod = get_next(insn_byte_t, insn);
|
||||||
@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
|
|||||||
if (!insn->x86_64)
|
if (!insn->x86_64)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!modrm->got) {
|
ret = insn_get_modrm(insn);
|
||||||
ret = insn_get_modrm(insn);
|
if (ret)
|
||||||
if (ret)
|
return 0;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* For rip-relative instructions, the mod field (top 2 bits)
|
* For rip-relative instructions, the mod field (top 2 bits)
|
||||||
* is zero and the r/m field (bottom 3 bits) is 0x5.
|
* is zero and the r/m field (bottom 3 bits) is 0x5.
|
||||||
@ -417,11 +411,9 @@ int insn_get_sib(struct insn *insn)
|
|||||||
if (insn->sib.got)
|
if (insn->sib.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->modrm.got) {
|
ret = insn_get_modrm(insn);
|
||||||
ret = insn_get_modrm(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insn->modrm.nbytes) {
|
if (insn->modrm.nbytes) {
|
||||||
modrm = insn->modrm.bytes[0];
|
modrm = insn->modrm.bytes[0];
|
||||||
@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
|
|||||||
if (insn->displacement.got)
|
if (insn->displacement.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->sib.got) {
|
ret = insn_get_sib(insn);
|
||||||
ret = insn_get_sib(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insn->modrm.nbytes) {
|
if (insn->modrm.nbytes) {
|
||||||
/*
|
/*
|
||||||
@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
|
|||||||
if (insn->immediate.got)
|
if (insn->immediate.got)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->displacement.got) {
|
ret = insn_get_displacement(insn);
|
||||||
ret = insn_get_displacement(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inat_has_moffset(insn->attr)) {
|
if (inat_has_moffset(insn->attr)) {
|
||||||
if (!__get_moffset(insn))
|
if (!__get_moffset(insn))
|
||||||
@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
|
|||||||
if (insn->length)
|
if (insn->length)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!insn->immediate.got) {
|
ret = insn_get_immediate(insn);
|
||||||
ret = insn_get_immediate(insn);
|
if (ret)
|
||||||
if (ret)
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
||||||
- (unsigned long)insn->kaddr);
|
- (unsigned long)insn->kaddr);
|
||||||
|
Loading…
Reference in New Issue
Block a user