diff options
author | Keir Fraser <keir@xensource.com> | 2007-10-02 09:41:10 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-10-02 09:41:10 +0100 |
commit | 0741e7c2374f9fb899734e244248ed4db95e0d23 (patch) | |
tree | 52e054cf76d678d4cb9d0212fd68da38c15018e6 /tools/xentrace | |
parent | a7d88e65676dc29ac7aac07b7dd8bb77e556a4be (diff) | |
download | xen-0741e7c2374f9fb899734e244248ed4db95e0d23.tar.gz xen-0741e7c2374f9fb899734e244248ed4db95e0d23.tar.bz2 xen-0741e7c2374f9fb899734e244248ed4db95e0d23.zip |
xenctx: Print EFLAGS for i386 and x86/64.
From: Peter Johnston <pjohnston@xensource.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'tools/xentrace')
-rw-r--r-- | tools/xentrace/xenctx.c | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c index 274da0b41b..0211c1cc00 100644 --- a/tools/xentrace/xenctx.c +++ b/tools/xentrace/xenctx.c @@ -21,6 +21,7 @@ #include <argp.h> #include <signal.h> #include <string.h> +#include <inttypes.h> #include <getopt.h> #include "xenctrl.h" @@ -152,9 +153,9 @@ void print_symbol(size_t addr) return; if (addr==s->address) - printf("%s", s->name); + printf("%s ", s->name); else - printf("%s+%#x", s->name, (unsigned int)(addr - s->address)); + printf("%s+%#x ", s->name, (unsigned int)(addr - s->address)); } void read_symbol_table(const char *symtab) @@ -207,6 +208,46 @@ void read_symbol_table(const char *symtab) fclose(f); } +#if defined(__i386__) || defined(__x86_64__) +char *flag_values[22][2] = +{/* clear, set, bit# */ + { NULL, "c" }, // 0 Carry + { NULL, NULL }, // 1 + { NULL, "p" }, // 2 Parity + { NULL, NULL }, // 3 + { NULL, "a" }, // 4 Adjust + { NULL, NULL }, // 5 + { "nz", "z" }, // 6 Zero + { NULL, "s" }, // 7 Sign + { NULL, "tf" }, // 8 Trap + { NULL, "i" }, // 9 Interrupt (enabled) + { NULL, "d=b" }, // 10 Direction + { NULL, "o" }, // 11 Overflow + { NULL, NULL }, // 12 12+13 == IOPL + { NULL, NULL }, // 13 + { NULL, "nt" }, // 14 Nested Task + { NULL, NULL }, // 15 + { NULL, "rf" }, // 16 Resume Flag + { NULL, "v86" }, // 17 Virtual 8086 mode + { NULL, "ac" }, // 18 Alignment Check (enabled) + { NULL, "vif" }, // 19 Virtual Interrupt (enabled) + { NULL, "vip" }, // 20 Virtual Interrupt Pending + { NULL, "cid" } // 21 Cpuid Identification Flag +}; + +void print_flags(uint64_t flags) +{ + int i; + + printf("flags: %08" PRIx64, flags); + for (i = 21; i >= 0; i--) { + char *s = flag_values[i][(flags >> i) & 1]; + if (s != NULL) + printf(" %s", s); + } +} +#endif + #ifdef __i386__ void print_ctx(vcpu_guest_context_t *ctx1) { @@ -214,6 +255,7 @@ void print_ctx(vcpu_guest_context_t *ctx1) printf("eip: %08x ", regs->eip); print_symbol(regs->eip); + print_flags(regs->eflags); printf("\n"); printf("esp: %08x\n", regs->esp); @@ -240,6 +282,7 @@ void print_ctx(vcpu_guest_context_t *ctx1) printf("rip: %08lx ", regs->rip); print_symbol(regs->rip); + print_flags(regs->rflags); printf("\n"); printf("rsp: %08lx\n", regs->rsp); @@ -262,10 +305,10 @@ void print_ctx(vcpu_guest_context_t *ctx1) printf("r14: %08lx\t", regs->r14); printf("r15: %08lx\n", regs->r15); - printf(" cs: %08x\t", regs->cs); - printf(" ds: %08x\t", regs->ds); - printf(" fs: %08x\t", regs->fs); - printf(" gs: %08x\n", regs->gs); + printf(" cs: %04x\t", regs->cs); + printf(" ds: %04x\t", regs->ds); + printf(" fs: %04x\t", regs->fs); + printf(" gs: %04x\n", regs->gs); } #elif defined(__ia64__) |