mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 13:43:51 +00:00
Two changes to simplify the x86 decoder logic a bit.
Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmXu9zERHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1g63w//RlHznVWzZE6XrL3kKc0kKLNlzvHwD84h V/5UC+lMzFgirULxnnleOL4/GePoubv4NppOgFnpSLpynVbd+m3Fv5yg550LTdnu acus7IbF7KUVpVYdCUXZQohhS+aAdG3QsWcATuuvxQHTzaxrp5G5OWYWSKT6xb2X 2/oUq8oKXLC6XFNJVe8uEG6uqLx3U2AuUfgQ7uMRpZYiwCIeGTPBgXudL6yYhjIF TTHJ6kfTp+TeUnPX7WP2n0z917GrV5B4V/7jBcsMy90oHfAdqi+ibqgdO5hyiXgK s/jdSESoCXB6Hq108+R+hiq9NEe5GIv7472jaWLdsoq7lun85T/fHiME/HChOnZg yUZ/AeMQvhfpMxMFyomjObzTQAnHSwHZ8aqc1wG86+NoHACXwoWhhzvZ48zruhCj wxbn22p4E2fHq60++L24HaYIqi0C1tWNMr2i9xh9Beks6ZGHnPRK1FDXMwXu92fm LklAEu1aDIJA28RfDqH6vjY/I4dI0z2zP3foM42O0wOd5Kon1EIGk5U9Rs1R18+h NgoQFq0vpU+Y5wD2evgoUiaNnl90XI5KT+Jeq9VjNWswKN54ZSB94UprxK6uwPJ9 LH2QX2yS48nuecErjZ2qacXF7K8tj0o0FV1HB/v2dUzTF+s/IPnp/aP10+aUknIu sKPLbgiXS5E= =H9XK -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
73f0d1d7b4
@ -71,7 +71,7 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64)
|
||||
insn->kaddr = kaddr;
|
||||
insn->end_kaddr = kaddr + buf_len;
|
||||
insn->next_byte = kaddr;
|
||||
insn->x86_64 = x86_64 ? 1 : 0;
|
||||
insn->x86_64 = x86_64;
|
||||
insn->opnd_bytes = 4;
|
||||
if (x86_64)
|
||||
insn->addr_bytes = 8;
|
||||
@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
|
||||
if (opcode->got)
|
||||
return 0;
|
||||
|
||||
if (!insn->prefixes.got) {
|
||||
ret = insn_get_prefixes(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_prefixes(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Get first opcode */
|
||||
op = get_next(insn_byte_t, insn);
|
||||
@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
|
||||
if (modrm->got)
|
||||
return 0;
|
||||
|
||||
if (!insn->opcode.got) {
|
||||
ret = insn_get_opcode(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_opcode(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (inat_has_modrm(insn->attr)) {
|
||||
mod = get_next(insn_byte_t, insn);
|
||||
@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
|
||||
if (!insn->x86_64)
|
||||
return 0;
|
||||
|
||||
if (!modrm->got) {
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return 0;
|
||||
}
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return 0;
|
||||
/*
|
||||
* For rip-relative instructions, the mod field (top 2 bits)
|
||||
* 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)
|
||||
return 0;
|
||||
|
||||
if (!insn->modrm.got) {
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (insn->modrm.nbytes) {
|
||||
modrm = insn->modrm.bytes[0];
|
||||
@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
|
||||
if (insn->displacement.got)
|
||||
return 0;
|
||||
|
||||
if (!insn->sib.got) {
|
||||
ret = insn_get_sib(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_sib(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (insn->modrm.nbytes) {
|
||||
/*
|
||||
@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
|
||||
if (insn->immediate.got)
|
||||
return 0;
|
||||
|
||||
if (!insn->displacement.got) {
|
||||
ret = insn_get_displacement(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_displacement(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (inat_has_moffset(insn->attr)) {
|
||||
if (!__get_moffset(insn))
|
||||
@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
|
||||
if (insn->length)
|
||||
return 0;
|
||||
|
||||
if (!insn->immediate.got) {
|
||||
ret = insn_get_immediate(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_immediate(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
||||
- (unsigned long)insn->kaddr);
|
||||
|
@ -71,7 +71,7 @@ void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64)
|
||||
insn->kaddr = kaddr;
|
||||
insn->end_kaddr = kaddr + buf_len;
|
||||
insn->next_byte = kaddr;
|
||||
insn->x86_64 = x86_64 ? 1 : 0;
|
||||
insn->x86_64 = x86_64;
|
||||
insn->opnd_bytes = 4;
|
||||
if (x86_64)
|
||||
insn->addr_bytes = 8;
|
||||
@ -268,11 +268,9 @@ int insn_get_opcode(struct insn *insn)
|
||||
if (opcode->got)
|
||||
return 0;
|
||||
|
||||
if (!insn->prefixes.got) {
|
||||
ret = insn_get_prefixes(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_prefixes(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Get first opcode */
|
||||
op = get_next(insn_byte_t, insn);
|
||||
@ -339,11 +337,9 @@ int insn_get_modrm(struct insn *insn)
|
||||
if (modrm->got)
|
||||
return 0;
|
||||
|
||||
if (!insn->opcode.got) {
|
||||
ret = insn_get_opcode(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_opcode(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (inat_has_modrm(insn->attr)) {
|
||||
mod = get_next(insn_byte_t, insn);
|
||||
@ -386,11 +382,9 @@ int insn_rip_relative(struct insn *insn)
|
||||
if (!insn->x86_64)
|
||||
return 0;
|
||||
|
||||
if (!modrm->got) {
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return 0;
|
||||
}
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return 0;
|
||||
/*
|
||||
* For rip-relative instructions, the mod field (top 2 bits)
|
||||
* 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)
|
||||
return 0;
|
||||
|
||||
if (!insn->modrm.got) {
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_modrm(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (insn->modrm.nbytes) {
|
||||
modrm = insn->modrm.bytes[0];
|
||||
@ -460,11 +452,9 @@ int insn_get_displacement(struct insn *insn)
|
||||
if (insn->displacement.got)
|
||||
return 0;
|
||||
|
||||
if (!insn->sib.got) {
|
||||
ret = insn_get_sib(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_sib(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (insn->modrm.nbytes) {
|
||||
/*
|
||||
@ -628,11 +618,9 @@ int insn_get_immediate(struct insn *insn)
|
||||
if (insn->immediate.got)
|
||||
return 0;
|
||||
|
||||
if (!insn->displacement.got) {
|
||||
ret = insn_get_displacement(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_displacement(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (inat_has_moffset(insn->attr)) {
|
||||
if (!__get_moffset(insn))
|
||||
@ -703,11 +691,9 @@ int insn_get_length(struct insn *insn)
|
||||
if (insn->length)
|
||||
return 0;
|
||||
|
||||
if (!insn->immediate.got) {
|
||||
ret = insn_get_immediate(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = insn_get_immediate(insn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
insn->length = (unsigned char)((unsigned long)insn->next_byte
|
||||
- (unsigned long)insn->kaddr);
|
||||
|
Loading…
Reference in New Issue
Block a user