From mboxrd@z Thu Jan 1 00:00:00 1970 From: Don Slutz Subject: [PATCH v3 05/16] xenctx: Add command line options -b and -l Date: Mon, 11 Nov 2013 13:15:11 -0500 Message-ID: <1384193722-2916-6-git-send-email-dslutz@terremark.com> References: <1384193722-2916-1-git-send-email-dslutz@terremark.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1384193722-2916-1-git-send-email-dslutz@terremark.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ian Campbell , Stefano Stabellini , George Dunlap , Ian Jackson , Don Slutz , Jan Beulich List-Id: xen-devel@lists.xenproject.org From: Don Slutz -b , --bytes-per-line change the number of bytes per line output for Stack. note: rounded to native size (4 or 8 bytes). -l , --lines change the number of lines output for Stack. Signed-off-by: Don Slutz --- tools/xentrace/xenctx.c | 62 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 038536b..62ba94c 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -36,6 +36,8 @@ static struct xenctx { int stack_trace; int disp_all; int two_pages; + int bytes_per_line; + int lines; int all_vcpus; int self_paused; xc_dominfo_t dominfo; @@ -62,6 +64,8 @@ typedef uint64_t guest_word_t; #define FMT_64B_WORD "%016lx" #endif +#define MAX_BYTES_PER_LINE 128 + struct symbol { guest_word_t address; char *name; @@ -649,25 +653,30 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width) guest_word_t *p; int i; + if (width) + xenctx.bytes_per_line = ((xenctx.bytes_per_line + width - 1) / width) * width; stack_limit = ((stack_pointer(ctx) + XC_PAGE_SIZE) & ~((guest_word_t) XC_PAGE_SIZE - 1)); if (xenctx.two_pages) stack_limit += XC_PAGE_SIZE; printf("\n"); - printf("Stack:\n"); - for (i=1; i<5 && stack < stack_limit; i++) { - while(stack < stack_limit && stack < stack_pointer(ctx) + i*32) { - p = map_page(ctx, vcpu, stack); - if (!p) - return -1; - word = read_stack_word(p, width); - printf(" "); - print_stack_word(word, width); - stack += width; + if (xenctx.lines) { + printf("Stack:\n"); + for (i = 1; i < xenctx.lines + 1 && stack < stack_limit; i++) { + while(stack < stack_limit && + stack < stack_pointer(ctx) + i * xenctx.bytes_per_line) { + p = map_page(ctx, vcpu, stack); + if (!p) + return -1; + word = read_stack_word(p, width); + printf(" "); + print_stack_word(word, width); + stack += width; + } + printf("\n"); } printf("\n"); } - printf("\n"); if(xenctx.stack_trace) printf("Stack Trace:\n"); @@ -827,19 +836,26 @@ static void usage(void) printf(" -a, --all display more registers\n"); printf(" -C, --all-vcpus print info for all vcpus\n"); printf(" -2, --two-pages assume the kernel was compiled with 8KiB stacks.\n"); + printf(" -b , --bytes-per-line \n"); + printf(" change the number of bytes per line output for Stack.\n"); + printf(" note: rounded to native size (4 or 8 bytes).\n"); + printf(" -l , --lines \n"); + printf(" change the number of lines output for Stack.\n"); } int main(int argc, char **argv) { int ch; int ret; - static const char *sopts = "fs:hak:SC2"; + static const char *sopts = "fs:hak:SC2b:l:"; static const struct option lopts[] = { {"stack-trace", 0, NULL, 'S'}, {"symbol-table", 1, NULL, 's'}, {"frame-pointers", 0, NULL, 'f'}, {"kernel-start", 1, NULL, 'k'}, {"two-pages", 0, NULL, '2'}, + {"bytes-per-line", 1, NULL, 'b'}, + {"lines", 1, NULL, 'l'}, {"all", 0, NULL, 'a'}, {"all-vcpus", 0, NULL, 'C'}, {"help", 0, NULL, 'h'}, @@ -849,6 +865,9 @@ int main(int argc, char **argv) int vcpu = 0; + xenctx.bytes_per_line = 32; + xenctx.lines = 5; + while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { switch(ch) { case 'f': @@ -866,6 +885,25 @@ int main(int argc, char **argv) case '2': xenctx.two_pages = 1; break; + case 'b': + xenctx.bytes_per_line = strtol(optarg, NULL, 0); + if (xenctx.bytes_per_line < 4 || + xenctx.bytes_per_line > MAX_BYTES_PER_LINE) { + fprintf(stderr, + "%s: Unsupported value for --bytes-per-line. Needs to be 4 <= <= %d\n", + argv[0], MAX_BYTES_PER_LINE); + exit(-1); + } + break; + case 'l': + xenctx.lines = strtol(optarg, NULL, 0); + if (xenctx.lines < 0) { + fprintf(stderr, + "%s: Unsupported value for --lines. Needs to be >= 0\n", + argv[0]); + exit(-1); + } + break; case 'C': xenctx.all_vcpus = 1; break; -- 1.8.4