Add pmap_vm_page_alloc_check()

which is the place to put MD asserts about allocated pages.

On amd64, verify that allocated page does not belong to the kernel
(text, data) or early allocated pages.

Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D31121
This commit is contained in:
Konstantin Belousov 2021-07-10 22:53:41 +03:00
parent e18380e341
commit 041b7317f7
8 changed files with 17 additions and 0 deletions

View file

@ -456,6 +456,10 @@ extern int invpcid_works;
#define pmap_page_is_write_mapped(m) (((m)->a.flags & PGA_WRITEABLE) != 0)
#define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz))
#define pmap_vm_page_alloc_check(m) \
KASSERT(m->phys_addr < kernphys || m->phys_addr >= KERNend, \
("allocating kernel page %p", m));
struct thread;
void pmap_activate_boot(pmap_t pmap);

View file

@ -73,5 +73,7 @@ pmap_vmspace_copy(pmap_t dst_pmap __unused, pmap_t src_pmap __unused)
#define PMAP_ENTER_QUICK_LOCKED 0x10000000
#define pmap_vm_page_alloc_check(m)
#endif /* _KERNEL */
#endif /* !_MACHINE_PMAP_H_ */

View file

@ -162,6 +162,8 @@ extern vm_offset_t virtual_end;
#define L1_MAPPABLE_P(va, pa, size) \
((((va) | (pa)) & L1_OFFSET) == 0 && (size) >= L1_SIZE)
#define pmap_vm_page_alloc_check(m)
void pmap_activate_vm(pmap_t);
void pmap_bootstrap(vm_offset_t, vm_offset_t, vm_paddr_t, vm_size_t);
int pmap_change_attr(vm_offset_t va, vm_size_t size, int mode);

View file

@ -238,6 +238,8 @@ pmap_vmspace_copy(pmap_t dst_pmap __unused, pmap_t src_pmap __unused)
struct sf_buf;
#define pmap_vm_page_alloc_check(m)
/*
* Only the following functions or macros may be used before pmap_bootstrap()
* is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and

View file

@ -166,6 +166,8 @@ extern vm_offset_t virtual_end;
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
#define pmap_page_is_write_mapped(m) (((m)->a.flags & PGA_WRITEABLE) != 0)
#define pmap_vm_page_alloc_check(m)
void pmap_bootstrap(void);
void *pmap_mapdev(vm_paddr_t, vm_size_t);
void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, vm_memattr_t);

View file

@ -301,6 +301,8 @@ extern struct pmap kernel_pmap_store;
#define pmap_page_is_write_mapped(m) (((m)->a.flags & PGA_WRITEABLE) != 0)
#define pmap_vm_page_alloc_check(m)
void pmap_bootstrap(vm_offset_t, vm_offset_t);
void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, vm_memattr_t);

View file

@ -139,6 +139,8 @@ extern vm_offset_t virtual_end;
struct thread;
#define pmap_vm_page_alloc_check(m)
void pmap_activate_boot(pmap_t);
void pmap_activate_sw(struct thread *);
void pmap_bootstrap(vm_offset_t, vm_paddr_t, vm_size_t);

View file

@ -2416,6 +2416,7 @@ vm_page_alloc_check(vm_page_t m)
("page %p has unexpected memattr %d",
m, pmap_page_get_memattr(m)));
KASSERT(m->valid == 0, ("free page %p is valid", m));
pmap_vm_page_alloc_check(m);
}
/*