• Tiezhu Yang's avatar
    LoongArch: Define symbol 'fault' as a local label in fpu.S · 8f58c571
    Tiezhu Yang authored
    The initial aim is to silence the following objtool warnings:
    
      arch/loongarch/kernel/fpu.o: warning: objtool: _save_fp_context() falls through to next function fault()
      arch/loongarch/kernel/fpu.o: warning: objtool: _restore_fp_context() falls through to next function fault()
      arch/loongarch/kernel/fpu.o: warning: objtool: _save_lsx_context() falls through to next function fault()
      arch/loongarch/kernel/fpu.o: warning: objtool: _restore_lsx_context() falls through to next function fault()
      arch/loongarch/kernel/fpu.o: warning: objtool: _save_lasx_context() falls through to next function fault()
      arch/loongarch/kernel/fpu.o: warning: objtool: _restore_lasx_context() falls through to next function fault()
    
    Currently, SYM_FUNC_START()/SYM_FUNC_END() defines the symbol 'fault' as
    SYM_T_FUNC which is STT_FUNC, the objtool warnings are generated through
    the following code:
    
    tools/objtool/include/objtool/check.h:
    
    static inline struct symbol *insn_func(struct instruction *insn)
    {
    	struct symbol *sym = insn->sym;
    
    	if (sym && sym->type != STT_FUNC)
    		sym = NULL;
    
    	return sym;
    }
    
    tools/objtool/check.c:
    
    static int validate_branch(struct objtool_file *file, struct symbol *func,
    			   struct instruction *insn, struct insn_state state)
    {
    	...
    		if (func && insn_func(insn) && func != insn_func(insn)->pfunc) {
    	...
    			WARN("%s() falls through to next function %s()",
    			     func->name, insn_func(insn)->name);
    			return 1;
    		}
    	...
    }
    
    We can see that the fixup can be a local label in the following code:
    
    arch/loongarch/include/asm/asm-extable.h:
    	.pushsection	__ex_table, "a";		\
    	.balign		4;				\
    	.long		((insn) - .);			\
    	.long		((fixup) - .);			\
    	.short		(type);				\
    	.short		(data);				\
    	.popsection;
    
    	.macro		_asm_extable, insn, fixup
    	__ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0)
    	.endm
    
    Like arch/loongarch/lib/*.S, just define the symbol 'fault' as a local
    label in fpu.S.
    
    Before:
    
    $ readelf -s arch/loongarch/kernel/fpu.o | awk -F: /fault/'{print $2}'
     000000000000053c     8 FUNC    GLOBAL DEFAULT    1 fault
    
    After:
    
    $ readelf -s arch/loongarch/kernel/fpu.o | awk -F: /fault/'{print $2}'
     000000000000053c     0 NOTYPE  LOCAL  DEFAULT    1 .L_fpu_fault
    Co-developed-by: default avatarYouling Tang <tangyouling@loongson.cn>
    Signed-off-by: default avatarYouling Tang <tangyouling@loongson.cn>
    Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    8f58c571
fpu.S 14.3 KB