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
95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_PAGE_H
|
|
#define _ASM_X86_PAGE_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <asm/page_types.h>
|
|
|
|
#ifdef CONFIG_X86_64
|
|
#include <asm/page_64.h>
|
|
#else
|
|
#include <asm/page_32.h>
|
|
#endif /* CONFIG_X86_64 */
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
struct page;
|
|
|
|
#include <linux/range.h>
|
|
extern struct range pfn_mapped[];
|
|
extern int nr_pfn_mapped;
|
|
|
|
static inline void clear_user_page(void *page, unsigned long vaddr,
|
|
struct page *pg)
|
|
{
|
|
clear_page(page);
|
|
}
|
|
|
|
static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
|
|
struct page *topage)
|
|
{
|
|
copy_page(to, from);
|
|
}
|
|
|
|
#define vma_alloc_zeroed_movable_folio(vma, vaddr) \
|
|
vma_alloc_folio(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, 0, vma, vaddr)
|
|
|
|
#ifndef __pa
|
|
#define __pa(x) __phys_addr((unsigned long)(x))
|
|
#endif
|
|
|
|
#define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x))
|
|
/* __pa_symbol should be used for C visible symbols.
|
|
This seems to be the official gcc blessed way to do such arithmetic. */
|
|
/*
|
|
* We need __phys_reloc_hide() here because gcc may assume that there is no
|
|
* overflow during __pa() calculation and can optimize it unexpectedly.
|
|
* Newer versions of gcc provide -fno-strict-overflow switch to handle this
|
|
* case properly. Once all supported versions of gcc understand it, we can
|
|
* remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated)
|
|
*/
|
|
#define __pa_symbol(x) \
|
|
__phys_addr_symbol(__phys_reloc_hide((unsigned long)(x)))
|
|
|
|
#ifndef __va
|
|
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
|
|
#endif
|
|
|
|
#define __boot_va(x) __va(x)
|
|
#define __boot_pa(x) __pa(x)
|
|
|
|
/*
|
|
* virt_to_page(kaddr) returns a valid pointer if and only if
|
|
* virt_addr_valid(kaddr) returns true.
|
|
*/
|
|
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
|
extern bool __virt_addr_valid(unsigned long kaddr);
|
|
#define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr))
|
|
|
|
static __always_inline void *pfn_to_kaddr(unsigned long pfn)
|
|
{
|
|
return __va(pfn << PAGE_SHIFT);
|
|
}
|
|
|
|
static __always_inline u64 __canonical_address(u64 vaddr, u8 vaddr_bits)
|
|
{
|
|
return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
|
|
}
|
|
|
|
static __always_inline u64 __is_canonical_address(u64 vaddr, u8 vaddr_bits)
|
|
{
|
|
return __canonical_address(vaddr, vaddr_bits) == vaddr;
|
|
}
|
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
|
#include <asm-generic/memory_model.h>
|
|
#include <asm-generic/getorder.h>
|
|
|
|
#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_X86_PAGE_H */
|