|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8.1 16/27] x86, xsplice: Print payload's symbol name and payload name in backtraces
>>> Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> 04/14/16 12:03 AM >>>
>@@ -331,16 +332,23 @@ static char *pointer(char *str, char *end, const char
>**fmt_ptr,
>{
>unsigned long sym_size, sym_offset;
>char namebuf[KSYM_NAME_LEN+1];
>+ bool_t payload = 0;
I don't see the point of this variable. You can simply do ...
>/* Advance parents fmt string, as we have consumed 's' or 'S' */
>++*fmt_ptr;
>
>s = symbols_lookup((unsigned long)arg, &sym_size, &sym_offset,
namebuf);
>-
>- /* If the symbol is not found, fall back to printing the address */
>+ /* If the symbol is not found, fall back to printing the address. */
... (perhaps omitting this unrelated style correction) ...
>if ( !s )
>break;
>
>+ /*
>+ * namebuf contents and s for core hypervisor are same but for xSplice
>+ * payloads they differ (namebuf contains the name of the payload).
>+ */
>+ if ( namebuf != s )
... this comparison ...
>@@ -354,6 +362,13 @@ static char *pointer(char *str, char *end, const char
>**fmt_ptr,
>str = number(str, end, sym_size, 16, -1, -1, SPECIAL);
>}
>
>+ if ( payload )
... here.
>+static const char *xsplice_symbols_lookup(unsigned long addr,
>+ unsigned long *symbolsize,
>+ unsigned long *offset,
>+ char *namebuf)
>+{
>+ struct payload *data;
const
>+ unsigned int i;
>+ int best;
>+
>+ /*
>+ * No locking since this list is only ever changed during apply or revert
>+ * context.
>+ */
>+ list_for_each_entry ( data, &applied_list, applied_list )
>+ {
>+ if ( (void *)addr < data->text_addr &&
>+ (void *)addr >= (data->text_addr + data->pages * PAGE_SIZE) )
>+ continue;
>+
>+ best = -1;
>+
>+ for ( i = 0; i < data->nsyms; i++ )
>+ {
>+ if ( data->symtab[i].value <= addr &&
>+ (best == -1 ||
>+ data->symtab[best].value < data->symtab[i].value) )
>+ best = i;
Considering this, "best" would probably also better be unsigned int, and
you could then set and compare it to data->nsyms or UINT_MAX.
>+ }
>+
>+ if ( best == -1 )
>+ return NULL;
>+
>+ if ( symbolsize )
>+ *symbolsize = data->symtab[best].size;
Ah, here is where you need the size.
>@@ -425,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 = (unsigned long)payload->text_addr;
>+ region->end = (unsigned long)(payload->text_addr + payload->text_size);
Again makes questionable whether region's start and end fields wouldn't better
be
const void *.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |