All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] x86: Enhanced dump of segment registers
@ 2009-01-29 23:51 Jan Kiszka
  0 siblings, 0 replies; only message in thread
From: Jan Kiszka @ 2009-01-29 23:51 UTC (permalink / raw)
  To: qemu-devel

Parse the descriptor flags segment registers refer to and show the
result in a more human-friendly format.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

 target-i386/cpu.h    |    3 ++
 target-i386/helper.c |   62 +++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 0a4f1d7..9e5ca27 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -80,9 +80,10 @@
 #define DESC_AVL_MASK   (1 << 20)
 #define DESC_P_MASK     (1 << 15)
 #define DESC_DPL_SHIFT  13
-#define DESC_DPL_MASK   (1 << DESC_DPL_SHIFT)
+#define DESC_DPL_MASK   (3 << DESC_DPL_SHIFT)
 #define DESC_S_MASK     (1 << 12)
 #define DESC_TYPE_SHIFT 8
+#define DESC_TYPE_MASK  (15 << DESC_TYPE_SHIFT)
 #define DESC_A_MASK     (1 << 8)
 
 #define DESC_CS_MASK    (1 << 11) /* 1=code segment 0=data segment */
diff --git a/target-i386/helper.c b/target-i386/helper.c
index db9f397..239b29b 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -542,6 +542,50 @@ static const char *cc_op_str[] = {
     "SARQ",
 };
 
+static void
+cpu_x86_dump_desc_flags(CPUState *env, FILE *f,
+                        int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
+                        uint32_t dflags)
+{
+    if (!(env->hflags & HF_PE_MASK) || !(dflags & DESC_P_MASK))
+        goto done;
+
+    cpu_fprintf(f, " P DPL=%d ", (dflags & DESC_DPL_MASK) >> DESC_DPL_SHIFT);
+    if (dflags & DESC_S_MASK) {
+        if (dflags & DESC_CS_MASK) {
+            cpu_fprintf(f, (dflags & DESC_L_MASK) ? "CS64" :
+                           ((dflags & DESC_B_MASK) ? "CS32" : "CS16"));
+            cpu_fprintf(f, " [%c%c", (dflags & DESC_C_MASK) ? 'C' : '-',
+                        (dflags & DESC_R_MASK) ? 'R' : '-');
+        } else {
+            cpu_fprintf(f, (dflags & DESC_B_MASK) ? "DS  " : "DS16");
+            cpu_fprintf(f, " [%c%c", (dflags & DESC_E_MASK) ? 'E' : '-',
+                        (dflags & DESC_W_MASK) ? 'W' : '-');
+        }
+        cpu_fprintf(f, "%c]", (dflags & DESC_A_MASK) ? 'A' : '-');
+    } else {
+        static const char *sys_type_name[2][16] = {
+            { /* 32 bit mode */
+                "Reserved", "TSS16-avl", "LDT", "TSS16-busy",
+                "CallGate16", "TaskGate", "IntGate16", "TrapGate16",
+                "Reserved", "TSS32-avl", "Reserved", "TSS32-busy",
+                "CallGate32", "Reserved", "IntGate32", "TrapGate32"
+            },
+            { /* 64 bit mode */
+                "<hiword>", "Reserved", "LDT", "Reserved", "Reserved"
+                "Reserved", "Reserved", "Reserved", "Reserved",
+                "TSS64-avl", "Reserved", "TSS64-busy", "CallGate64",
+                "Reserved", "IntGate64", "TrapGate64"
+            }
+        };
+        cpu_fprintf(f, sys_type_name[(env->hflags & HF_LMA_MASK) ? 1 : 0]
+                                    [(dflags & DESC_TYPE_MASK)
+                                     >> DESC_TYPE_SHIFT]);
+    }
+done:
+    cpu_fprintf(f, "\n");
+}
+
 void cpu_dump_state(CPUState *env, FILE *f,
                     int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
                     int flags)
@@ -621,23 +665,26 @@ void cpu_dump_state(CPUState *env, FILE *f,
     if (env->hflags & HF_LMA_MASK) {
         for(i = 0; i < 6; i++) {
             SegmentCache *sc = &env->segs[i];
-            cpu_fprintf(f, "%s =%04x %016" PRIx64 " %08x %08x\n",
+            cpu_fprintf(f, "%s =%04x %016" PRIx64 " %08x %08x",
                         seg_name[i],
                         sc->selector,
                         sc->base,
                         sc->limit,
                         sc->flags);
+            cpu_x86_dump_desc_flags(env, f, cpu_fprintf, sc->flags);
         }
-        cpu_fprintf(f, "LDT=%04x %016" PRIx64 " %08x %08x\n",
+        cpu_fprintf(f, "LDT=%04x %016" PRIx64 " %08x %08x",
                     env->ldt.selector,
                     env->ldt.base,
                     env->ldt.limit,
                     env->ldt.flags);
-        cpu_fprintf(f, "TR =%04x %016" PRIx64 " %08x %08x\n",
+        cpu_x86_dump_desc_flags(env, f, cpu_fprintf, env->ldt.flags);
+        cpu_fprintf(f, "TR =%04x %016" PRIx64 " %08x %08x",
                     env->tr.selector,
                     env->tr.base,
                     env->tr.limit,
                     env->tr.flags);
+        cpu_x86_dump_desc_flags(env, f, cpu_fprintf, env->tr.flags);
         cpu_fprintf(f, "GDT=     %016" PRIx64 " %08x\n",
                     env->gdt.base, env->gdt.limit);
         cpu_fprintf(f, "IDT=     %016" PRIx64 " %08x\n",
@@ -656,23 +703,26 @@ void cpu_dump_state(CPUState *env, FILE *f,
     {
         for(i = 0; i < 6; i++) {
             SegmentCache *sc = &env->segs[i];
-            cpu_fprintf(f, "%s =%04x %08x %08x %08x\n",
+            cpu_fprintf(f, "%s =%04x %08x %08x %08x",
                         seg_name[i],
                         sc->selector,
                         (uint32_t)sc->base,
                         sc->limit,
                         sc->flags);
+            cpu_x86_dump_desc_flags(env, f, cpu_fprintf, sc->flags);
         }
-        cpu_fprintf(f, "LDT=%04x %08x %08x %08x\n",
+        cpu_fprintf(f, "LDT=%04x %08x %08x %08x",
                     env->ldt.selector,
                     (uint32_t)env->ldt.base,
                     env->ldt.limit,
                     env->ldt.flags);
-        cpu_fprintf(f, "TR =%04x %08x %08x %08x\n",
+        cpu_x86_dump_desc_flags(env, f, cpu_fprintf, env->ldt.flags);
+        cpu_fprintf(f, "TR =%04x %08x %08x %08x",
                     env->tr.selector,
                     (uint32_t)env->tr.base,
                     env->tr.limit,
                     env->tr.flags);
+        cpu_x86_dump_desc_flags(env, f, cpu_fprintf, env->tr.flags);
         cpu_fprintf(f, "GDT=     %08x %08x\n",
                     (uint32_t)env->gdt.base, env->gdt.limit);
         cpu_fprintf(f, "IDT=     %08x %08x\n",

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-01-29 23:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-29 23:51 [Qemu-devel] [PATCH] x86: Enhanced dump of segment registers Jan Kiszka

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.