All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Don Slutz <dslutz@verizon.com>
Cc: Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Don Slutz <Don@CloudSwitch.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	xen-devel@lists.xen.org, Jan Beulich <JBeulich@suse.com>
Subject: Re: [PATCH v2 11/12] xenctx: Dump registers via hvm info if available.
Date: Wed, 6 Nov 2013 20:35:03 +0000	[thread overview]
Message-ID: <527AA7F7.7010901@citrix.com> (raw)
In-Reply-To: <1383768500-4245-12-git-send-email-dslutz@terremark.com>

On 06/11/13 20:08, Don Slutz wrote:
> From: Don Slutz <Don@CloudSwitch.com>
>
> This allows the output of registers that are not available in the
> not HVM view.
>
> Look up symbols for various registers as kernel data.
>
> Also a minor check that ip, sp, and cr3 are the same.
>
> Signed-off-by: Don Slutz <Don@CloudSwitch.com>

What about tools/misc/xen-hvmctx ?

This is a particularly awkward tool where we have two tools in different
subtrees which do about 80% the same thing.

I would certainly not object if someone were to merge these two tools
into one.  It is particularly awkward as xen-hvmctx ends up being
installed into /usr/sbin/ and is therefore on the $PATH, while xenctx
ends up off the $PATH in /usr/lib/xen/bin/

I am also fairly sure we have other examples of tools like this with
sightly different variants living in different locations.

~Andrew

