diff options
-rw-r--r-- | tools/libxc/xc_dom_elfloader.c | 17 | ||||
-rw-r--r-- | tools/libxc/xenctrl.h | 5 | ||||
-rw-r--r-- | tools/xcutils/readnotes.c | 2 | ||||
-rw-r--r-- | xen/common/libelf/libelf-loader.c | 22 | ||||
-rw-r--r-- | xen/common/libelf/libelf-private.h | 15 | ||||
-rw-r--r-- | xen/common/libelf/libelf-relocate.c | 2 | ||||
-rw-r--r-- | xen/include/xen/libelf.h | 13 |
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); |