mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

While the GCC and Clang compilers already define __ASSEMBLER__ automatically when compiling assembly code, __ASSEMBLY__ is a macro that only gets defined by the Makefiles in the kernel. This can be very confusing when switching between userspace and kernelspace coding, or when dealing with UAPI headers that rather should use __ASSEMBLER__ instead. So let's standardize on the __ASSEMBLER__ macro that is provided by the compilers now. This is mostly a mechanical patch (done with a simple "sed -i" statement), with some manual tweaks in <asm/frame.h>, <asm/hw_irq.h> and <asm/setup.h> that mentioned this macro in comments with some missing underscores. Signed-off-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Cc: Brian Gerst <brgerst@gmail.com> Cc: Juergen Gross <jgross@suse.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kees Cook <keescook@chromium.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/20250314071013.1575167-38-thuth@redhat.com
41 lines
1.1 KiB
C
41 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_PGTABLE_INVERT_H
|
|
#define _ASM_PGTABLE_INVERT_H 1
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
/*
|
|
* A clear pte value is special, and doesn't get inverted.
|
|
*
|
|
* Note that even users that only pass a pgprot_t (rather
|
|
* than a full pte) won't trigger the special zero case,
|
|
* because even PAGE_NONE has _PAGE_PROTNONE | _PAGE_ACCESSED
|
|
* set. So the all zero case really is limited to just the
|
|
* cleared page table entry case.
|
|
*/
|
|
static inline bool __pte_needs_invert(u64 val)
|
|
{
|
|
return val && !(val & _PAGE_PRESENT);
|
|
}
|
|
|
|
/* Get a mask to xor with the page table entry to get the correct pfn. */
|
|
static inline u64 protnone_mask(u64 val)
|
|
{
|
|
return __pte_needs_invert(val) ? ~0ull : 0;
|
|
}
|
|
|
|
static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask)
|
|
{
|
|
/*
|
|
* When a PTE transitions from NONE to !NONE or vice-versa
|
|
* invert the PFN part to stop speculation.
|
|
* pte_pfn undoes this when needed.
|
|
*/
|
|
if (__pte_needs_invert(oldval) != __pte_needs_invert(val))
|
|
val = (val & ~mask) | (~val & mask);
|
|
return val;
|
|
}
|
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
|
#endif
|