Reserved fields in SMRAM CPU states could be non-zero even if the
corresponding APICs are NOT used. This breaks the assumption that
SMRAM CPU state is zero cleared if and only if the APIC corresponding
to the entry is NOT used. As the result, help -D lists uninteresting
entries as below:
APIC ID: 14
RIP: 0000000000000000 RSP: 0000000000000000 RBP: 0000000000000000
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000
R11: 0000000000000000 R12: 0000000000000000 R13: 0000000000000000
R14: 0000000000000000 R15: 0000000000000000
SMM REV: 00000000 SMM BASE 00000000
CS : 00000000 DS: 00000000 SS: 00000000 ES: 00000000 FS: 00000000
GS : 00000000
CR0: 0000000000000000 CR3: 0000000000000000 CR4: 00000000
GDT: 0000000000000000 LDT: 0000000000000000 IDT: 0000000000000000
GDTlim: 00000000 LDTlim: 00000000 IDTlim: 00000000
LDTR: 00000000 TR: 00000000 RFLAGS: 0000000000000000
EPTP: 0000000000000000 EPTP_SETTING: 00000000
DR6: 0000000000000000 DR7: 0000000000000000
Ia32Efer: 0000000000000000
IoMemAddr: 0000000000000000 IoEip: 0000000000000000
IoMisc: 00000000 LdtInfo: 00000000
IoInstructionRestart: 0000 AutoHaltRestart: 0000
To fix this issue, mask reserved fields before comparison.
Signed-off-by: HATAYAMA Daisuke <d.hatayama(a)fujitsu.com>
---
sadump.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/sadump.c b/sadump.c
index 009e17a..f313528 100644
--- a/sadump.c
+++ b/sadump.c
@@ -51,6 +51,7 @@ static int cpu_to_apicid(int cpu, int *apicid);
static int get_sadump_smram_cpu_state(int cpu, struct sadump_smram_cpu_state *smram);
static int block_table_init(void);
static uint64_t pfn_to_block(uint64_t pfn);
+static void mask_reserved_fields(struct sadump_smram_cpu_state *smram);
struct sadump_data *
sadump_get_sadump_data(void)
@@ -1040,6 +1041,15 @@ int sadump_memory_dump(FILE *fp)
"cpu_state\n");
return FALSE;
}
+ /*
+ * Reserved fields in SMRAM CPU states could
+ * be non-zero even if the corresponding APICs
+ * are NOT used. This breaks the assumption
+ * that SMRAM CPU state is zero cleared if and
+ * only if the APIC corresponding to the entry
+ * is NOT used.
+ */
+ mask_reserved_fields(&scs);
if (memcmp(&scs, &zero, sizeof(scs)) != 0) {
fprintf(fp, "\n");
display_smram_cpu_state(aid, &scs);
@@ -1707,3 +1717,15 @@ sadump_get_cr3_idtr(ulong *cr3, ulong *idtr)
return TRUE;
}
#endif /* X86_64 */
+
+static void
+mask_reserved_fields(struct sadump_smram_cpu_state *smram)
+{
+ memset(smram->Reserved1, 0, sizeof(smram->Reserved1));
+ memset(smram->Reserved2, 0, sizeof(smram->Reserved2));
+ memset(smram->Reserved3, 0, sizeof(smram->Reserved3));
+ memset(smram->Reserved4, 0, sizeof(smram->Reserved4));
+ memset(smram->Reserved5, 0, sizeof(smram->Reserved5));
+ memset(smram->Reserved6, 0, sizeof(smram->Reserved6));
+ memset(smram->Reserved7, 0, sizeof(smram->Reserved7));
+}
--
1.8.3.1