summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-07-29 21:16:10 -0700
committerAndy Lutomirski <luto@amacapital.net>2014-07-29 21:16:10 -0700
commit68daae4a7fd34aa8cada8d47e1adb1c5ba4e318b (patch)
treec6a41c94d6aac066ae3b4ae3bc5c4b17381facd6
parent077a1617302a21a4b77c818962a4c49ff208466c (diff)
downloadmisc-tests-68daae4a7fd34aa8cada8d47e1adb1c5ba4e318b.tar.gz
user_visible_state: Further improve the flags display
-rw-r--r--user_visible_state.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/user_visible_state.c b/user_visible_state.c
index 6111af1..715bd60 100644
--- a/user_visible_state.c
+++ b/user_visible_state.c
@@ -74,15 +74,47 @@ static void show_msw(void)
static void show_flags(void)
{
+ static char const * const flag_bits[] = {
+ [0] = "CF",
+ [1] = "FIXED",
+ [2] = "PF",
+ [4] = "AF",
+ [6] = "ZF",
+ [7] = "SF",
+ [8] = "TF", /* Detects 'si 100000' in gdb */
+ [9] = "IF",
+ [10] = "DF",
+ [11] = "OF",
+ [14] = "NT",
+ [16] = "RF", /* Invisible to pushf. */
+ [17] = "VM",
+ [18] = "AC",
+ [19] = "VIF",
+ [20] = "VIP",
+ [21] = "ID",
+ };
+
unsigned long flags;
asm ("sub $128, %%sp\n\t"
"xor %%ax,%%ax\n\t" /* Make arithmetic flags be deterministic */
+ "add $1, %%ax\n\t" /* Clear ZF and PF */
"pushf\n\t"
"pop %0\n\t"
"add $128, %%sp" : "=r" (flags) :
: "flags",
"eax");
- printf("FLAGS: 0x%016lX\n", flags);
+ printf("FLAGS: 0x%016lX", flags);
+ for (int i = 0; i < sizeof(flag_bits) / sizeof(flag_bits[0]); i++) {
+ if (flag_bits[i] && (flags & (1 << i))) {
+ printf(" %s", flag_bits[i]);
+ flags &= ~(1 << i);
+ }
+ }
+ printf(" IOPL=%lu", (flags >> 12) & 3);
+ flags &= ~0x3000;
+ if (flags)
+ printf(" unknown:0x%lx", flags);
+ printf("\n");
}
static void show_rdtscp(void)