aboutsummaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-02-17 00:04:49 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-02-17 00:05:05 +0100
commit58369a4518ff31c079552e46807747d5d08463fe (patch)
tree561ae0dd8db9d56000f54e869b3b058bb1e1e009 /i386
parentde55cd489886af509c687dbf9a4a9eab4be67e3f (diff)
downloadgnumach-58369a4518ff31c079552e46807747d5d08463fe.tar.gz
gnumach-58369a4518ff31c079552e46807747d5d08463fe.tar.bz2
gnumach-58369a4518ff31c079552e46807747d5d08463fe.zip
pmap: Make sure we do not allocate page tables beyond 4GiB
vm_page_insert would not be able to store the offset.
Diffstat (limited to 'i386')
-rw-r--r--i386/intel/pmap.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index 1a765352..d57040cf 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -1112,7 +1112,7 @@ vm_offset_t
pmap_page_table_page_alloc(void)
{
vm_page_t m;
- vm_offset_t pa;
+ phys_addr_t pa;
check_simple_locks();
@@ -1135,6 +1135,7 @@ pmap_page_table_page_alloc(void)
* can be found later.
*/
pa = m->phys_addr;
+ assert(pa == (vm_offset_t) pa);
vm_object_lock(pmap_object);
vm_page_insert(m, pmap_object, pa);
vm_page_lock_queues();
@@ -1413,6 +1414,7 @@ void pmap_destroy(pmap_t p)
pdep += ptes_per_vm_page) {
if (*pdep & INTEL_PTE_VALID) {
pa = pte_to_pa(*pdep);
+ assert(pa == (vm_offset_t) pa);
vm_object_lock(pmap_object);
m = vm_page_lookup(pmap_object, pa);
if (m == VM_PAGE_NULL)
@@ -2466,6 +2468,7 @@ void pmap_collect(pmap_t p)
vm_page_t m;
vm_object_lock(pmap_object);
+ assert(pa == (vm_offset_t) pa);
m = vm_page_lookup(pmap_object, pa);
if (m == VM_PAGE_NULL)
panic("pmap_collect: pte page not in object");