mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 14:48:06 +00:00
riscv: add ARCH_HAS_SET_DIRECT_MAP support
Add set_direct_map_*() functions for setting the direct map alias for
the page to its default permissions and to an invalid state that cannot
be cached in a TLB. (See d253ca0c
("x86/mm/cpa: Add set_direct_map_*()
functions")) Add a similar implementation for RISC-V.
Signed-off-by: Zong Li <zong.li@sifive.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
parent
d3ab332a50
commit
395a21ff85
3 changed files with 28 additions and 0 deletions
|
@ -59,6 +59,7 @@ config RISCV
|
||||||
select HAVE_EBPF_JIT if 64BIT
|
select HAVE_EBPF_JIT if 64BIT
|
||||||
select EDAC_SUPPORT
|
select EDAC_SUPPORT
|
||||||
select ARCH_HAS_GIGANTIC_PAGE
|
select ARCH_HAS_GIGANTIC_PAGE
|
||||||
|
select ARCH_HAS_SET_DIRECT_MAP
|
||||||
select ARCH_HAS_SET_MEMORY
|
select ARCH_HAS_SET_MEMORY
|
||||||
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
|
select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
|
||||||
select SPARSEMEM_STATIC if 32BIT
|
select SPARSEMEM_STATIC if 32BIT
|
||||||
|
|
|
@ -21,4 +21,7 @@ static inline int set_memory_x(unsigned long addr, int numpages) { return 0; }
|
||||||
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int set_direct_map_invalid_noflush(struct page *page);
|
||||||
|
int set_direct_map_default_noflush(struct page *page);
|
||||||
|
|
||||||
#endif /* _ASM_RISCV_SET_MEMORY_H */
|
#endif /* _ASM_RISCV_SET_MEMORY_H */
|
||||||
|
|
|
@ -148,3 +148,27 @@ int set_memory_nx(unsigned long addr, int numpages)
|
||||||
{
|
{
|
||||||
return __set_memory(addr, numpages, __pgprot(0), __pgprot(_PAGE_EXEC));
|
return __set_memory(addr, numpages, __pgprot(0), __pgprot(_PAGE_EXEC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int set_direct_map_invalid_noflush(struct page *page)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)page_address(page);
|
||||||
|
unsigned long end = start + PAGE_SIZE;
|
||||||
|
struct pageattr_masks masks = {
|
||||||
|
.set_mask = __pgprot(0),
|
||||||
|
.clear_mask = __pgprot(_PAGE_PRESENT)
|
||||||
|
};
|
||||||
|
|
||||||
|
return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
|
||||||
|
}
|
||||||
|
|
||||||
|
int set_direct_map_default_noflush(struct page *page)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)page_address(page);
|
||||||
|
unsigned long end = start + PAGE_SIZE;
|
||||||
|
struct pageattr_masks masks = {
|
||||||
|
.set_mask = PAGE_KERNEL,
|
||||||
|
.clear_mask = __pgprot(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue