- virtual ~PageTableImpl();
-
- virtual void map(RegionWithOffset region, Flags flags);
- virtual void unmap(Region region);
- virtual void set_flags(Region region, Flags flags, Flags mask);
- virtual void get_entry(u64 addr, u64 *phys, Flags *flags);
-
- virtual void get_size(u64 *size)
- {
- if (is_process)
- *size = 1ULL << (PTE::num_levels * PTE::shift_per_level);
- else
- *size = 1ULL << (64 - PTE::page_shift);
- }
+ // Returns the physical address and flags associated with a given
+ // virtual address. If flags.Valid is not set, then phys and all
+ // other flags are undefined. This function is mainly used for
+ // propagating stacked aspace PTEs.
+
+ virtual void get_mapping(u64 vaddr, u64 *phys, Flags *flags) = 0;
+
+ virtual void get_size(u64 *size) = 0;
+
+ // This is called when a PTE is replaced. It handles refcounting,
+ // dirty page queueing, and TLB invalidation. vaddr is only
+ // valid for process address spaces, so it doesn't need to be
+ // 64-bit (except on 64-bit hardware, of course). When it is
+ // known that only flags are changing, set no_release so that
+ // the page refcount is not decremented.
+
+ void kill_pte(ulong vaddr, u64 physaddr, bool dirty, bool valid,
+ bool no_release);