+pmm_free_one(ptr_t page, pp_attr_t attr_mask)
+{
+ pfn_t ppfn = pfn(page);
+ struct pp_struct* pm = &pm_table[ppfn];
+
+ assert(ppfn < max_pg && pm->ref_counts);
+ if (pm->attr && !(pm->attr & attr_mask)) {
+ return 0;
+ }
+
+ pm->ref_counts--;
+ return 1;
+}
+
+int
+pmm_ref_page(ptr_t page)
+{
+ u32_t ppn = pfn(page);
+
+ if (ppn >= PM_BMP_MAX_SIZE) {
+ return 0;
+ }
+
+ struct pp_struct* pm = &pm_table[ppn];
+ assert(ppn < max_pg && pm->ref_counts);
+
+ pm->ref_counts++;
+ return 1;
+}
+
+void
+pmm_set_attr(ptr_t page, pp_attr_t attr)