diff options
Diffstat (limited to 'tools/objtool/arch/x86/decode.c')
| -rw-r--r-- | tools/objtool/arch/x86/decode.c | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c index 3a1d80a7878d..ed6bff0e01dc 100644 --- a/tools/objtool/arch/x86/decode.c +++ b/tools/objtool/arch/x86/decode.c @@ -125,8 +125,14 @@ bool arch_pc_relative_reloc(struct reloc *reloc)  #define is_RIP()   ((modrm_rm & 7) == CFI_BP && modrm_mod == 0)  #define have_SIB() ((modrm_rm & 7) == CFI_SP && mod_is_mem()) +/* + * Check the ModRM register. If there is a SIB byte then check with + * the SIB base register. But if the SIB base is 5 (i.e. CFI_BP) and + * ModRM mod is 0 then there is no base register. + */  #define rm_is(reg) (have_SIB() ? \ -		    sib_base == (reg) && sib_index == CFI_SP : \ +		    sib_base == (reg) && sib_index == CFI_SP && \ +		    (sib_base != CFI_BP || modrm_mod != 0) :	\  		    modrm_rm == (reg))  #define rm_is_mem(reg)	(mod_is_mem() && !is_RIP() && rm_is(reg)) |