struct page;
typedef size_t ppn_t;
typedef struct page page_t;
-typedef LIST_HEAD(PageList, page) page_list_t;
-typedef LIST_ENTRY(page) page_list_entry_t;
+typedef BSD_LIST_HEAD(PageList, page) page_list_t;
+typedef BSD_LIST_ENTRY(page) page_list_entry_t;
/* Per-page flag bits related to their state in the page cache */
#define PG_LOCKED 0x001 /* involved in an IO op */
* an issue, we can dynamically allocate some of these things when we're a
* buffer page (in a page mapping) */
struct page {
- LIST_ENTRY(page) pg_link; /* membership in various lists */
+ BSD_LIST_ENTRY(page) pg_link; /* membership in various lists */
struct kref pg_kref;
atomic_t pg_flags;
struct page_map *pg_mapping; /* for debugging... */
void **pg_tree_slot;
void *pg_private; /* type depends on page usage */
struct semaphore pg_sem; /* for blocking on IO */
+ uint64_t gpa; /* physical address in guest */
+ /* pg_private is overloaded. */
};
/******** Externally visible global variables ************/
void *CT(1 << order) get_cont_pages(size_t order, int flags);
void *CT(1 << order) get_cont_pages_node(int node, size_t order, int flags);
+void *get_cont_phys_pages_at(size_t order, physaddr_t at, int flags);
void free_cont_pages(void *buf, size_t order);
void page_incref(page_t *SAFE page);