mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
bitkeeper revision 1.1159.220.2 (41e6700bFJzLjEYlNh48j_cSTbRy9A)
Code duplication cleanup: remove a number of duplicate identical
static functions in xc_*_{build,restore}.c, replaced with single
(non-static) copy in xc_private.c
This commit is contained in:
1 parent
27f2ee4d4c
commit
79c26560e2
6 files changed
+179
-350
No files matched your search
@@ -41,52 +41,6 @@ loadelfsymtab(
|
||||
char *elfbase, int xch, u32 dom, unsigned long *parray,
|
||||
struct domain_setup_info *dsi);
|
||||
|
||||
static long get_tot_pages(int xc_handle, u32 domid)
|
||||
{
|
||||
dom0_op_t op;
|
||||
op.cmd = DOM0_GETDOMAININFO;
|
||||
op.u.getdomaininfo.domain = (domid_t)domid;
|
||||
op.u.getdomaininfo.ctxt = NULL;
|
||||
return (do_dom0_op(xc_handle, &op) < 0) ?
|
||||
-1 : op.u.getdomaininfo.tot_pages;
|
||||
}
|
||||
|
||||
static int get_pfn_list(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long *pfn_buf,
|
||||
unsigned long max_pfns)
|
||||
{
|
||||
dom0_op_t op;
|
||||
int ret;
|
||||
op.cmd = DOM0_GETMEMLIST;
|
||||
op.u.getmemlist.domain = (domid_t)domid;
|
||||
op.u.getmemlist.max_pfns = max_pfns;
|
||||
op.u.getmemlist.buffer = pfn_buf;
|
||||
|
||||
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
|
||||
return -1;
|
||||
|
||||
ret = do_dom0_op(xc_handle, &op);
|
||||
|
||||
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
|
||||
|
||||
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
|
||||
}
|
||||
|
||||
static int copy_to_domain_page(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long dst_pfn,
|
||||
void *src_page)
|
||||
{
|
||||
void *vaddr = xc_map_foreign_range(
|
||||
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
|
||||
if ( vaddr == NULL )
|
||||
return -1;
|
||||
memcpy(vaddr, src_page, PAGE_SIZE);
|
||||
munmap(vaddr, PAGE_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setup_guestos(int xc_handle,
|
||||
u32 dom,
|
||||
char *image, unsigned long image_size,
|
||||
@@ -206,7 +160,7 @@ static int setup_guestos(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if ( get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
|
||||
if ( xc_get_pfn_list(xc_handle, dom, page_array, nr_pages) != nr_pages )
|
||||
{
|
||||
PERROR("Could not get the page frame list");
|
||||
goto error_out;
|
||||
@@ -229,7 +183,7 @@ static int setup_guestos(int xc_handle,
|
||||
PERROR("Error reading initrd image, could not");
|
||||
goto error_out;
|
||||
}
|
||||
copy_to_domain_page(xc_handle, dom,
|
||||
xc_copy_to_domain_page(xc_handle, dom,
|
||||
page_array[i>>PAGE_SHIFT], page);
|
||||
}
|
||||
}
|
||||
@@ -364,69 +318,6 @@ static int setup_guestos(int xc_handle,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned long get_filesz(int fd)
|
||||
{
|
||||
u16 sig;
|
||||
u32 _sz = 0;
|
||||
unsigned long sz;
|
||||
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
read(fd, &sig, sizeof(sig));
|
||||
sz = lseek(fd, 0, SEEK_END);
|
||||
if ( sig == 0x8b1f ) /* GZIP signature? */
|
||||
{
|
||||
lseek(fd, -4, SEEK_END);
|
||||
read(fd, &_sz, 4);
|
||||
sz = _sz;
|
||||
}
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
static char *read_kernel_image(const char *filename, unsigned long *size)
|
||||
{
|
||||
int kernel_fd = -1;
|
||||
gzFile kernel_gfd = NULL;
|
||||
char *image = NULL;
|
||||
unsigned int bytes;
|
||||
|
||||
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
|
||||
{
|
||||
PERROR("Could not open kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
*size = get_filesz(kernel_fd);
|
||||
|
||||
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate decompression state for state file");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (image = malloc(*size)) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate memory for kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
|
||||
{
|
||||
PERROR("Error reading kernel image, could not"
|
||||
" read the whole image (%d != %ld).", bytes, *size);
|
||||
free(image);
|
||||
image = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
if ( kernel_gfd != NULL )
|
||||
gzclose(kernel_gfd);
|
||||
else if ( kernel_fd >= 0 )
|
||||
close(kernel_fd);
|
||||
return image;
|
||||
}
|
||||
|
||||
int xc_linux_build(int xc_handle,
|
||||
u32 domid,
|
||||
const char *image_name,
|
||||
@@ -445,13 +336,13 @@ int xc_linux_build(int xc_handle,
|
||||
unsigned long image_size, initrd_size=0;
|
||||
unsigned long vstartinfo_start, vkern_entry;
|
||||
|
||||
if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 )
|
||||
if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 )
|
||||
{
|
||||
PERROR("Could not find total pages for domain");
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if ( (image = read_kernel_image(image_name, &image_size)) == NULL )
|
||||
if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL )
|
||||
goto error_out;
|
||||
|
||||
if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) )
|
||||
@@ -462,7 +353,7 @@ int xc_linux_build(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
initrd_size = get_filesz(initrd_fd);
|
||||
initrd_size = xc_get_filesz(initrd_fd);
|
||||
|
||||
if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL )
|
||||
{
|
||||
@@ -747,27 +638,6 @@ loadelfimage(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
map_memcpy(
|
||||
unsigned long dst, char *src, unsigned long size,
|
||||
int xch, u32 dom, unsigned long *parray, unsigned long vstart)
|
||||
{
|
||||
char *va;
|
||||
unsigned long chunksz, done, pa;
|
||||
|
||||
for ( done = 0; done < size; done += chunksz )
|
||||
{
|
||||
pa = dst + done - vstart;
|
||||
va = xc_map_foreign_range(
|
||||
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
|
||||
chunksz = size - done;
|
||||
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
|
||||
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
|
||||
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
|
||||
munmap(va, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
#define ELFROUND (ELFSIZE / 8)
|
||||
|
||||
static int
|
||||
@@ -818,7 +688,7 @@ loadelfsymtab(
|
||||
(shdr[h].sh_type == SHT_SYMTAB) )
|
||||
{
|
||||
if ( parray != NULL )
|
||||
map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
|
||||
xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
|
||||
xch, dom, parray, dsi->v_start);
|
||||
|
||||
/* Mangled to be based on ELF header location. */
|
||||
@@ -850,7 +720,7 @@ loadelfsymtab(
|
||||
sym_ehdr->e_shstrndx = SHN_UNDEF;
|
||||
|
||||
/* Copy total length, crafted ELF header and section header table */
|
||||
map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
|
||||
xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
|
||||
ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray,
|
||||
dsi->v_start);
|
||||
}
|
||||
|
||||
@@ -19,31 +19,6 @@
|
||||
#define DPRINTF(_f, _a...) ((void)0)
|
||||
#endif
|
||||
|
||||
static int get_pfn_list(int xc_handle,
|
||||
u32 domain_id,
|
||||
unsigned long *pfn_buf,
|
||||
unsigned long max_pfns)
|
||||
{
|
||||
dom0_op_t op;
|
||||
int ret;
|
||||
op.cmd = DOM0_GETMEMLIST;
|
||||
op.u.getmemlist.domain = (domid_t)domain_id;
|
||||
op.u.getmemlist.max_pfns = max_pfns;
|
||||
op.u.getmemlist.buffer = pfn_buf;
|
||||
|
||||
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
|
||||
{
|
||||
PERROR("Could not lock pfn list buffer");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = do_dom0_op(xc_handle, &op);
|
||||
|
||||
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
|
||||
|
||||
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
|
||||
}
|
||||
|
||||
/** Read the vmconfig string from the state input.
|
||||
* It is stored as a 4-byte count 'n' followed by n bytes.
|
||||
* The config data is stored in a new string in 'ioctxt->vmconfig',
|
||||
@@ -220,7 +195,7 @@ int xc_linux_restore(int xc_handle, XcIOContext *ioctxt)
|
||||
}
|
||||
|
||||
/* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */
|
||||
if ( get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns )
|
||||
if ( xc_get_pfn_list(xc_handle, dom, pfn_to_mfn_table, nr_pfns) != nr_pfns )
|
||||
{
|
||||
xcio_error(ioctxt, "Did not read correct number of frame "
|
||||
"numbers for new dom");
|
||||
|
||||
@@ -132,52 +132,6 @@ static int
|
||||
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
|
||||
#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
|
||||
|
||||
static long
|
||||
get_tot_pages(int xc_handle, u32 domid)
|
||||
{
|
||||
dom0_op_t op;
|
||||
op.cmd = DOM0_GETDOMAININFO;
|
||||
op.u.getdomaininfo.domain = (domid_t) domid;
|
||||
op.u.getdomaininfo.ctxt = NULL;
|
||||
return (do_dom0_op(xc_handle, &op) < 0) ?
|
||||
-1 : op.u.getdomaininfo.tot_pages;
|
||||
}
|
||||
|
||||
static int
|
||||
get_pfn_list(int xc_handle,
|
||||
u32 domid, unsigned long *pfn_buf, unsigned long max_pfns)
|
||||
{
|
||||
dom0_op_t op;
|
||||
int ret;
|
||||
op.cmd = DOM0_GETMEMLIST;
|
||||
op.u.getmemlist.domain = (domid_t) domid;
|
||||
op.u.getmemlist.max_pfns = max_pfns;
|
||||
op.u.getmemlist.buffer = pfn_buf;
|
||||
|
||||
if (mlock(pfn_buf, max_pfns * sizeof (unsigned long)) != 0)
|
||||
return -1;
|
||||
|
||||
ret = do_dom0_op(xc_handle, &op);
|
||||
|
||||
(void) munlock(pfn_buf, max_pfns * sizeof (unsigned long));
|
||||
|
||||
#if 0
|
||||
#ifdef DEBUG
|
||||
DPRINTF(("Ret for get_pfn_list is %d\n", ret));
|
||||
if (ret >= 0) {
|
||||
int i, j;
|
||||
for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) {
|
||||
fprintf(stderr, "0x%x: ", i);
|
||||
for (j = 0; j < 16; j++)
|
||||
fprintf(stderr, "0x%lx ", pfn_buf[i + j]);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
|
||||
}
|
||||
|
||||
static int
|
||||
setup_guestos(int xc_handle,
|
||||
u32 dom,
|
||||
@@ -216,7 +170,7 @@ setup_guestos(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if (get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) {
|
||||
if (xc_get_pfn_list(xc_handle, dom, cpage_array, tot_pages) != tot_pages) {
|
||||
PERROR("Could not get the page frame list");
|
||||
goto error_out;
|
||||
}
|
||||
@@ -487,11 +441,11 @@ xc_plan9_build(int xc_handle,
|
||||
full_execution_context_t st_ctxt, *ctxt = &st_ctxt;
|
||||
unsigned long virt_startinfo_addr;
|
||||
|
||||
if ((tot_pages = get_tot_pages(xc_handle, domid)) < 0) {
|
||||
if ((tot_pages = xc_get_tot_pages(xc_handle, domid)) < 0) {
|
||||
PERROR("Could not find total pages for domain");
|
||||
return 1;
|
||||
}
|
||||
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
|
||||
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
|
||||
|
||||
kernel_fd = open(image_name, O_RDONLY);
|
||||
if (kernel_fd < 0) {
|
||||
@@ -505,7 +459,7 @@ xc_plan9_build(int xc_handle,
|
||||
return 1;
|
||||
}
|
||||
|
||||
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
|
||||
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
|
||||
if (mlock(&st_ctxt, sizeof (st_ctxt))) {
|
||||
PERROR("Unable to mlock ctxt");
|
||||
return 1;
|
||||
@@ -519,7 +473,7 @@ xc_plan9_build(int xc_handle,
|
||||
PERROR("Could not get info on domain");
|
||||
goto error_out;
|
||||
}
|
||||
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
|
||||
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
|
||||
|
||||
if (!(op.u.getdomaininfo.flags & DOMFLAGS_PAUSED)
|
||||
|| (op.u.getdomaininfo.ctxt->pt_base != 0)) {
|
||||
@@ -527,7 +481,7 @@ xc_plan9_build(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
DPRINTF(("get_tot_pages returns %ld pages\n", tot_pages));
|
||||
DPRINTF(("xc_get_tot_pages returns %ld pages\n", tot_pages));
|
||||
if (setup_guestos(xc_handle, domid, kernel_gfd, tot_pages,
|
||||
&virt_startinfo_addr,
|
||||
&load_addr, &st_ctxt, cmdline,
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* Helper functions for the rest of the library.
|
||||
*/
|
||||
|
||||
#include <zlib.h>
|
||||
#include "xc_private.h"
|
||||
|
||||
void *xc_map_foreign_batch(int xc_handle, u32 dom, int prot,
|
||||
@@ -201,5 +202,150 @@ unsigned long xc_get_m2p_start_mfn ( int xc_handle )
|
||||
return mfn;
|
||||
}
|
||||
|
||||
int xc_get_pfn_list(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long *pfn_buf,
|
||||
unsigned long max_pfns)
|
||||
{
|
||||
dom0_op_t op;
|
||||
int ret;
|
||||
op.cmd = DOM0_GETMEMLIST;
|
||||
op.u.getmemlist.domain = (domid_t)domid;
|
||||
op.u.getmemlist.max_pfns = max_pfns;
|
||||
op.u.getmemlist.buffer = pfn_buf;
|
||||
|
||||
|
||||
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
|
||||
{
|
||||
PERROR("Could not lock pfn list buffer");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = do_dom0_op(xc_handle, &op);
|
||||
|
||||
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
|
||||
|
||||
#if 0
|
||||
#ifdef DEBUG
|
||||
DPRINTF(("Ret for xc_get_pfn_list is %d\n", ret));
|
||||
if (ret >= 0) {
|
||||
int i, j;
|
||||
for (i = 0; i < op.u.getmemlist.num_pfns; i += 16) {
|
||||
fprintf(stderr, "0x%x: ", i);
|
||||
for (j = 0; j < 16; j++)
|
||||
fprintf(stderr, "0x%lx ", pfn_buf[i + j]);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
|
||||
}
|
||||
|
||||
long xc_get_tot_pages(int xc_handle, u32 domid)
|
||||
{
|
||||
dom0_op_t op;
|
||||
op.cmd = DOM0_GETDOMAININFO;
|
||||
op.u.getdomaininfo.domain = (domid_t)domid;
|
||||
op.u.getdomaininfo.ctxt = NULL;
|
||||
return (do_dom0_op(xc_handle, &op) < 0) ?
|
||||
-1 : op.u.getdomaininfo.tot_pages;
|
||||
}
|
||||
|
||||
int xc_copy_to_domain_page(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long dst_pfn,
|
||||
void *src_page)
|
||||
{
|
||||
void *vaddr = xc_map_foreign_range(
|
||||
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
|
||||
if ( vaddr == NULL )
|
||||
return -1;
|
||||
memcpy(vaddr, src_page, PAGE_SIZE);
|
||||
munmap(vaddr, PAGE_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long xc_get_filesz(int fd)
|
||||
{
|
||||
u16 sig;
|
||||
u32 _sz = 0;
|
||||
unsigned long sz;
|
||||
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
read(fd, &sig, sizeof(sig));
|
||||
sz = lseek(fd, 0, SEEK_END);
|
||||
if ( sig == 0x8b1f ) /* GZIP signature? */
|
||||
{
|
||||
lseek(fd, -4, SEEK_END);
|
||||
read(fd, &_sz, 4);
|
||||
sz = _sz;
|
||||
}
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
char *xc_read_kernel_image(const char *filename, unsigned long *size)
|
||||
{
|
||||
int kernel_fd = -1;
|
||||
gzFile kernel_gfd = NULL;
|
||||
char *image = NULL;
|
||||
unsigned int bytes;
|
||||
|
||||
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
|
||||
{
|
||||
PERROR("Could not open kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
*size = xc_get_filesz(kernel_fd);
|
||||
|
||||
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate decompression state for state file");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (image = malloc(*size)) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate memory for kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
|
||||
{
|
||||
PERROR("Error reading kernel image, could not"
|
||||
" read the whole image (%d != %ld).", bytes, *size);
|
||||
free(image);
|
||||
image = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
if ( kernel_gfd != NULL )
|
||||
gzclose(kernel_gfd);
|
||||
else if ( kernel_fd >= 0 )
|
||||
close(kernel_fd);
|
||||
return image;
|
||||
}
|
||||
|
||||
void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
|
||||
int xch, u32 dom, unsigned long *parray,
|
||||
unsigned long vstart)
|
||||
{
|
||||
char *va;
|
||||
unsigned long chunksz, done, pa;
|
||||
|
||||
for ( done = 0; done < size; done += chunksz )
|
||||
{
|
||||
pa = dst + done - vstart;
|
||||
va = xc_map_foreign_range(
|
||||
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
|
||||
chunksz = size - done;
|
||||
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
|
||||
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
|
||||
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
|
||||
munmap(va, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
@@ -189,4 +189,17 @@ typedef struct mfn_mapper {
|
||||
|
||||
unsigned long xc_get_m2p_start_mfn ( int xc_handle );
|
||||
|
||||
long xc_get_tot_pages(int xc_handle, u32 domid);
|
||||
|
||||
int xc_copy_to_domain_page(int xc_handle, u32 domid,
|
||||
unsigned long dst_pfn, void *src_page);
|
||||
|
||||
unsigned long xc_get_filesz(int fd);
|
||||
|
||||
char *xc_read_kernel_image(const char *filename, unsigned long *size);
|
||||
|
||||
void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
|
||||
int xch, u32 dom, unsigned long *parray,
|
||||
unsigned long vstart);
|
||||
|
||||
#endif /* __XC_PRIVATE_H__ */
|
||||
+6
-135
@@ -46,53 +46,6 @@ loadelfsymtab(
|
||||
char *elfbase, int xch, u32 dom, unsigned long *parray,
|
||||
struct domain_setup_info *dsi);
|
||||
|
||||
static long get_tot_pages(int xc_handle, u32 domid)
|
||||
{
|
||||
dom0_op_t op;
|
||||
op.cmd = DOM0_GETDOMAININFO;
|
||||
op.u.getdomaininfo.domain = (domid_t)domid;
|
||||
op.u.getdomaininfo.ctxt = NULL;
|
||||
return (do_dom0_op(xc_handle, &op) < 0) ?
|
||||
-1 : op.u.getdomaininfo.tot_pages;
|
||||
}
|
||||
|
||||
int xc_get_pfn_list(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long *pfn_buf,
|
||||
unsigned long max_pfns)
|
||||
{
|
||||
dom0_op_t op;
|
||||
int ret;
|
||||
op.cmd = DOM0_GETMEMLIST;
|
||||
op.u.getmemlist.domain = (domid_t)domid;
|
||||
op.u.getmemlist.max_pfns = max_pfns;
|
||||
op.u.getmemlist.buffer = pfn_buf;
|
||||
|
||||
|
||||
if ( mlock(pfn_buf, max_pfns * sizeof(unsigned long)) != 0 )
|
||||
return -1;
|
||||
|
||||
ret = do_dom0_op(xc_handle, &op);
|
||||
|
||||
(void)munlock(pfn_buf, max_pfns * sizeof(unsigned long));
|
||||
|
||||
return (ret < 0) ? -1 : op.u.getmemlist.num_pfns;
|
||||
}
|
||||
|
||||
static int copy_to_domain_page(int xc_handle,
|
||||
u32 domid,
|
||||
unsigned long dst_pfn,
|
||||
void *src_page)
|
||||
{
|
||||
void *vaddr = xc_map_foreign_range(
|
||||
xc_handle, domid, PAGE_SIZE, PROT_WRITE, dst_pfn);
|
||||
if ( vaddr == NULL )
|
||||
return -1;
|
||||
memcpy(vaddr, src_page, PAGE_SIZE);
|
||||
munmap(vaddr, PAGE_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int setup_guestos(int xc_handle,
|
||||
u32 dom,
|
||||
char *image, unsigned long image_size,
|
||||
@@ -225,7 +178,7 @@ static int setup_guestos(int xc_handle,
|
||||
PERROR("Error reading initrd image, could not");
|
||||
goto error_out;
|
||||
}
|
||||
copy_to_domain_page(xc_handle, dom,
|
||||
xc_copy_to_domain_page(xc_handle, dom,
|
||||
page_array[i>>PAGE_SHIFT], page);
|
||||
}
|
||||
}
|
||||
@@ -402,68 +355,6 @@ static int setup_guestos(int xc_handle,
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned long get_filesz(int fd)
|
||||
{
|
||||
u16 sig;
|
||||
u32 _sz = 0;
|
||||
unsigned long sz;
|
||||
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
read(fd, &sig, sizeof(sig));
|
||||
sz = lseek(fd, 0, SEEK_END);
|
||||
if ( sig == 0x8b1f ) /* GZIP signature? */
|
||||
{
|
||||
lseek(fd, -4, SEEK_END);
|
||||
read(fd, &_sz, 4);
|
||||
sz = _sz;
|
||||
}
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
static char *read_kernel_image(const char *filename, unsigned long *size)
|
||||
{
|
||||
int kernel_fd = -1;
|
||||
gzFile kernel_gfd = NULL;
|
||||
char *image = NULL;
|
||||
unsigned int bytes;
|
||||
|
||||
if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
|
||||
{
|
||||
PERROR("Could not open kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
*size = get_filesz(kernel_fd);
|
||||
|
||||
if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate decompression state for state file");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (image = malloc(*size)) == NULL )
|
||||
{
|
||||
PERROR("Could not allocate memory for kernel image");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
|
||||
{
|
||||
PERROR("Error reading kernel image, could not"
|
||||
" read the whole image (%d != %ld).", bytes, *size);
|
||||
free(image);
|
||||
image = NULL;
|
||||
}
|
||||
|
||||
out:
|
||||
if ( kernel_gfd != NULL )
|
||||
gzclose(kernel_gfd);
|
||||
else if ( kernel_fd >= 0 )
|
||||
close(kernel_fd);
|
||||
return image;
|
||||
}
|
||||
|
||||
#define VMX_FEATURE_FLAG 0x20
|
||||
|
||||
@@ -505,13 +396,13 @@ int xc_vmx_build(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if ( (nr_pages = get_tot_pages(xc_handle, domid)) < 0 )
|
||||
if ( (nr_pages = xc_get_tot_pages(xc_handle, domid)) < 0 )
|
||||
{
|
||||
PERROR("Could not find total pages for domain");
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
if ( (image = read_kernel_image(image_name, &image_size)) == NULL )
|
||||
if ( (image = xc_read_kernel_image(image_name, &image_size)) == NULL )
|
||||
goto error_out;
|
||||
|
||||
if ( (ramdisk_name != NULL) && (strlen(ramdisk_name) != 0) )
|
||||
@@ -522,7 +413,7 @@ int xc_vmx_build(int xc_handle,
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
initrd_size = get_filesz(initrd_fd);
|
||||
initrd_size = xc_get_filesz(initrd_fd);
|
||||
|
||||
if ( (initrd_gfd = gzdopen(initrd_fd, "rb")) == NULL )
|
||||
{
|
||||
@@ -746,26 +637,6 @@ loadelfimage(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
map_memcpy(
|
||||
unsigned long dst, char *src, unsigned long size,
|
||||
int xch, u32 dom, unsigned long *parray, unsigned long vstart)
|
||||
{
|
||||
char *va;
|
||||
unsigned long chunksz, done, pa;
|
||||
|
||||
for ( done = 0; done < size; done += chunksz )
|
||||
{
|
||||
pa = dst + done - vstart;
|
||||
va = xc_map_foreign_range(
|
||||
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
|
||||
chunksz = size - done;
|
||||
if ( chunksz > (PAGE_SIZE - (pa & (PAGE_SIZE-1))) )
|
||||
chunksz = PAGE_SIZE - (pa & (PAGE_SIZE-1));
|
||||
memcpy(va + (pa & (PAGE_SIZE-1)), src + done, chunksz);
|
||||
munmap(va, PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
#define ELFROUND (ELFSIZE / 8)
|
||||
|
||||
@@ -817,7 +688,7 @@ loadelfsymtab(
|
||||
(shdr[h].sh_type == SHT_SYMTAB) )
|
||||
{
|
||||
if ( parray != NULL )
|
||||
map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
|
||||
xc_map_memcpy(maxva, elfbase + shdr[h].sh_offset, shdr[h].sh_size,
|
||||
xch, dom, parray, dsi->v_start);
|
||||
|
||||
/* Mangled to be based on ELF header location. */
|
||||
@@ -849,7 +720,7 @@ loadelfsymtab(
|
||||
sym_ehdr->e_shstrndx = SHN_UNDEF;
|
||||
|
||||
/* Copy total length, crafted ELF header and section header table */
|
||||
map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
|
||||
xc_map_memcpy(symva, p, sizeof(int) + sizeof(Elf_Ehdr) +
|
||||
ehdr->e_shnum * sizeof(Elf_Shdr), xch, dom, parray,
|
||||
dsi->v_start);
|
||||
}
|
||||
|
||||