1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
8 #include <linux/kprobes.h>
10 #include <asm/cacheflush.h>
11 #include <asm/fixmap.h>
13 void notrace
set_fixmap(enum fixed_addresses idx
, phys_addr_t phys
)
15 unsigned long vaddr
= __fix_to_virt(idx
);
16 pgd_t
*pgd
= pgd_offset_k(vaddr
);
17 p4d_t
*p4d
= p4d_offset(pgd
, vaddr
);
18 pud_t
*pud
= pud_offset(p4d
, vaddr
);
19 pmd_t
*pmd
= pmd_offset(pud
, vaddr
);
23 pmd
= pmd_alloc(NULL
, pud
, vaddr
);
25 pte
= pte_offset_kernel(pmd
, vaddr
);
27 pte
= pte_alloc_kernel(pmd
, vaddr
);
29 set_pte_at(&init_mm
, vaddr
, pte
, __mk_pte(phys
, PAGE_KERNEL_RWX
));
30 flush_tlb_kernel_range(vaddr
, vaddr
+ PAGE_SIZE
);
33 void notrace
clear_fixmap(enum fixed_addresses idx
)
35 unsigned long vaddr
= __fix_to_virt(idx
);
36 pte_t
*pte
= virt_to_kpte(vaddr
);
38 if (WARN_ON(pte_none(*pte
)))
41 pte_clear(&init_mm
, vaddr
, pte
);
43 flush_tlb_kernel_range(vaddr
, vaddr
+ PAGE_SIZE
);