On 3/16/2021 1:26 PM, Yu, Yu-cheng wrote:
On 3/16/2021 1:15 PM, Peter Zijlstra wrote:
On Tue, Mar 16, 2021 at 01:05:30PM -0700, Yu, Yu-cheng wrote:
On 3/16/2021 12:57 PM, Peter Zijlstra wrote:
On Tue, Mar 16, 2021 at 10:12:39AM -0700, Yu, Yu-cheng wrote:
Alternatively, there is another compiler-defined macro _CET_ENDBR
that can
be used. We can put the following in calling.h:
#ifdef __CET__
#include <cet.h>
#else
#define _CET_ENDBR
#endif
and then use _CET_ENDBR in other files. How is that?
In the future, in case we have kernel-mode IBT, ENDBR macros are
also needed
for other assembly files.
Can we please call it IBT_ENDBR or just ENDBR. CET is a horrible name,
seeing how it is not specific.
_CET_ENDBR is from the compiler and we cannot change it. We can do:
#define ENDBR _CET_ENDBR
How is that?
Do we really want to include compiler headers? AFAICT it's not a
built-in. Also what about clang?
This thing seems trivial enough to build our own, it's a single damn
instruction. That also means we don't have to worry about changes to
header files we don't control.
Then, what about moving what I had earlier to vdso.h?
If we don't want __i386__ either, then make it two macros.
+.macro ENDBR
+#ifdef CONFIG_X86_CET
+#ifdef __i386__
+ endbr32
+#else
+ endbr64
+#endif
+#endif
+.endm
I will make it like the following:
diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h
index 98aa103eb4ab..4c0262dcb93d 100644
--- a/arch/x86/include/asm/vdso.h
+++ b/arch/x86/include/asm/vdso.h
@@ -52,6 +52,15 @@ extern int map_vdso_once(const struct vdso_image
*image, unsigned long addr);
extern bool fixup_vdso_exception(struct pt_regs *regs, int trapnr,
unsigned long error_code,
unsigned long fault_addr);
-#endif /* __ASSEMBLER__ */
+#else /* __ASSEMBLER__ */
+
+#ifdef CONFIG_X86_CET
+#define ENDBR64 endbr64
+#define ENDBR32 endbr32
+#else /*!CONFIG_X86_CET */
+#define ENDBR64
+#define ENDBR32
+#endif
+#endif /* __ASSEMBLER__ */
#endif /* _ASM_X86_VDSO_H */