Merge tag 'nfsd-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
[linux-2.6-block.git] / include / linux / objtool.h
index 9ac3df3fccf0118412f1139521e5c954f0d890d9..03f82c2c2ebf6f00093097e9bffd9cf4ec4193d0 100644 (file)
@@ -2,47 +2,7 @@
 #ifndef _LINUX_OBJTOOL_H
 #define _LINUX_OBJTOOL_H
 
-#ifndef __ASSEMBLY__
-
-#include <linux/types.h>
-
-/*
- * This struct is used by asm and inline asm code to manually annotate the
- * location of registers on the stack.
- */
-struct unwind_hint {
-       u32             ip;
-       s16             sp_offset;
-       u8              sp_reg;
-       u8              type;
-       u8              signal;
-       u8              end;
-};
-#endif
-
-/*
- * UNWIND_HINT_TYPE_CALL: Indicates that sp_reg+sp_offset resolves to PREV_SP
- * (the caller's SP right before it made the call).  Used for all callable
- * functions, i.e. all C code and all callable asm functions.
- *
- * UNWIND_HINT_TYPE_REGS: Used in entry code to indicate that sp_reg+sp_offset
- * points to a fully populated pt_regs from a syscall, interrupt, or exception.
- *
- * UNWIND_HINT_TYPE_REGS_PARTIAL: Used in entry code to indicate that
- * sp_reg+sp_offset points to the iret return frame.
- *
- * UNWIND_HINT_FUNC: Generate the unwind metadata of a callable function.
- * Useful for code which doesn't have an ELF function annotation.
- *
- * UNWIND_HINT_ENTRY: machine entry without stack, SYSCALL/SYSENTER etc.
- */
-#define UNWIND_HINT_TYPE_CALL          0
-#define UNWIND_HINT_TYPE_REGS          1
-#define UNWIND_HINT_TYPE_REGS_PARTIAL  2
-#define UNWIND_HINT_TYPE_FUNC          3
-#define UNWIND_HINT_TYPE_ENTRY         4
-#define UNWIND_HINT_TYPE_SAVE          5
-#define UNWIND_HINT_TYPE_RESTORE       6
+#include <linux/objtool_types.h>
 
 #ifdef CONFIG_OBJTOOL
 
@@ -50,7 +10,7 @@ struct unwind_hint {
 
 #ifndef __ASSEMBLY__
 
-#define UNWIND_HINT(sp_reg, sp_offset, type, signal, end)      \
+#define UNWIND_HINT(type, sp_reg, sp_offset, signal)   \
        "987: \n\t"                                             \
        ".pushsection .discard.unwind_hints\n\t"                \
        /* struct unwind_hint */                                \
@@ -59,7 +19,6 @@ struct unwind_hint {
        ".byte " __stringify(sp_reg) "\n\t"                     \
        ".byte " __stringify(type) "\n\t"                       \
        ".byte " __stringify(signal) "\n\t"                     \
-       ".byte " __stringify(end) "\n\t"                        \
        ".balign 4 \n\t"                                        \
        ".popsection\n\t"
 
@@ -89,7 +48,7 @@ struct unwind_hint {
 #define ANNOTATE_NOENDBR                                       \
        "986: \n\t"                                             \
        ".pushsection .discard.noendbr\n\t"                     \
-       _ASM_PTR " 986b\n\t"                                    \
+       ".long 986b - .\n\t"                                    \
        ".popsection\n\t"
 
 #define ASM_REACHABLE                                                  \
@@ -107,7 +66,7 @@ struct unwind_hint {
 #define ANNOTATE_INTRA_FUNCTION_CALL                           \
        999:                                                    \
        .pushsection .discard.intra_function_calls;             \
-       .long 999b;                                             \
+       .long 999b - .;                                         \
        .popsection;
 
 /*
@@ -131,23 +90,22 @@ struct unwind_hint {
  * the debuginfo as necessary.  It will also warn if it sees any
  * inconsistencies.
  */
-.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0 end=0
-.Lunwind_hint_ip_\@:
+.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0
+.Lhere_\@:
        .pushsection .discard.unwind_hints
                /* struct unwind_hint */
-               .long .Lunwind_hint_ip_\@ - .
+               .long .Lhere_\@ - .
                .short \sp_offset
                .byte \sp_reg
                .byte \type
                .byte \signal
-               .byte \end
                .balign 4
        .popsection
 .endm
 
 .macro STACK_FRAME_NON_STANDARD func:req
        .pushsection .discard.func_stack_frame_non_standard, "aw"
-       _ASM_PTR \func
+       .long \func - .
        .popsection
 .endm
 
@@ -160,8 +118,24 @@ struct unwind_hint {
 .macro ANNOTATE_NOENDBR
 .Lhere_\@:
        .pushsection .discard.noendbr
-       .quad   .Lhere_\@
+       .long   .Lhere_\@ - .
+       .popsection
+.endm
+
+/*
+ * Use objtool to validate the entry requirement that all code paths do
+ * VALIDATE_UNRET_END before RET.
+ *
+ * NOTE: The macro must be used at the beginning of a global symbol, otherwise
+ * it will be ignored.
+ */
+.macro VALIDATE_UNRET_BEGIN
+#if defined(CONFIG_NOINSTR_VALIDATION) && defined(CONFIG_CPU_UNRET_ENTRY)
+.Lhere_\@:
+       .pushsection .discard.validate_unret
+       .long   .Lhere_\@ - .
        .popsection
+#endif
 .endm
 
 .macro REACHABLE
@@ -177,15 +151,14 @@ struct unwind_hint {
 
 #ifndef __ASSEMBLY__
 
-#define UNWIND_HINT(sp_reg, sp_offset, type, signal, end) \
-       "\n\t"
+#define UNWIND_HINT(type, sp_reg, sp_offset, signal) "\n\t"
 #define STACK_FRAME_NON_STANDARD(func)
 #define STACK_FRAME_NON_STANDARD_FP(func)
 #define ANNOTATE_NOENDBR
 #define ASM_REACHABLE
 #else
 #define ANNOTATE_INTRA_FUNCTION_CALL
-.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0 end=0
+.macro UNWIND_HINT type:req sp_reg=0 sp_offset=0 signal=0
 .endm
 .macro STACK_FRAME_NON_STANDARD func:req
 .endm