1
/******************************************************************************
4
* Definitions for memory pages, frame numbers, addresses, allocations, etc.
6
* Note that Xen must handle several different physical 'address spaces' and
7
* there is a consistent terminology for these:
9
* 1. gpfn/gpaddr: A guest-specific pseudo-physical frame number or address.
10
* 2. gmfn/gmaddr: A machine address from the p.o.v. of a particular guest.
11
* 3. mfn/maddr: A real machine frame number or address.
12
* 4. pfn/paddr: Used in 'polymorphic' functions that work across all
13
* address spaces, depending on context. See the pagetable
14
* conversion macros in asm-x86/page.h for examples.
15
* Also 'paddr_t' is big enough to store any physical address.
17
* This scheme provides consistent function and variable names even when
18
* different guests are running in different memory-management modes.
19
* 1. A guest running in auto-translated mode (e.g., shadow_mode_translate())
20
* will have gpfn == gmfn and gmfn != mfn.
21
* 2. A paravirtualised x86 guest will have gpfn != gmfn and gmfn == mfn.
22
* 3. A paravirtualised guest with no pseudophysical overlay will have
23
* gpfn == gpmfn == mfn.
25
* Copyright (c) 2002-2006, K A Fraser <keir@xensource.com>
31
#include <xen/config.h>
32
#include <xen/types.h>
34
#include <xen/spinlock.h>
39
/* Boot-time allocator. Turns into generic allocator after bootstrap. */
40
void init_boot_pages(paddr_t ps, paddr_t pe);
41
unsigned long alloc_boot_pages(
42
unsigned long nr_pfns, unsigned long pfn_align);
43
void end_boot_allocator(void);
45
/* Xen suballocator. These functions are interrupt-safe. */
46
void init_xenheap_pages(paddr_t ps, paddr_t pe);
47
void *alloc_xenheap_pages(unsigned int order, unsigned int memflags);
48
void free_xenheap_pages(void *v, unsigned int order);
49
#define alloc_xenheap_page() (alloc_xenheap_pages(0,0))
50
#define free_xenheap_page(v) (free_xenheap_pages(v,0))
52
/* Domain suballocator. These functions are *not* interrupt-safe.*/
53
void init_domheap_pages(paddr_t ps, paddr_t pe);
54
struct page_info *alloc_domheap_pages(
55
struct domain *d, unsigned int order, unsigned int memflags);
56
void free_domheap_pages(struct page_info *pg, unsigned int order);
57
unsigned long avail_domheap_pages_region(
58
unsigned int node, unsigned int min_width, unsigned int max_width);
59
unsigned long avail_domheap_pages(void);
60
#define alloc_domheap_page(d,f) (alloc_domheap_pages(d,0,f))
61
#define free_domheap_page(p) (free_domheap_pages(p,0))
62
unsigned int online_page(unsigned long mfn, uint32_t *status);
63
int offline_page(unsigned long mfn, int broken, uint32_t *status);
64
int query_page_offline(unsigned long mfn, uint32_t *status);
65
unsigned long total_free_pages(void);
67
void scrub_heap_pages(void);
73
unsigned int memflags);
76
#define _MEMF_no_refcount 0
77
#define MEMF_no_refcount (1U<<_MEMF_no_refcount)
78
#define _MEMF_populate_on_demand 1
79
#define MEMF_populate_on_demand (1U<<_MEMF_populate_on_demand)
81
#define MEMF_tmem (1U<<_MEMF_tmem)
83
#define MEMF_node(n) ((((n)+1)&0xff)<<_MEMF_node)
85
#define MEMF_bits(n) ((n)<<_MEMF_bits)
87
#ifdef CONFIG_PAGEALLOC_MAX_ORDER
88
#define MAX_ORDER CONFIG_PAGEALLOC_MAX_ORDER
90
#define MAX_ORDER 20 /* 2^20 contiguous pages */
93
#define page_list_entry list_head
97
#ifndef page_list_entry
100
struct page_info *next, *tail;
102
/* These must only have instances in struct page_info. */
103
# define page_list_entry
105
#define PAGE_LIST_NULL (~0)
107
# if !defined(pdx_to_page) && !defined(page_to_pdx)
108
# if defined(__page_to_mfn) || defined(__mfn_to_page)
109
# define page_to_pdx __page_to_mfn
110
# define pdx_to_page __mfn_to_page
112
# define page_to_pdx page_to_mfn
113
# define pdx_to_page mfn_to_page
117
# define PAGE_LIST_HEAD_INIT(name) { NULL, NULL }
118
# define PAGE_LIST_HEAD(name) \
119
struct page_list_head name = PAGE_LIST_HEAD_INIT(name)
120
# define INIT_PAGE_LIST_HEAD(head) ((head)->tail = (head)->next = NULL)
121
# define INIT_PAGE_LIST_ENTRY(ent) ((ent)->prev = (ent)->next = PAGE_LIST_NULL)
124
page_list_empty(const struct page_list_head *head)
128
static inline struct page_info *
129
page_list_first(const struct page_list_head *head)
133
static inline struct page_info *
134
page_list_next(const struct page_info *page,
135
const struct page_list_head *head)
137
return page != head->tail ? pdx_to_page(page->list.next) : NULL;
139
static inline struct page_info *
140
page_list_prev(const struct page_info *page,
141
const struct page_list_head *head)
143
return page != head->next ? pdx_to_page(page->list.prev) : NULL;
146
page_list_add(struct page_info *page, struct page_list_head *head)
150
page->list.next = page_to_pdx(head->next);
151
head->next->list.prev = page_to_pdx(page);
156
page->list.next = PAGE_LIST_NULL;
158
page->list.prev = PAGE_LIST_NULL;
162
page_list_add_tail(struct page_info *page, struct page_list_head *head)
164
page->list.next = PAGE_LIST_NULL;
167
page->list.prev = page_to_pdx(head->tail);
168
head->tail->list.next = page_to_pdx(page);
172
page->list.prev = PAGE_LIST_NULL;
178
__page_list_del_head(struct page_info *page, struct page_list_head *head,
179
struct page_info *next, struct page_info *prev)
181
if ( head->next == page )
183
if ( head->tail != page )
185
next->list.prev = PAGE_LIST_NULL;
189
head->tail = head->next = NULL;
193
if ( head->tail == page )
195
prev->list.next = PAGE_LIST_NULL;
203
page_list_del(struct page_info *page, struct page_list_head *head)
205
struct page_info *next = pdx_to_page(page->list.next);
206
struct page_info *prev = pdx_to_page(page->list.prev);
208
if ( !__page_list_del_head(page, head, next, prev) )
210
next->list.prev = page->list.prev;
211
prev->list.next = page->list.next;
215
page_list_del2(struct page_info *page, struct page_list_head *head1,
216
struct page_list_head *head2)
218
struct page_info *next = pdx_to_page(page->list.next);
219
struct page_info *prev = pdx_to_page(page->list.prev);
221
if ( !__page_list_del_head(page, head1, next, prev) &&
222
!__page_list_del_head(page, head2, next, prev) )
224
next->list.prev = page->list.prev;
225
prev->list.next = page->list.next;
228
static inline struct page_info *
229
page_list_remove_head(struct page_list_head *head)
231
struct page_info *page = head->next;
234
page_list_del(page, head);
239
page_list_move(struct page_list_head *dst, struct page_list_head *src)
241
if ( !page_list_empty(src) )
244
INIT_PAGE_LIST_HEAD(src);
248
page_list_splice(struct page_list_head *list, struct page_list_head *head)
250
struct page_info *first, *last, *at;
252
if ( page_list_empty(list) )
255
if ( page_list_empty(head) )
257
head->next = list->next;
258
head->tail = list->tail;
266
first->list.prev = page_to_pdx(head->next);
269
last->list.next = page_to_pdx(at);
270
at->list.prev = page_to_pdx(last);
273
#define page_list_for_each(pos, head) \
274
for ( pos = (head)->next; pos; pos = page_list_next(pos, head) )
275
#define page_list_for_each_safe(pos, tmp, head) \
276
for ( pos = (head)->next; \
277
pos ? (tmp = page_list_next(pos, head), 1) : 0; \
279
#define page_list_for_each_safe_reverse(pos, tmp, head) \
280
for ( pos = (head)->tail; \
281
pos ? (tmp = page_list_prev(pos, head), 1) : 0; \
284
# define page_list_head list_head
285
# define PAGE_LIST_HEAD_INIT LIST_HEAD_INIT
286
# define PAGE_LIST_HEAD LIST_HEAD
287
# define INIT_PAGE_LIST_HEAD INIT_LIST_HEAD
288
# define INIT_PAGE_LIST_ENTRY INIT_LIST_HEAD
289
# define page_list_empty list_empty
290
# define page_list_first(hd) list_entry((hd)->next, \
291
struct page_info, list)
292
# define page_list_next(pg, hd) list_entry((pg)->list.next, \
293
struct page_info, list)
294
# define page_list_add(pg, hd) list_add(&(pg)->list, hd)
295
# define page_list_add_tail(pg, hd) list_add_tail(&(pg)->list, hd)
296
# define page_list_del(pg, hd) list_del(&(pg)->list)
297
# define page_list_del2(pg, hd1, hd2) list_del(&(pg)->list)
298
# define page_list_remove_head(hd) (!page_list_empty(hd) ? \
300
struct page_info *__pg = page_list_first(hd); \
301
list_del(&__pg->list); \
304
# define page_list_move(dst, src) (!list_empty(src) ? \
305
list_replace_init(src, dst) : (void)0)
306
# define page_list_for_each(pos, head) list_for_each_entry(pos, head, list)
307
# define page_list_for_each_safe(pos, tmp, head) \
308
list_for_each_entry_safe(pos, tmp, head, list)
309
# define page_list_for_each_safe_reverse(pos, tmp, head) \
310
list_for_each_entry_safe_reverse(pos, tmp, head, list)
311
# define page_list_splice(list, hd) list_splice(list, hd)
314
void scrub_one_page(struct page_info *);
316
int guest_remove_page(struct domain *d, unsigned long gmfn);
318
#define RAM_TYPE_CONVENTIONAL 0x00000001
319
#define RAM_TYPE_RESERVED 0x00000002
320
#define RAM_TYPE_UNUSABLE 0x00000004
321
#define RAM_TYPE_ACPI 0x00000008
322
/* TRUE if the whole page at @mfn is of the requested RAM type(s) above. */
323
int page_is_ram_type(unsigned long mfn, unsigned long mem_type);
325
#endif /* __XEN_MM_H__ */