Merge tag 'objtool-core-2021-02-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull objtool updates from Thomas Gleixner: - Make objtool work for big-endian cross compiles - Make stack tracking via stack pointer memory operations match push/pop semantics to prepare for architectures w/o PUSH/POP instructions. - Add support for analyzing alternatives - Improve retpoline detection and handling - Improve assembly code coverage on x86 - Provide support for inlined stack switching * tag 'objtool-core-2021-02-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (33 commits) objtool: Support stack-swizzle objtool,x86: Additionally decode: mov %rsp, (%reg) x86/unwind/orc: Change REG_SP_INDIRECT x86/power: Support objtool validation in hibernate_asm_64.S x86/power: Move restore_registers() to top of the file x86/power: Annotate indirect branches as safe x86/acpi: Support objtool validation in wakeup_64.S x86/acpi: Annotate indirect branch as safe x86/ftrace: Support objtool vmlinux.o validation in ftrace_64.S x86/xen/pvh: Annotate indirect branch as safe x86/xen: Support objtool vmlinux.o validation in xen-head.S x86/xen: Support objtool validation in xen-asm.S objtool: Add xen_start_kernel() to noreturn list objtool: Combine UNWIND_HINT_RET_OFFSET and UNWIND_HINT_FUNC objtool: Add asm version of STACK_FRAME_NON_STANDARD objtool: Assume only ELF functions do sibling calls x86/ftrace: Add UNWIND_HINT_FUNC annotation for ftrace_stub objtool: Support retpoline jump detection for vmlinux.o objtool: Fix ".cold" section suffix check for newer versions of GCC objtool: Fix retpoline detection in asm code ...
This commit is contained in:
@@ -7,9 +7,12 @@
|
||||
* Copyright (C) IBM Corporation, 2009
|
||||
*/
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
/* insn_attr_t is defined in inat.h */
|
||||
#include "inat.h"
|
||||
|
||||
#if defined(__BYTE_ORDER) ? __BYTE_ORDER == __LITTLE_ENDIAN : defined(__LITTLE_ENDIAN)
|
||||
|
||||
struct insn_field {
|
||||
union {
|
||||
insn_value_t value;
|
||||
@@ -20,6 +23,48 @@ struct insn_field {
|
||||
unsigned char nbytes;
|
||||
};
|
||||
|
||||
static inline void insn_field_set(struct insn_field *p, insn_value_t v,
|
||||
unsigned char n)
|
||||
{
|
||||
p->value = v;
|
||||
p->nbytes = n;
|
||||
}
|
||||
|
||||
static inline void insn_set_byte(struct insn_field *p, unsigned char n,
|
||||
insn_byte_t v)
|
||||
{
|
||||
p->bytes[n] = v;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct insn_field {
|
||||
insn_value_t value;
|
||||
union {
|
||||
insn_value_t little;
|
||||
insn_byte_t bytes[4];
|
||||
};
|
||||
/* !0 if we've run insn_get_xxx() for this field */
|
||||
unsigned char got;
|
||||
unsigned char nbytes;
|
||||
};
|
||||
|
||||
static inline void insn_field_set(struct insn_field *p, insn_value_t v,
|
||||
unsigned char n)
|
||||
{
|
||||
p->value = v;
|
||||
p->little = __cpu_to_le32(v);
|
||||
p->nbytes = n;
|
||||
}
|
||||
|
||||
static inline void insn_set_byte(struct insn_field *p, unsigned char n,
|
||||
insn_byte_t v)
|
||||
{
|
||||
p->bytes[n] = v;
|
||||
p->value = __le32_to_cpu(p->little);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct insn {
|
||||
struct insn_field prefixes; /*
|
||||
* Prefixes
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
#define ORC_REG_MAX 15
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
/*
|
||||
* This struct is more or less a vastly simplified version of the DWARF Call
|
||||
* Frame Information standard. It contains only the necessary parts of DWARF
|
||||
@@ -51,10 +53,18 @@
|
||||
struct orc_entry {
|
||||
s16 sp_offset;
|
||||
s16 bp_offset;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
unsigned sp_reg:4;
|
||||
unsigned bp_reg:4;
|
||||
unsigned type:2;
|
||||
unsigned end:1;
|
||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
||||
unsigned bp_reg:4;
|
||||
unsigned sp_reg:4;
|
||||
unsigned unused:5;
|
||||
unsigned end:1;
|
||||
unsigned type:2;
|
||||
#endif
|
||||
} __packed;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
Reference in New Issue
Block a user