Merge tag 'loongarch-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
Pull LoongArch updates from Huacai Chen: - Fix objtool about do_syscall() and Clang - Enable generic CPU vulnerabilites support - Enable ACPI BGRT handling - Rework CPU feature probe from CPUCFG/IOCSR - Add ARCH_HAS_SET_MEMORY support - Add ARCH_HAS_SET_DIRECT_MAP support - Improve hardware page table walker - Simplify _percpu_read() and _percpu_write() - Add advanced extended IRQ model documentions - Some bug fixes and other small changes * tag 'loongarch-6.12' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson: Docs/LoongArch: Add advanced extended IRQ model description LoongArch: Remove posix_types.h include from sigcontext.h LoongArch: Fix memleak in pci_acpi_scan_root() LoongArch: Simplify _percpu_read() and _percpu_write() LoongArch: Improve hardware page table walker LoongArch: Add ARCH_HAS_SET_DIRECT_MAP support LoongArch: Add ARCH_HAS_SET_MEMORY support LoongArch: Rework CPU feature probe from CPUCFG/IOCSR LoongArch: Enable ACPI BGRT handling LoongArch: Enable generic CPU vulnerabilites support LoongArch: Remove STACK_FRAME_NON_STANDARD(do_syscall) LoongArch: Set AS_HAS_THIN_ADD_SUB as y if AS_IS_LLVM LoongArch: Enable objtool for Clang objtool: Handle frame pointer related instructions
This commit is contained in:
@@ -122,7 +122,7 @@ static bool decode_insn_reg2i12_fomat(union loongarch_instruction inst,
|
||||
switch (inst.reg2i12_format.opcode) {
|
||||
case addid_op:
|
||||
if ((inst.reg2i12_format.rd == CFI_SP) || (inst.reg2i12_format.rj == CFI_SP)) {
|
||||
/* addi.d sp,sp,si12 or addi.d fp,sp,si12 */
|
||||
/* addi.d sp,sp,si12 or addi.d fp,sp,si12 or addi.d sp,fp,si12 */
|
||||
insn->immediate = sign_extend64(inst.reg2i12_format.immediate, 11);
|
||||
ADD_OP(op) {
|
||||
op->src.type = OP_SRC_ADD;
|
||||
@@ -132,6 +132,15 @@ static bool decode_insn_reg2i12_fomat(union loongarch_instruction inst,
|
||||
op->dest.reg = inst.reg2i12_format.rd;
|
||||
}
|
||||
}
|
||||
if ((inst.reg2i12_format.rd == CFI_SP) && (inst.reg2i12_format.rj == CFI_FP)) {
|
||||
/* addi.d sp,fp,si12 */
|
||||
struct symbol *func = find_func_containing(insn->sec, insn->offset);
|
||||
|
||||
if (!func)
|
||||
return false;
|
||||
|
||||
func->frame_pointer = true;
|
||||
}
|
||||
break;
|
||||
case ldd_op:
|
||||
if (inst.reg2i12_format.rj == CFI_SP) {
|
||||
|
||||
+20
-3
@@ -3043,10 +3043,27 @@ static int update_cfi_state(struct instruction *insn,
|
||||
break;
|
||||
}
|
||||
|
||||
if (op->dest.reg == CFI_SP && op->src.reg == CFI_BP) {
|
||||
if (op->dest.reg == CFI_BP && op->src.reg == CFI_SP &&
|
||||
insn->sym->frame_pointer) {
|
||||
/* addi.d fp,sp,imm on LoongArch */
|
||||
if (cfa->base == CFI_SP && cfa->offset == op->src.offset) {
|
||||
cfa->base = CFI_BP;
|
||||
cfa->offset = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* lea disp(%rbp), %rsp */
|
||||
cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset);
|
||||
if (op->dest.reg == CFI_SP && op->src.reg == CFI_BP) {
|
||||
/* addi.d sp,fp,imm on LoongArch */
|
||||
if (cfa->base == CFI_BP && cfa->offset == 0) {
|
||||
if (insn->sym->frame_pointer) {
|
||||
cfa->base = CFI_SP;
|
||||
cfa->offset = -op->src.offset;
|
||||
}
|
||||
} else {
|
||||
/* lea disp(%rbp), %rsp */
|
||||
cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ struct symbol {
|
||||
u8 warned : 1;
|
||||
u8 embedded_insn : 1;
|
||||
u8 local_label : 1;
|
||||
u8 frame_pointer : 1;
|
||||
struct list_head pv_target;
|
||||
struct reloc *relocs;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user