[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] xsplice: Add support for bug frames.
commit b3de9fb745318484c8ebd8c676ab24a0a3bd5483 Author: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> AuthorDate: Wed Apr 27 11:30:54 2016 -0400 Commit: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> CommitDate: Fri Apr 29 03:58:52 2016 -0400 xsplice: Add support for bug frames. Add support for handling bug frames contained with xsplice modules. If a trap occurs search either the kernel bug table or an applied payload's bug table depending on the instruction pointer. Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Release-acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/traps.c | 5 +++-- xen/common/xsplice.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ xen/include/xen/xsplice.h | 5 +++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index f73f7f3..8384158 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -50,6 +50,7 @@ #include <xen/paging.h> #include <xen/virtual_region.h> #include <xen/watchdog.h> +#include <xen/xsplice.h> #include <asm/system.h> #include <asm/io.h> #include <asm/atomic.h> @@ -1287,7 +1288,7 @@ void do_invalid_op(struct cpu_user_regs *regs) /* WARN, BUG or ASSERT: decode the filename pointer and line number. */ filename = bug_ptr(bug); - if ( !is_kernel(filename) ) + if ( !is_kernel(filename) && !is_patch(filename) ) goto die; fixup = strlen(filename); if ( fixup > 50 ) @@ -1314,7 +1315,7 @@ void do_invalid_op(struct cpu_user_regs *regs) case BUGFRAME_assert: /* ASSERT: decode the predicate string pointer. */ predicate = bug_msg(bug); - if ( !is_kernel(predicate) ) + if ( !is_kernel(predicate) && !is_patch(predicate) ) predicate = "<unknown>"; printk("Assertion '%s' failed at %s%s:%d\n", diff --git a/xen/common/xsplice.c b/xen/common/xsplice.c index e7872c6..9211746 100644 --- a/xen/common/xsplice.c +++ b/xen/common/xsplice.c @@ -120,6 +120,35 @@ static int verify_payload(const xen_sysctl_xsplice_upload_t *upload, char *n) return 0; } +bool_t is_patch(const void *ptr) +{ + const struct payload *data; + bool_t r = 0; + + /* + * Only RCU locking since this list is only ever changed during apply + * or revert context. And in case it dies there we need an safe list. + */ + rcu_read_lock(&rcu_applied_lock); + list_for_each_entry_rcu ( data, &applied_list, applied_list ) + { + if ( (ptr >= data->rw_addr && + ptr < (data->rw_addr + data->rw_size)) || + (ptr >= data->ro_addr && + ptr < (data->ro_addr + data->ro_size)) || + (ptr >= data->text_addr && + ptr < (data->text_addr + data->text_size)) ) + { + r = 1; + break; + } + + } + rcu_read_unlock(&rcu_applied_lock); + + return r; +} + unsigned long xsplice_symbols_lookup_by_name(const char *symname) { const struct payload *data; @@ -480,6 +509,28 @@ static int prepare_payload(struct payload *payload, region->start = payload->text_addr; region->end = payload->text_addr + payload->text_size; + /* Optional sections. */ + for ( i = 0; i < BUGFRAME_NR; i++ ) + { + char str[14]; + + snprintf(str, sizeof(str), ".bug_frames.%u", i); + sec = xsplice_elf_sec_by_name(elf, str); + if ( !sec ) + continue; + + if ( sec->sec->sh_size % sizeof(*region->frame[i].bugs) ) + { + dprintk(XENLOG_ERR, XSPLICE "%s: Wrong size of .bug_frames.%u!\n", + elf->name, i); + return -EINVAL; + } + + region->frame[i].bugs = sec->load_addr; + region->frame[i].n_bugs = sec->sec->sh_size / + sizeof(*region->frame[i].bugs); + } + return 0; } diff --git a/xen/include/xen/xsplice.h b/xen/include/xen/xsplice.h index 331c383..84d782b 100644 --- a/xen/include/xen/xsplice.h +++ b/xen/include/xen/xsplice.h @@ -29,6 +29,7 @@ struct xsplice_symbol { int xsplice_op(struct xen_sysctl_xsplice_op *); void check_for_xsplice_work(void); unsigned long xsplice_symbols_lookup_by_name(const char *symname); +bool_t is_patch(const void *addr); /* Arch hooks. */ int arch_xsplice_verify_elf(const struct xsplice_elf *elf); @@ -76,6 +77,10 @@ static inline int xsplice_op(struct xen_sysctl_xsplice_op *op) } static inline void check_for_xsplice_work(void) { }; +static inline bool_t is_patch(const void *addr) +{ + return 0; +} #endif /* CONFIG_XSPLICE */ #endif /* __XEN_XSPLICE_H__ */ -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |