On 04/26/2016 01:41 PM, Jan Beulich wrote:
On 26.04.16 at 13:06, <ross.lagerw...@citrix.com> wrote:
On 04/25/2016 04:35 PM, Konrad Rzeszutek Wilk wrote:
@@ -142,6 +145,55 @@ void *xsplice_symbols_lookup_by_name(const char *symname)
return 0;
}
+static const char *xsplice_symbols_lookup(unsigned long addr,
+ unsigned long *symbolsize,
+ unsigned long *offset,
+ char *namebuf)
+{
+ const struct payload *data;
+ unsigned int i, best;
+ const void *va = (const void *)addr;
+ const char *n = NULL;
+
+ /*
+ * 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 ( va < data->text_addr &&
+ va >= (data->text_addr + data->pages * PAGE_SIZE) )
This calculation is wrong due to the use of void * and results in
incorrect backtrace results.
When text_addr is void *, how is this calculation wrong then?
I'm sorry, ignore that. I temporarily forgot how void* arithmetic is
defined for GCC.
The other two points are still valid and may result in incorrect
backtraces with > 1 payload loaded.
@@ -422,6 +475,13 @@ static int prepare_payload(struct payload *payload,
}
}
+ /* Setup the virtual region with proper data. */
+ region = &payload->region;
+
+ region->symbols_lookup = xsplice_symbols_lookup;
+ region->start = payload->text_addr;
+ region->end = payload->text_addr + payload->text_size;
This calculation is wrong due to the use of void *.
And again - why?
Jan
--
Ross Lagerwall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel