aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_dom_elfloader.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:30:19 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:30:19 +0100
commit5cc436c1d2b3b0be3f42104582f53eec3969b43a (patch)
tree1e30ade146ee7287c486d1309b5d3d2c69a2d9b9 /tools/libxc/xc_dom_elfloader.c
parent7f9a888af4b65cb8c22cea3c8295d30d0fedd623 (diff)
downloadxen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.tar.gz
xen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.tar.bz2
xen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.zip
libxc: eliminate static variables, use xentoollog; API change
This patch eliminate the global variables in libxenctrl (used for logging and error reporting). Instead the information which was in the global variables is now in a new xc_interface* opaque structure, which xc_interface open returns instead of the raw file descriptor; furthermore, logging is done via xentoollog. There are three new parameters to xc_interface_open to control the logging, but existing callers can just pass "0" for all three to get the old behaviour. All libxc callers have been adjusted accordingly. Also update QEMU_TAG for corresponding qemu change. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxc/xc_dom_elfloader.c')
-rw-r--r--tools/libxc/xc_dom_elfloader.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
index 280f722d30..7ecab25ab8 100644
--- a/tools/libxc/xc_dom_elfloader.c
+++ b/tools/libxc/xc_dom_elfloader.c
@@ -21,11 +21,18 @@
static void log_callback(struct elf_binary *elf, void *caller_data,
int iserr, const char *fmt, va_list al) {
- vfprintf(caller_data,fmt,al);
+ struct xc_interface *xch = caller_data;
+
+ xc_reportv(xch,
+ xch->dombuild_logger ? xch->dombuild_logger : xch->error_handler,
+ iserr ? XTL_ERROR : XTL_DETAIL,
+ iserr ? XC_INVALID_KERNEL : XC_ERROR_NONE,
+ fmt, al);
}
-void xc_elf_set_logfile(struct elf_binary *elf, FILE *f, int verbose) {
- elf_set_log(elf, log_callback, f, verbose);
+void xc_elf_set_logfile(struct xc_interface *xch, struct elf_binary *elf,
+ int verbose) {
+ elf_set_log(elf, log_callback, xch, verbose);
}
/* ------------------------------------------------------------------------ */
@@ -68,7 +75,8 @@ static int check_elf_kernel(struct xc_dom_image *dom, int verbose)
if ( dom->kernel_blob == NULL )
{
if ( verbose )
- xc_dom_panic(XC_INTERNAL_ERROR, "%s: no kernel image loaded\n",
+ xc_dom_panic(dom->xch,
+ XC_INTERNAL_ERROR, "%s: no kernel image loaded",
__FUNCTION__);
return -EINVAL;
}
@@ -76,7 +84,8 @@ static int check_elf_kernel(struct xc_dom_image *dom, int verbose)
if ( !elf_is_elfbinary(dom->kernel_blob) )
{
if ( verbose )
- xc_dom_panic(XC_INVALID_KERNEL, "%s: kernel is not an ELF image\n",
+ xc_dom_panic(dom->xch,
+ XC_INVALID_KERNEL, "%s: kernel is not an ELF image",
__FUNCTION__);
return -EINVAL;
}
@@ -100,8 +109,8 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
if ( elf_swap(elf) )
{
- xc_dom_printf("%s: non-native byte order, bsd symtab not supported\n",
- __FUNCTION__);
+ DOMPRINTF("%s: non-native byte order, bsd symtab not supported",
+ __FUNCTION__);
return 0;
}
@@ -150,18 +159,17 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
if ( elf_init(&syms, hdr + sizeof(int), size - sizeof(int)) )
return -1;
- if ( xc_dom_logfile )
- xc_elf_set_logfile(&syms, xc_dom_logfile, 1);
+ xc_elf_set_logfile(dom->xch, &syms, 1);
symtab = dom->bsd_symtab_start + sizeof(int);
maxaddr = elf_round_up(&syms, symtab + elf_size(&syms, syms.ehdr) +
elf_shdr_count(&syms) * elf_size(&syms, shdr));
- xc_dom_printf("%s/%s: bsd_symtab_start=%" PRIx64 ", kernel.end=0x%" PRIx64
- " -- symtab=0x%" PRIx64 ", maxaddr=0x%" PRIx64 "\n",
- __FUNCTION__, load ? "load" : "parse",
- dom->bsd_symtab_start, dom->kernel_seg.vend,
- symtab, maxaddr);
+ DOMPRINTF("%s/%s: bsd_symtab_start=%" PRIx64 ", kernel.end=0x%" PRIx64
+ " -- symtab=0x%" PRIx64 ", maxaddr=0x%" PRIx64 "",
+ __FUNCTION__, load ? "load" : "parse",
+ dom->bsd_symtab_start, dom->kernel_seg.vend,
+ symtab, maxaddr);
count = elf_shdr_count(&syms);
for ( h = 0; h < count; h++ )
@@ -199,10 +207,10 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
size = elf_uval(&syms, shdr, sh_size);
maxaddr = elf_round_up(&syms, maxaddr + size);
tables++;
- xc_dom_printf("%s: h=%d %s, size=0x%zx, maxaddr=0x%" PRIx64 "\n",
- __FUNCTION__, h,
- type == SHT_SYMTAB ? "symtab" : "strtab",
- size, maxaddr);
+ DOMPRINTF("%s: h=%d %s, size=0x%zx, maxaddr=0x%" PRIx64 "",
+ __FUNCTION__, h,
+ type == SHT_SYMTAB ? "symtab" : "strtab",
+ size, maxaddr);
if ( load )
{
@@ -222,7 +230,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom,
if ( tables == 0 )
{
- xc_dom_printf("%s: no symbol table present\n", __FUNCTION__);
+ DOMPRINTF("%s: no symbol table present", __FUNCTION__);
dom->bsd_symtab_start = 0;
return 0;
}
@@ -243,11 +251,10 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom)
elf = xc_dom_malloc(dom, sizeof(*elf));
dom->private_loader = elf;
rc = elf_init(elf, dom->kernel_blob, dom->kernel_size);
- if ( xc_dom_logfile )
- xc_elf_set_logfile(elf, xc_dom_logfile, 1);
+ xc_elf_set_logfile(dom->xch, elf, 1);
if ( rc != 0 )
{
- xc_dom_panic(XC_INVALID_KERNEL, "%s: corrupted ELF image\n",
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: corrupted ELF image",
__FUNCTION__);
return rc;
}
@@ -255,8 +262,8 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom)
/* Find the section-header strings table. */
if ( elf->sec_strtab == NULL )
{
- xc_dom_panic(XC_INVALID_KERNEL, "%s: ELF image has no shstrtab\n",
- __FUNCTION__);
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: ELF image"
+ " has no shstrtab", __FUNCTION__);
return -EINVAL;
}
@@ -273,9 +280,9 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom)
xc_dom_load_elf_symtab(dom, elf, 0);
dom->guest_type = xc_dom_guest_type(dom, elf);
- xc_dom_printf("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "\n",
- __FUNCTION__, dom->guest_type,
- dom->kernel_seg.vstart, dom->kernel_seg.vend);
+ DOMPRINTF("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "",
+ __FUNCTION__, dom->guest_type,
+ dom->kernel_seg.vstart, dom->kernel_seg.vend);
return 0;
}