diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-07-29 21:16:10 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-07-29 21:16:10 -0700 |
commit | 68daae4a7fd34aa8cada8d47e1adb1c5ba4e318b (patch) | |
tree | c6a41c94d6aac066ae3b4ae3bc5c4b17381facd6 | |
parent | 077a1617302a21a4b77c818962a4c49ff208466c (diff) | |
download | misc-tests-68daae4a7fd34aa8cada8d47e1adb1c5ba4e318b.tar.gz |
user_visible_state: Further improve the flags display
-rw-r--r-- | user_visible_state.c | 34 |
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) |