[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220429203644.2868448-16-samitolvanen@google.com>
Date: Fri, 29 Apr 2022 13:36:38 -0700
From: Sami Tolvanen <samitolvanen@...gle.com>
To: linux-kernel@...r.kernel.org
Cc: Kees Cook <keescook@...omium.org>,
Josh Poimboeuf <jpoimboe@...hat.com>,
Peter Zijlstra <peterz@...radead.org>, x86@...nel.org,
Catalin Marinas <catalin.marinas@....com>,
Will Deacon <will@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Nathan Chancellor <nathan@...nel.org>,
Nick Desaulniers <ndesaulniers@...gle.com>,
Joao Moreira <joao@...rdrivepizza.com>,
Sedat Dilek <sedat.dilek@...il.com>,
Steven Rostedt <rostedt@...dmis.org>,
linux-hardening@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, llvm@...ts.linux.dev,
Sami Tolvanen <samitolvanen@...gle.com>
Subject: [RFC PATCH 15/21] static_call: Use cfi_unchecked
With CONFIG_HAVE_STATIC_CALL, static calls are patched into direct
calls. Disable indirect call CFI checking for the call sites with the
cfi_unchecked macro.
Signed-off-by: Sami Tolvanen <samitolvanen@...gle.com>
---
include/linux/static_call.h | 6 ++++--
include/linux/static_call_types.h | 9 ++++++---
tools/include/linux/static_call_types.h | 13 ++++++++-----
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/include/linux/static_call.h b/include/linux/static_call.h
index 7f1219fb98cf..f666c841b718 100644
--- a/include/linux/static_call.h
+++ b/include/linux/static_call.h
@@ -204,7 +204,8 @@ extern long __static_call_return0(void);
}; \
ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name)
-#define static_call_cond(name, args...) (void)__static_call(name)(args)
+#define static_call_cond(name, args...) \
+ (void)cfi_unchecked(__static_call(name)(args))
#define EXPORT_STATIC_CALL(name) \
EXPORT_SYMBOL(STATIC_CALL_KEY(name)); \
@@ -246,7 +247,8 @@ static inline int static_call_init(void) { return 0; }
}; \
ARCH_DEFINE_STATIC_CALL_RET0_TRAMP(name)
-#define static_call_cond(name, args...) (void)__static_call(name)(args)
+#define static_call_cond(name, args...) \
+ (void)cfi_unchecked(__static_call(name)(args))
static inline
void __static_call_update(struct static_call_key *key, void *tramp, void *func)
diff --git a/include/linux/static_call_types.h b/include/linux/static_call_types.h
index 7e1ce240a2cd..faebc1412c86 100644
--- a/include/linux/static_call_types.h
+++ b/include/linux/static_call_types.h
@@ -81,13 +81,16 @@ struct static_call_key {
#ifdef MODULE
#define __STATIC_CALL_MOD_ADDRESSABLE(name)
-#define static_call_mod(name, args...) __raw_static_call(name)(args)
+#define static_call_mod(name, args...) \
+ cfi_unchecked(__raw_static_call(name)(args))
#else
#define __STATIC_CALL_MOD_ADDRESSABLE(name) __STATIC_CALL_ADDRESSABLE(name)
-#define static_call_mod(name, args...) __static_call(name)(args)
+#define static_call_mod(name, args...) \
+ cfi_unchecked(__static_call(name)(args))
#endif
-#define static_call(name, args...) __static_call(name)(args)
+#define static_call(name, args...) \
+ cfi_unchecked(__static_call(name)(args))
#else
diff --git a/tools/include/linux/static_call_types.h b/tools/include/linux/static_call_types.h
index 5a00b8b2cf9f..faebc1412c86 100644
--- a/tools/include/linux/static_call_types.h
+++ b/tools/include/linux/static_call_types.h
@@ -81,13 +81,16 @@ struct static_call_key {
#ifdef MODULE
#define __STATIC_CALL_MOD_ADDRESSABLE(name)
-#define static_call_mod(name) __raw_static_call(name)
+#define static_call_mod(name, args...) \
+ cfi_unchecked(__raw_static_call(name)(args))
#else
#define __STATIC_CALL_MOD_ADDRESSABLE(name) __STATIC_CALL_ADDRESSABLE(name)
-#define static_call_mod(name) __static_call(name)
+#define static_call_mod(name, args...) \
+ cfi_unchecked(__static_call(name)(args))
#endif
-#define static_call(name) __static_call(name)
+#define static_call(name, args...) \
+ cfi_unchecked(__static_call(name)(args))
#else
@@ -95,8 +98,8 @@ struct static_call_key {
void *func;
};
-#define static_call(name) \
- ((typeof(STATIC_CALL_TRAMP(name))*)(STATIC_CALL_KEY(name).func))
+#define static_call(name, args...) \
+ ((typeof(STATIC_CALL_TRAMP(name))*)(STATIC_CALL_KEY(name).func))(args)
#endif /* CONFIG_HAVE_STATIC_CALL */
--
2.36.0.464.gb9c8b46e94-goog
Powered by blists - more mailing lists