Daniel Kiper
2012-Aug-10 13:28 UTC
[PATCH v2 5/6] xen: Read data correctly from dynamically allocated console ring, too
console ring is dynamically allocated since 19543 changeset (New option conring_size= to allow larger console ring). Take into account that and read data correctly from it, too. v2 - Dave Anderson suggestions/fixes: - check conring type before determining its value. Signed-off-by: Daniel Kiper <daniel.kiper-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> diff -Npru crash-6.0.8.orig/xen_hyper_command.c crash-6.0.8/xen_hyper_command.c --- crash-6.0.8.orig/xen_hyper_command.c 2012-06-29 16:59:18.000000000 +0200 +++ crash-6.0.8/xen_hyper_command.c 2012-08-10 14:05:24.000000000 +0200 @@ -590,24 +590,35 @@ xen_hyper_dump_log(void) ulong conring; char *buf; char last; + uint32_t conring_size; + + if (get_symbol_type("conring", NULL, NULL) == TYPE_CODE_ARRAY) + conring = symbol_value("conring"); + else + get_symbol_data("conring", sizeof(ulong), &conring); - conring = symbol_value("conring"); get_symbol_data("conringc", sizeof(uint), &conringc); get_symbol_data("conringp", sizeof(uint), &conringp); + + if (symbol_exists("conring_size")) + get_symbol_data("conring_size", sizeof(uint32_t), &conring_size); + else + conring_size = XEN_HYPER_CONRING_SIZE; + warp = FALSE; - if (conringp >= XEN_HYPER_CONRING_SIZE) { - if ((start = conringp & (XEN_HYPER_CONRING_SIZE - 1))) { + if (conringp >= conring_size) { + if ((start = conringp & (conring_size - 1))) { warp = TRUE; } } else { start = 0; } - buf = GETBUF(XEN_HYPER_CONRING_SIZE); - readmem(conring, KVADDR, buf, XEN_HYPER_CONRING_SIZE, + buf = GETBUF(conring_size); + readmem(conring, KVADDR, buf, conring_size, "conring contents", FAULT_ON_ERROR); idx = start; - len = XEN_HYPER_CONRING_SIZE; + len = conring_size; last = 0; wrap_around: