aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/libxc/xc_dom_elfloader.c17
-rw-r--r--tools/libxc/xenctrl.h5
-rw-r--r--tools/xcutils/readnotes.c2
-rw-r--r--xen/common/libelf/libelf-loader.c22
-rw-r--r--xen/common/libelf/libelf-private.h15
-rw-r--r--xen/common/libelf/libelf-relocate.c2
-rw-r--r--xen/include/xen/libelf.h13
7 files changed, 61 insertions, 15 deletions
diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
index f9bbd85ba3..280f722d30 100644
--- a/tools/libxc/xc_dom_elfloader.c
+++ b/tools/libxc/xc_dom_elfloader.c
@@ -9,6 +9,7 @@
*/
#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <inttypes.h>
#include "xg_private.h"
@@ -18,6 +19,17 @@
/* ------------------------------------------------------------------------ */
+static void log_callback(struct elf_binary *elf, void *caller_data,
+ int iserr, const char *fmt, va_list al) {
+ vfprintf(caller_data,fmt,al);
+}
+
+void xc_elf_set_logfile(struct elf_binary *elf, FILE *f, int verbose) {
+ elf_set_log(elf, log_callback, f, verbose);
+}
+
+/* ------------------------------------------------------------------------ */
+
static char *xc_dom_guest_type(struct xc_dom_image *dom,
struct elf_binary *elf)
{
@@ -137,8 +149,9 @@ 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 )
- elf_set_logfile(&syms, xc_dom_logfile, 1);
+ xc_elf_set_logfile(&syms, xc_dom_logfile, 1);
symtab = dom->bsd_symtab_start + sizeof(int);
maxaddr = elf_round_up(&syms, symtab + elf_size(&syms, syms.ehdr) +
@@ -231,7 +244,7 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom)
dom->private_loader = elf;
rc = elf_init(elf, dom->kernel_blob, dom->kernel_size);
if ( xc_dom_logfile )
- elf_set_logfile(elf, xc_dom_logfile, 1);
+ xc_elf_set_logfile(elf, xc_dom_logfile, 1);
if ( rc != 0 )
{
xc_dom_panic(XC_INVALID_KERNEL, "%s: corrupted ELF image\n",
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 2d01467d82..f63f96deb7 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -19,6 +19,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <stdio.h>
#include <xen/xen.h>
#include <xen/domctl.h>
#include <xen/physdev.h>
@@ -1474,4 +1475,8 @@ int xc_memshr_debug_gref(int xc_handle,
uint32_t domid,
grant_ref_t gref);
+struct elf_binary;
+void xc_elf_set_logfile(struct elf_binary *elf, FILE *f, int verbose);
+/* Useful for callers who also use libelf. */
+
#endif /* XENCTRL_H */
diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c
index b770f56fe9..270c48b017 100644
--- a/tools/xcutils/readnotes.c
+++ b/tools/xcutils/readnotes.c
@@ -170,7 +170,7 @@ int main(int argc, char **argv)
fprintf(stderr, "File %s is not an ELF image\n", f);
return 1;
}
- elf_set_logfile(&elf, stderr, 0);
+ xc_elf_set_logfile(&elf, stderr, 0);
count = elf_phdr_count(&elf);
for ( h=0; h < count; h++)
diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c
index 5e86555817..f50524f690 100644
--- a/xen/common/libelf/libelf-loader.c
+++ b/xen/common/libelf/libelf-loader.c
@@ -2,6 +2,8 @@
* parse and load elf binaries
*/
+#include <stdarg.h>
+
#include "libelf-private.h"
/* ------------------------------------------------------------------------ */
@@ -72,9 +74,25 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size)
}
#ifndef __XEN__
-void elf_set_logfile(struct elf_binary *elf, FILE * log, int verbose)
+void elf_call_log_callback(struct elf_binary *elf, int iserr,
+ const char *fmt,...) {
+ va_list al;
+
+ if (!elf->log_callback)
+ return;
+ if (!(iserr || elf->verbose))
+ return;
+
+ va_start(al,fmt);
+ elf->log_callback(elf, elf->log_caller_data, iserr, fmt, al);
+ va_end(al);
+}
+
+void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback,
+ void *log_caller_data, int verbose)
{
- elf->log = log;
+ elf->log_callback = log_callback;
+ elf->log_caller_data = log_caller_data;
elf->verbose = verbose;
}
#else
diff --git a/xen/common/libelf/libelf-private.h b/xen/common/libelf/libelf-private.h
index e207b690c4..fcce9e331a 100644
--- a/xen/common/libelf/libelf-private.h
+++ b/xen/common/libelf/libelf-private.h
@@ -11,6 +11,8 @@
#include <asm/byteorder.h>
#include <public/elfnote.h>
+/* we would like to use elf->log_callback but we can't because
+ * there is no vprintk in Xen */
#define elf_msg(elf, fmt, args ... ) \
if (elf->verbose) printk(fmt, ## args )
#define elf_err(elf, fmt, args ... ) \
@@ -54,13 +56,12 @@
#include "xenctrl.h"
#include "xc_private.h"
-#define elf_msg(elf, fmt, args ... ) \
- if (elf->log && elf->verbose) fprintf(elf->log, fmt , ## args )
-#define elf_err(elf, fmt, args ... ) do { \
- if (elf->log) \
- fprintf(elf->log, fmt , ## args ); \
- xc_set_error(XC_INVALID_KERNEL, fmt , ## args ); \
-} while (0)
+#define elf_msg(elf, fmt, args ... ) \
+ elf_call_log_callback(elf, 0, fmt , ## args );
+#define elf_err(elf, fmt, args ... ) \
+ elf_call_log_callback(elf, 1, fmt , ## args );
+
+void elf_call_log_callback(struct elf_binary*, int iserr, const char *fmt,...);
#define safe_strcpy(d,s) \
do { strncpy((d),(s),sizeof((d))-1); \
diff --git a/xen/common/libelf/libelf-relocate.c b/xen/common/libelf/libelf-relocate.c
index 89cea4411b..fe9891da70 100644
--- a/xen/common/libelf/libelf-relocate.c
+++ b/xen/common/libelf/libelf-relocate.c
@@ -289,7 +289,7 @@ static int elf_reloc_section(struct elf_binary *elf,
value = elf_uval(elf, sym, st_value);
value += r_addend;
- if ( elf->log && (elf->verbose > 1) )
+ if ( elf->log_callback && (elf->verbose > 1) )
{
uint64_t st_name = elf_uval(elf, sym, st_name);
const char *name = st_name ? elf->sym_strtab + st_name : "*NONE*";
diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h
index 1c92a73f1d..584d8b3b2d 100644
--- a/xen/include/xen/libelf.h
+++ b/xen/include/xen/libelf.h
@@ -37,6 +37,13 @@
#else
#include <xen/elfnote.h>
#include <xen/features.h>
+
+#include <stdarg.h>
+
+struct elf_binary;
+typedef void elf_log_callback(struct elf_binary*, void *caller_data,
+ int iserr, const char *fmt, va_list al);
+
#endif
/* ------------------------------------------------------------------------ */
@@ -99,7 +106,8 @@ struct elf_binary {
#ifndef __XEN__
/* misc */
- FILE *log;
+ elf_log_callback *log_callback;
+ void *log_caller_data;
#endif
int verbose;
};
@@ -183,7 +191,8 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size);
#ifdef __XEN__
void elf_set_verbose(struct elf_binary *elf);
#else
-void elf_set_logfile(struct elf_binary *elf, FILE * log, int verbose);
+void elf_set_log(struct elf_binary *elf, elf_log_callback*,
+ void *log_caller_pointer, int verbose);
#endif
void elf_parse_binary(struct elf_binary *elf);