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

objtool: Decode unwind hint register depending on architecture

The set of registers that can be included in an unwind hint and their
encoding will depend on the architecture. Have arch specific code to
decode that register.

Signed-off-by: Julien Thierry <jthierry@redhat.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>

authored by

Julien Thierry and committed by
Josh Poimboeuf
edea9e6b ee819aed

+40 -26
+2
tools/objtool/arch.h
··· 88 88 89 89 const char *arch_nop_insn(int len); 90 90 91 + int arch_decode_hint_reg(struct instruction *insn, u8 sp_reg); 92 + 91 93 #endif /* _ARCH_H */
+37
tools/objtool/arch/x86/decode.c
··· 15 15 #include "../../elf.h" 16 16 #include "../../arch.h" 17 17 #include "../../warn.h" 18 + #include <asm/orc_types.h> 18 19 19 20 static unsigned char op_to_cfi_reg[][2] = { 20 21 {CFI_AX, CFI_R8}, ··· 583 582 } 584 583 585 584 return nops[len-1]; 585 + } 586 + 587 + int arch_decode_hint_reg(struct instruction *insn, u8 sp_reg) 588 + { 589 + struct cfi_reg *cfa = &insn->cfi.cfa; 590 + 591 + switch (sp_reg) { 592 + case ORC_REG_UNDEFINED: 593 + cfa->base = CFI_UNDEFINED; 594 + break; 595 + case ORC_REG_SP: 596 + cfa->base = CFI_SP; 597 + break; 598 + case ORC_REG_BP: 599 + cfa->base = CFI_BP; 600 + break; 601 + case ORC_REG_SP_INDIRECT: 602 + cfa->base = CFI_SP_INDIRECT; 603 + break; 604 + case ORC_REG_R10: 605 + cfa->base = CFI_R10; 606 + break; 607 + case ORC_REG_R13: 608 + cfa->base = CFI_R13; 609 + break; 610 + case ORC_REG_DI: 611 + cfa->base = CFI_DI; 612 + break; 613 + case ORC_REG_DX: 614 + cfa->base = CFI_DX; 615 + break; 616 + default: 617 + return -1; 618 + } 619 + 620 + return 0; 586 621 }
+1 -26
tools/objtool/check.c
··· 1367 1367 1368 1368 insn->hint = true; 1369 1369 1370 - switch (hint->sp_reg) { 1371 - case ORC_REG_UNDEFINED: 1372 - cfa->base = CFI_UNDEFINED; 1373 - break; 1374 - case ORC_REG_SP: 1375 - cfa->base = CFI_SP; 1376 - break; 1377 - case ORC_REG_BP: 1378 - cfa->base = CFI_BP; 1379 - break; 1380 - case ORC_REG_SP_INDIRECT: 1381 - cfa->base = CFI_SP_INDIRECT; 1382 - break; 1383 - case ORC_REG_R10: 1384 - cfa->base = CFI_R10; 1385 - break; 1386 - case ORC_REG_R13: 1387 - cfa->base = CFI_R13; 1388 - break; 1389 - case ORC_REG_DI: 1390 - cfa->base = CFI_DI; 1391 - break; 1392 - case ORC_REG_DX: 1393 - cfa->base = CFI_DX; 1394 - break; 1395 - default: 1370 + if (arch_decode_hint_reg(insn, hint->sp_reg)) { 1396 1371 WARN_FUNC("unsupported unwind_hint sp base reg %d", 1397 1372 insn->sec, insn->offset, hint->sp_reg); 1398 1373 return -1;