source: trunk/packages/xen-3.1/xen-3.1/tools/libxc/xc_dom.h @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 8.1 KB
Line 
1#include <xen/libelf.h>
2
3#define INVALID_P2M_ENTRY   ((xen_pfn_t)-1)
4
5/* --- typedefs and structs ---------------------------------------- */
6
7typedef uint64_t xen_vaddr_t;
8typedef uint64_t xen_paddr_t;
9
10#define PRIpfn PRI_xen_pfn
11
12struct xc_dom_seg {
13    xen_vaddr_t vstart;
14    xen_vaddr_t vend;
15    xen_pfn_t pfn;
16};
17
18struct xc_dom_mem {
19    struct xc_dom_mem *next;
20    void *mmap_ptr;
21    size_t mmap_len;
22    unsigned char memory[0];
23};
24
25struct xc_dom_phys {
26    struct xc_dom_phys *next;
27    void *ptr;
28    xen_pfn_t first;
29    xen_pfn_t count;
30};
31
32struct xc_dom_image {
33    /* files */
34    void *kernel_blob;
35    size_t kernel_size;
36    void *ramdisk_blob;
37    size_t ramdisk_size;
38
39    /* arguments and parameters */
40    char *cmdline;
41    uint32_t f_requested[XENFEAT_NR_SUBMAPS];
42
43    /* info from (elf) kernel image */
44    struct elf_dom_parms parms;
45    char *guest_type;
46
47    /* memory layout */
48    struct xc_dom_seg kernel_seg;
49    struct xc_dom_seg ramdisk_seg;
50    struct xc_dom_seg p2m_seg;
51    struct xc_dom_seg pgtables_seg;
52    struct xc_dom_seg devicetree_seg;
53    xen_pfn_t start_info_pfn;
54    xen_pfn_t console_pfn;
55    xen_pfn_t xenstore_pfn;
56    xen_pfn_t shared_info_pfn;
57    xen_pfn_t bootstack_pfn;
58    xen_vaddr_t virt_alloc_end;
59    xen_vaddr_t bsd_symtab_start;
60
61    /* initial page tables */
62    unsigned int pgtables;
63    unsigned int pg_l4;
64    unsigned int pg_l3;
65    unsigned int pg_l2;
66    unsigned int pg_l1;
67    unsigned int alloc_bootstack;
68    unsigned int extra_pages;
69    xen_vaddr_t virt_pgtab_end;
70
71    /* other state info */
72    uint32_t f_active[XENFEAT_NR_SUBMAPS];
73    xen_pfn_t *p2m_host;
74    void *p2m_guest;
75
76    /* physical memory */
77    xen_pfn_t total_pages;
78    struct xc_dom_phys *phys_pages;
79    int realmodearea_log;
80
81    /* malloc memory pool */
82    struct xc_dom_mem *memblocks;
83
84    /* memory footprint stats */
85    size_t alloc_malloc;
86    size_t alloc_mem_map;
87    size_t alloc_file_map;
88    size_t alloc_domU_map;
89
90    /* misc xen domain config stuff */
91    unsigned long flags;
92    unsigned int console_evtchn;
93    unsigned int xenstore_evtchn;
94    xen_pfn_t shared_info_mfn;
95
96    int guest_xc;
97    domid_t guest_domid;
98    int shadow_enabled;
99
100    int xen_version;
101    xen_capabilities_info_t xen_caps;
102
103    /* kernel loader, arch hooks */
104    struct xc_dom_loader *kernel_loader;
105    void *private_loader;
106
107    /* kernel loader */
108    struct xc_dom_arch *arch_hooks;
109};
110
111/* --- pluggable kernel loader ------------------------------------- */
112
113struct xc_dom_loader {
114    char *name;
115    int (*probe) (struct xc_dom_image * dom);
116    int (*parser) (struct xc_dom_image * dom);
117    int (*loader) (struct xc_dom_image * dom);
118
119    struct xc_dom_loader *next;
120};
121
122#define __init __attribute__ ((constructor))
123void xc_dom_register_loader(struct xc_dom_loader *loader);
124
125/* --- arch specific hooks ----------------------------------------- */
126
127struct xc_dom_arch {
128    /* pagetable setup */
129    int (*alloc_magic_pages) (struct xc_dom_image * dom);
130    int (*count_pgtables) (struct xc_dom_image * dom);
131    int (*setup_pgtables) (struct xc_dom_image * dom);
132
133    /* arch-specific data structs setup */
134    int (*start_info) (struct xc_dom_image * dom);
135    int (*shared_info) (struct xc_dom_image * dom, void *shared_info);
136    int (*vcpu) (struct xc_dom_image * dom, void *vcpu_ctxt);
137
138    char *guest_type;
139    int page_shift;
140    int sizeof_pfn;
141
142    struct xc_dom_arch *next;
143};
144void xc_dom_register_arch_hooks(struct xc_dom_arch *hooks);
145
146#define XC_DOM_PAGE_SHIFT(dom)  ((dom)->arch_hooks->page_shift)
147#define XC_DOM_PAGE_SIZE(dom)   (1 << (dom)->arch_hooks->page_shift)
148
149/* --- main functions ---------------------------------------------- */
150
151struct xc_dom_image *xc_dom_allocate(const char *cmdline, const char *features);
152void xc_dom_release_phys(struct xc_dom_image *dom);
153void xc_dom_release(struct xc_dom_image *dom);
154int xc_dom_mem_init(struct xc_dom_image *dom, unsigned int mem_mb);
155
156size_t xc_dom_check_gzip(void *blob, size_t ziplen);
157int xc_dom_do_gunzip(void *src, size_t srclen, void *dst, size_t dstlen);
158int xc_dom_try_gunzip(struct xc_dom_image *dom, void **blob, size_t * size);
159
160int xc_dom_kernel_file(struct xc_dom_image *dom, const char *filename);
161int xc_dom_ramdisk_file(struct xc_dom_image *dom, const char *filename);
162int xc_dom_kernel_mem(struct xc_dom_image *dom, const void *mem,
163                      size_t memsize);
164int xc_dom_ramdisk_mem(struct xc_dom_image *dom, const void *mem,
165                       size_t memsize);
166
167int xc_dom_parse_image(struct xc_dom_image *dom);
168int xc_dom_build_image(struct xc_dom_image *dom);
169int xc_dom_update_guest_p2m(struct xc_dom_image *dom);
170
171int xc_dom_boot_xen_init(struct xc_dom_image *dom, int xc, domid_t domid);
172int xc_dom_boot_mem_init(struct xc_dom_image *dom);
173void *xc_dom_boot_domU_map(struct xc_dom_image *dom, xen_pfn_t pfn,
174                           xen_pfn_t count);
175int xc_dom_boot_image(struct xc_dom_image *dom);
176int xc_dom_compat_check(struct xc_dom_image *dom);
177
178/* --- debugging bits ---------------------------------------------- */
179
180extern FILE *xc_dom_logfile;
181
182void xc_dom_loginit(void);
183int xc_dom_printf(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
184int xc_dom_panic_func(const char *file, int line, xc_error_code err,
185                      const char *fmt, ...)
186    __attribute__ ((format(printf, 4, 5)));
187#define xc_dom_panic(err, fmt, args...) \
188    xc_dom_panic_func(__FILE__, __LINE__, err, fmt, ## args)
189#define xc_dom_trace(mark) \
190    xc_dom_printf("%s:%d: trace %s\n", __FILE__, __LINE__, mark)
191
192void xc_dom_log_memory_footprint(struct xc_dom_image *dom);
193
194/* --- simple memory pool ------------------------------------------ */
195
196void *xc_dom_malloc(struct xc_dom_image *dom, size_t size);
197void *xc_dom_malloc_page_aligned(struct xc_dom_image *dom, size_t size);
198void *xc_dom_malloc_filemap(struct xc_dom_image *dom,
199                            const char *filename, size_t * size);
200char *xc_dom_strdup(struct xc_dom_image *dom, const char *str);
201
202/* --- alloc memory pool ------------------------------------------- */
203
204int xc_dom_alloc_page(struct xc_dom_image *dom, char *name);
205int xc_dom_alloc_segment(struct xc_dom_image *dom,
206                         struct xc_dom_seg *seg, char *name,
207                         xen_vaddr_t start, xen_vaddr_t size);
208
209/* --- misc bits --------------------------------------------------- */
210
211void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t first,
212                        xen_pfn_t count);
213void xc_dom_unmap_one(struct xc_dom_image *dom, xen_pfn_t pfn);
214void xc_dom_unmap_all(struct xc_dom_image *dom);
215
216static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom,
217                                      struct xc_dom_seg *seg)
218{
219    xen_vaddr_t segsize = seg->vend - seg->vstart;
220    unsigned int page_size = XC_DOM_PAGE_SIZE(dom);
221    xen_pfn_t pages = (segsize + page_size - 1) / page_size;
222
223    return xc_dom_pfn_to_ptr(dom, seg->pfn, pages);
224}
225
226static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom,
227                                        xen_vaddr_t vaddr)
228{
229    unsigned int page_size = XC_DOM_PAGE_SIZE(dom);
230    xen_pfn_t page = (vaddr - dom->parms.virt_base) / page_size;
231    unsigned int offset = (vaddr - dom->parms.virt_base) % page_size;
232    void *ptr = xc_dom_pfn_to_ptr(dom, page, 0);
233    return (ptr ? (ptr + offset) : NULL);
234}
235
236static inline int xc_dom_feature_translated(struct xc_dom_image *dom)
237{
238    return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active);
239}
240
241static inline xen_pfn_t xc_dom_p2m_host(struct xc_dom_image *dom, xen_pfn_t pfn)
242{
243    if (dom->shadow_enabled)
244        return pfn;
245    return dom->p2m_host[pfn];
246}
247
248static inline xen_pfn_t xc_dom_p2m_guest(struct xc_dom_image *dom,
249                                         xen_pfn_t pfn)
250{
251    if (xc_dom_feature_translated(dom))
252        return pfn;
253    return dom->p2m_host[pfn];
254}
255
256/* --- arch bits --------------------------------------------------- */
257
258int arch_setup_meminit(struct xc_dom_image *dom);
259int arch_setup_bootearly(struct xc_dom_image *dom);
260int arch_setup_bootlate(struct xc_dom_image *dom);
261
262/*
263 * Local variables:
264 * mode: C
265 * c-set-style: "BSD"
266 * c-basic-offset: 4
267 * tab-width: 4
268 * indent-tabs-mode: nil
269 * End:
270 */
Note: See TracBrowser for help on using the repository browser.