> ---
>  tools/xentrace/xenctx.c |  284 ++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 282 insertions(+), 2 deletions(-)
>
> diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
> index 6ec9c74..d3cbb22 100644
> --- a/tools/xentrace/xenctx.c
> +++ b/tools/xentrace/xenctx.c
> @@ -415,6 +415,247 @@ static void print_ctx(vcpu_guest_context_any_t *ctx)
>          print_ctx_64(&ctx->x64);
>  }
>  
> +#if defined(__i386__) || defined(__x86_64__)
> +static void print_cpuctx_regs64(struct hvm_hw_cpu *ctx)
> +{
> +    printf("rip: %016"PRIx64, ctx->rip);
> +    print_symbol(ctx->rip, KERNEL_TEXT_ADDR);
> +    print_flags(ctx->rflags);
> +    printf("rsp: %016"PRIx64"\n", ctx->rsp);
> +
> +    printf("rax: %016"PRIx64"\t", ctx->rax);
> +    printf("rcx: %016"PRIx64"\t", ctx->rcx);
> +    printf("rdx: %016"PRIx64"\n", ctx->rdx);
> +
> +    printf("rbx: %016"PRIx64"\t", ctx->rbx);
> +    printf("rsi: %016"PRIx64"\t", ctx->rsi);
> +    printf("rdi: %016"PRIx64"\n", ctx->rdi);
> +
> +    printf("rbp: %016"PRIx64"\t", ctx->rbp);
> +    printf(" r8: %016"PRIx64"\t", ctx->r8);
> +    printf(" r9: %016"PRIx64"\n", ctx->r9);
> +
> +    printf("r10: %016"PRIx64"\t", ctx->r10);
> +    printf("r11: %016"PRIx64"\t", ctx->r11);
> +    printf("r12: %016"PRIx64"\n", ctx->r12);
> +
> +    printf("r13: %016"PRIx64"\t", ctx->r13);
> +    printf("r14: %016"PRIx64"\t", ctx->r14);
> +    printf("r15: %016"PRIx64"\n", ctx->r15);
> +
> +    printf("  cs: %04x @ %016"PRIx64, ctx->cs_sel, ctx->cs_base);
> +    if (ctx->cs_base)
> +        print_symbol(ctx->cs_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->cs_limit, ctx->cs_arbytes);
> +    printf("  ss: %04x @ %016"PRIx64, ctx->ss_sel, ctx->ss_base);
> +    if (ctx->ss_base)
> +        print_symbol(ctx->ss_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->ss_limit, ctx->ss_arbytes);
> +    printf("  ds: %04x @ %016"PRIx64, ctx->ds_sel, ctx->ds_base);
> +    if (ctx->ds_base)
> +        print_symbol(ctx->ds_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->ds_limit, ctx->ds_arbytes);
> +    printf("  es: %04x @ %016"PRIx64, ctx->es_sel, ctx->es_base);
> +    if (ctx->es_base)
> +        print_symbol(ctx->es_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->es_limit, ctx->es_arbytes);
> +    printf("  fs: %04x @ %016"PRIx64, ctx->fs_sel, ctx->fs_base);
> +    if (ctx->fs_base)
> +        print_symbol(ctx->fs_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->fs_limit, ctx->fs_arbytes);
> +    printf("  gs: %04x @ %016"PRIx64"\\%016"PRIx64, ctx->gs_sel,
> +           ctx->gs_base, ctx->shadow_gs);
> +    if (ctx->gs_base)
> +        print_symbol(ctx->gs_base, KERNEL_DATA_ADDR);
> +    printf("\\");
> +    if (ctx->shadow_gs)
> +        print_symbol(ctx->shadow_gs, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->gs_limit, ctx->gs_arbytes);
> +
> +    if (xenctx.disp_all) {
> +        printf("  tr: %04x @ %016"PRIx64, ctx->tr_sel, ctx->tr_base);
> +        if (ctx->tr_base)
> +            print_symbol(ctx->tr_base, KERNEL_DATA_ADDR);
> +        printf("\n           /%08x(%x)\n", ctx->tr_limit, ctx->tr_arbytes);
> +        printf(" ldt: %04x @ %016"PRIx64, ctx->ldtr_sel, ctx->ldtr_base);
> +        if (ctx->ldtr_base)
> +            print_symbol(ctx->ldtr_base, KERNEL_DATA_ADDR);
> +        printf("\n           /%08x(%x)\n", ctx->ldtr_limit, ctx->ldtr_arbytes);
> +        printf("\n");
> +        printf("cr0: %08"PRIx64"\n", ctx->cr0);
> +        printf("cr2: %08"PRIx64, ctx->cr2);
> +        print_symbol(ctx->cr2, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("cr3: %08"PRIx64"\n", ctx->cr3);
> +        printf("cr4: %08"PRIx64"\n", ctx->cr4);
> +        printf("\n");
> +        printf("dr0: %08"PRIx64, ctx->dr0);
> +        print_symbol(ctx->dr0, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr1: %08"PRIx64, ctx->dr1);
> +        print_symbol(ctx->dr1, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr2: %08"PRIx64, ctx->dr2);
> +        print_symbol(ctx->dr2, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr3: %08"PRIx64, ctx->dr3);
> +        print_symbol(ctx->dr3, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr6: %08"PRIx64"\n", ctx->dr6);
> +        printf("dr7: %08"PRIx64"\n", ctx->dr7);
> +        printf("\n");
> +        printf("gdt: %016"PRIx64"/%lx", ctx->gdtr_base, (long)(ctx->gdtr_limit));
> +        print_symbol(ctx->gdtr_base, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("idt: %016"PRIx64"/%lx", ctx->idtr_base, (long)(ctx->idtr_limit));
> +        print_symbol(ctx->idtr_base, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("\n");
> +        printf(" EFER: %08"PRIx64" flags: %08"PRIx64"\n",
> +               ctx->msr_efer, ctx->msr_flags);
> +        printf("SYSENTER cs: %08"PRIx64" esp: %08"PRIx64" eip: %08"PRIx64,
> +               ctx->sysenter_cs, ctx->sysenter_esp, ctx->sysenter_eip);
> +        print_symbol(ctx->sysenter_eip, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf(" STAR: %08"PRIx64" SFMASK: %08"PRIx64"\n",
> +               ctx->msr_star, ctx->msr_syscall_mask);
> +        printf("LSTAR: %08"PRIx64, ctx->msr_lstar);
> +        print_symbol(ctx->msr_lstar, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf("CSTAR: %08"PRIx64, ctx->msr_cstar);
> +        print_symbol(ctx->msr_cstar, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf("\n");
> +        printf("\n");
> +        printf(" tsc: %016"PRIx64"\n", ctx->tsc);
> +        printf("\n");
> +        printf("\n");
> +        printf("pending_event: %lx  pending_vector: %lx\n",
> +               (long)(ctx->pending_event), (long)(ctx->pending_vector));
> +        printf("pending error_code: %lx\n\n", (long)(ctx->error_code));
> +    }
> +}
> +
> +static void print_cpuctx_regs32(struct hvm_hw_cpu *ctx)
> +{
> +    printf("cs:eip: %04x:%08x", ctx->cs_sel, (uint32_t)ctx->rip);
> +    print_symbol((uint32_t)ctx->rip, KERNEL_TEXT_ADDR);
> +    print_flags((uint32_t)ctx->rflags);
> +    printf("ss:esp: %04x:%08x\n", ctx->ss_sel, (uint32_t)ctx->rsp);
> +    printf("\n");
> +
> +    printf("eax: %08x\t", (uint32_t)ctx->rax);
> +    printf("ebx: %08x\t", (uint32_t)ctx->rbx);
> +    printf("ecx: %08x\t", (uint32_t)ctx->rcx);
> +    printf("edx: %08x\n", (uint32_t)ctx->rdx);
> +
> +    printf("esi: %08x\t", (uint32_t)ctx->rsi);
> +    printf("edi: %08x\t", (uint32_t)ctx->rdi);
> +    printf("ebp: %08x\n", (uint32_t)ctx->rbp);
> +    printf("\n");
> +
> +    printf("  cs: %04x @ %08"PRIx64, ctx->cs_sel, ctx->cs_base);
> +    if (ctx->cs_base)
> +        print_symbol(ctx->cs_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->cs_limit, ctx->cs_arbytes);
> +    printf("  ss: %04x @ %08"PRIx64, ctx->ss_sel, ctx->ss_base);
> +    if (ctx->ss_base)
> +        print_symbol(ctx->ss_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->ss_limit, ctx->ss_arbytes);
> +    printf("  ds: %04x @ %08"PRIx64, ctx->ds_sel, ctx->ds_base);
> +    if (ctx->ds_base)
> +        print_symbol(ctx->ds_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->ds_limit, ctx->ds_arbytes);
> +    printf("  es: %04x @ %08"PRIx64, ctx->es_sel, ctx->es_base);
> +    if (ctx->es_base)
> +        print_symbol(ctx->es_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->es_limit, ctx->es_arbytes);
> +    printf("  fs: %04x @ %08"PRIx64, ctx->fs_sel, ctx->fs_base);
> +    if (ctx->fs_base)
> +        print_symbol(ctx->fs_base, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->fs_limit, ctx->fs_arbytes);
> +    printf("  gs: %04x @ %08"PRIx64"\\%08"PRIx64, ctx->gs_sel,
> +           ctx->gs_base, ctx->shadow_gs);
> +    if (ctx->gs_base)
> +        print_symbol(ctx->gs_base, KERNEL_DATA_ADDR);
> +    printf("\\");
> +    if (ctx->shadow_gs)
> +        print_symbol(ctx->shadow_gs, KERNEL_DATA_ADDR);
> +    printf("\n           /%08x(%x)\n", ctx->gs_limit, ctx->gs_arbytes);
> +
> +    if (xenctx.disp_all) {
> +        printf("  tr: %04x @ %08"PRIx64, ctx->tr_sel, ctx->tr_base);
> +        if (ctx->tr_base)
> +            print_symbol(ctx->tr_base, KERNEL_DATA_ADDR);
> +        printf("\n           /%08x(%x)\n", ctx->tr_limit, ctx->tr_arbytes);
> +        printf(" ldt: %04x @ %08"PRIx64, ctx->ldtr_sel, ctx->ldtr_base);
> +        if (ctx->ldtr_base)
> +            print_symbol(ctx->ldtr_base, KERNEL_DATA_ADDR);
> +        printf("\n           /%08x(%x)\n", ctx->ldtr_limit, ctx->ldtr_arbytes);
> +        printf("\n");
> +        printf("cr0: %08"PRIx64"\n", ctx->cr0);
> +        printf("cr2: %08"PRIx64, ctx->cr2);
> +        print_symbol(ctx->cr2, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("cr3: %08"PRIx64"\n", ctx->cr3);
> +        printf("cr4: %08"PRIx64"\n", ctx->cr4);
> +        printf("\n");
> +        printf("dr0: %08"PRIx64, ctx->dr0);
> +        print_symbol(ctx->dr0, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr1: %08"PRIx64, ctx->dr1);
> +        print_symbol(ctx->dr1, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr2: %08"PRIx64, ctx->dr2);
> +        print_symbol(ctx->dr2, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr3: %08"PRIx64, ctx->dr3);
> +        print_symbol(ctx->dr3, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("dr6: %08"PRIx64"\n", ctx->dr6);
> +        printf("dr7: %08"PRIx64"\n", ctx->dr7);
> +        printf("\n");
> +        printf("gdt: %08"PRIx64"/%lx", ctx->gdtr_base, (long)(ctx->gdtr_limit));
> +        print_symbol(ctx->gdtr_base, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("idt: %08"PRIx64"/%lx", ctx->idtr_base, (long)(ctx->idtr_limit));
> +        print_symbol(ctx->idtr_base, KERNEL_DATA_ADDR);
> +        printf("\n");
> +        printf("\n");
> +        printf(" EFER: %08"PRIx64" flags: %08"PRIx64"\n",
> +               ctx->msr_efer, ctx->msr_flags);
> +        printf("SYSENTER cs: %08"PRIx64" esp: %08"PRIx64" eip: %08"PRIx64,
> +               ctx->sysenter_cs, ctx->sysenter_esp, ctx->sysenter_eip);
> +        print_symbol(ctx->sysenter_eip, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf(" STAR: %08"PRIx64" SFMASK: %08"PRIx64"\n",
> +               ctx->msr_star, ctx->msr_syscall_mask);
> +        printf("LSTAR: %08"PRIx64, ctx->msr_lstar);
> +        print_symbol(ctx->msr_lstar, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf("CSTAR: %08"PRIx64, ctx->msr_cstar);
> +        print_symbol(ctx->msr_cstar, KERNEL_TEXT_ADDR);
> +        printf("\n");
> +        printf("\n");
> +        printf(" tsc: %016"PRIx64"\n", ctx->tsc);
> +        printf("\n");
> +        printf("\n");
> +        printf("pending_event: %lx  pending_vector: %lx\n",
> +               (long)(ctx->pending_event), (long)(ctx->pending_vector));
> +        printf("pending error_code: %lx\n\n", (long)(ctx->error_code));
> +    }
> +}
> +
> +static void print_cpuctx(struct hvm_hw_cpu *ctx)
> +{
> +    if (guest_word_size == 8)
> +        print_cpuctx_regs64(ctx);
> +    else
> +        print_cpuctx_regs32(ctx);
> +
> +}
> +#endif
> +
>  #define NONPROT_MODE_SEGMENT_SHIFT 4
>  
>  static guest_word_t instr_pointer(vcpu_guest_context_any_t *ctx)
> @@ -887,6 +1128,9 @@ static int print_stack(vcpu_guest_context_any_t *ctx, int vcpu, int width, guest
>  static void dump_ctx(int vcpu, guest_word_t mem_addr, guest_word_t stk_addr)
>  {
>      vcpu_guest_context_any_t ctx;
> +#if defined(__i386__) || defined(__x86_64__)
> +    struct hvm_hw_cpu cpuctx;
> +#endif
>  
>      if (xc_vcpu_getcontext(xenctx.xc_handle, xenctx.domid, vcpu, &ctx) < 0) {
>          perror("xc_vcpu_getcontext");
> @@ -896,7 +1140,6 @@ static void dump_ctx(int vcpu, guest_word_t mem_addr, guest_word_t stk_addr)
>  #if defined(__i386__) || defined(__x86_64__)
>      {
>          if (xenctx.dominfo.hvm) {
> -            struct hvm_hw_cpu cpuctx;
>              xen_capabilities_info_t xen_caps = "";
>              if (xc_domain_hvm_getcontext_partial(
>                      xenctx.xc_handle, xenctx.domid, HVM_SAVE_CODE(CPU),
> @@ -931,7 +1174,44 @@ static void dump_ctx(int vcpu, guest_word_t mem_addr, guest_word_t stk_addr)
>  #endif
>      } else {
>          if (!stk_addr) {
> -            print_ctx(&ctx);
> +#if defined(__i386__) || defined(__x86_64__)
> +            if (xenctx.dominfo.hvm && ctxt_word_size == 8) {
> +                if (guest_word_size == 4) {
> +                    if ((((uint32_t)ctx.x64.user_regs.eip) != cpuctx.rip) ||
> +                        (((uint32_t)ctx.x64.user_regs.esp) != cpuctx.rsp) ||
> +                        (((uint32_t)ctx.x64.ctrlreg[3]) != cpuctx.cr3)) {
> +                        fprintf(stderr, "Regs mismatch ip=%llx vs %llx sp=%llx vs %llx cr3=%llx vs %llx\n",
> +                                (long long)((uint32_t)ctx.x64.user_regs.eip),
> +                                (long long)cpuctx.rip,
> +                                (long long)((uint32_t)ctx.x64.user_regs.esp),
> +                                (long long)cpuctx.rsp,
> +                                (long long)((uint32_t)ctx.x64.ctrlreg[3]),
> +                                (long long)cpuctx.cr3);
> +                        fprintf(stdout, "=============Regs mismatch start=============\n");
> +                        print_ctx(&ctx);
> +                        fprintf(stdout, "=============Regs mismatch end=============\n");
> +                    }
> +                } else {
> +                    if ((ctx.x64.user_regs.eip != cpuctx.rip) ||
> +                        (ctx.x64.user_regs.esp != cpuctx.rsp) ||
> +                        (ctx.x64.ctrlreg[3] != cpuctx.cr3)) {
> +                        fprintf(stderr, "Regs mismatch ip=%llx vs %llx sp=%llx vs %llx cr3=%llx vs %llx\n",
> +                                (long long)ctx.x64.user_regs.eip,
> +                                (long long)cpuctx.rip,
> +                                (long long)ctx.x64.user_regs.esp,
> +                                (long long)cpuctx.rsp,
> +                                (long long)ctx.x64.ctrlreg[3],
> +                                (long long)cpuctx.cr3);
> +                        fprintf(stdout, "=============Regs mismatch start=============\n");
> +                        print_ctx(&ctx);
> +                        fprintf(stdout, "=============Regs mismatch end=============\n");
> +                    }
> +                }
> +                print_cpuctx(&cpuctx);
> +            }
> +            else
> +#endif
> +                print_ctx(&ctx);
>          }
>  #ifndef NO_TRANSLATION
>          if (!stk_addr) {

  reply	other threads:[~2013-11-06 20:35 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-06 20:08 [PATCH v2 00/12] xenctx: Many changes Don Slutz
2013-11-06 20:08 ` [PATCH v2 01/12] xenctx: Clean up stack trace when hypercall_page not in symbol table Don Slutz
2013-11-07  8:07   ` Jan Beulich
2013-11-07  8:22     ` Ian Campbell
2013-11-07  8:47       ` Jan Beulich
2013-11-07 12:36         ` Ian Campbell
2013-11-07 13:28           ` Don Slutz
2013-11-07 12:38   ` Ian Campbell
2013-11-06 20:08 ` [PATCH v2 02/12] xenctx: Add -2 (--two-pages) option to switch stack size to 8KiB Don Slutz
2013-11-07  8:04   ` Jan Beulich
2013-11-07 12:40     ` Ian Campbell
2013-11-07 15:24       ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 03/12] xenctx: Output ascii version of stack also Don Slutz
2013-11-07  8:09   ` Jan Beulich
2013-11-07 12:43     ` Ian Campbell
2013-11-07 13:17       ` Jan Beulich
2013-11-07 13:21         ` Jan Beulich
2013-11-08  0:12           ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 04/12] xenctx: Add stack address to dump, switch to 16 bytes per line Don Slutz
2013-11-07  8:12   ` Jan Beulich
2013-11-07 12:46     ` Ian Campbell
2013-11-08  0:13       ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 05/12] xenctx: Change print_symbol to do the space before Don Slutz
2013-11-07  8:13   ` Jan Beulich
2013-11-07 12:47   ` Ian Campbell
2013-11-06 20:08 ` [PATCH v2 06/12] xenctx: More info on failed to map page Don Slutz
2013-11-07 12:48   ` Ian Campbell
2013-11-06 20:08 ` [PATCH v2 07/12] xenctx: Add stack addr to call trace Don Slutz
2013-11-07 12:50   ` Ian Campbell
2013-11-07 14:34     ` Don Slutz
2013-11-07 14:44       ` Ian Campbell
2013-11-07 15:06         ` Don Slutz
2013-11-07 16:03           ` Ian Campbell
2013-11-07 18:13             ` Don Slutz
2013-11-08 10:15               ` Ian Campbell
2013-11-06 20:08 ` [PATCH v2 08/12] xenctx: Add -d <daddr> option to dump memory at daddr as a stack Don Slutz
2013-11-07  8:22   ` Jan Beulich
2013-11-08  0:21     ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 09/12] xenctx: Add -m <maddr> option to dump memory at maddr Don Slutz
2013-11-07  8:25   ` Jan Beulich
2013-11-08  0:24     ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 10/12] xenctx: change is_kernel_text() into is_kernel_addr() Don Slutz
2013-11-07  8:35   ` Jan Beulich
2013-11-08  0:51     ` Don Slutz
2013-11-08  8:40       ` Jan Beulich
2013-11-08  9:50         ` Ian Campbell
2013-11-08 13:50           ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 11/12] xenctx: Dump registers via hvm info if available Don Slutz
2013-11-06 20:35   ` Andrew Cooper [this message]
2013-11-07 18:56     ` Don Slutz
2013-11-08 10:13       ` Ian Campbell
2013-11-08 10:29         ` Andrew Cooper
2013-11-08 10:32           ` Ian Campbell
2013-11-07  8:38   ` Jan Beulich
2013-11-07 21:19     ` Don Slutz
2013-11-06 20:08 ` [PATCH v2 12/12] xenctx: Add optional fCPU Don Slutz
2013-11-07  8:40   ` Jan Beulich
2013-11-07 12:53     ` Ian Campbell
2013-11-07 21:24       ` Don Slutz
2013-11-08 11:29 ` [PATCH v2 00/12] xenctx: Many changes George Dunlap
2013-11-08 12:54   ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=527AA7F7.7010901@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=Don@CloudSwitch.com \
    --cc=JBeulich@suse.com \
    --cc=dslutz@verizon.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.