def verify_record_emulator_xenstore_data(self, content): """ Emulator Xenstore Data record """ minsz = calcsize(EMULATOR_HEADER_FORMAT) if len(content) < minsz: raise RecordError("Length must be at least %d bytes, got %d" % (minsz, len(content))) emu_id, emu_idx = unpack(EMULATOR_HEADER_FORMAT, content[:minsz]) if emu_id not in emulator_id_to_str: raise RecordError("Unrecognised emulator id 0x%x" % (emu_id, )) self.info("Emulator Xenstore Data (%s, idx %d)" % (emulator_id_to_str[emu_id], emu_idx)) # Chop off the emulator header content = content[minsz:] if len(content): if content[-1] != '\x00': raise RecordError("Data not NUL terminated") # Split without the final NUL, to get an even number of parts parts = content[:-1].split("\x00") if (len(parts) % 2) != 0: raise RecordError( "Expected an even number of strings, got %d" % (len(parts), )) for key, val in zip(parts[0::2], parts[1::2]): self.info(" '%s' = '%s'" % (key, val))
def verify_record_static_data_end(self, content): """ static data end record """ if len(content) != 0: raise RecordError("End record with non-zero length") if self.version < 3: raise RecordError("Static data end record found in v2 stream")
def verify_record_x86_msr_policy(self, content): """ x86 MSR policy record """ if self.version < 3: raise RecordError("x86 MSR policy record found in v2 stream") sz = calcsize(X86_MSR_POLICY_FORMAT) contentsz = len(content) if contentsz < sz or (contentsz % sz) != 0: raise RecordError("Record length %u, expected multiple of %u" % (contentsz, sz))
def verify_record_x86_pv_p2m_frames(self, content): """ x86 PV p2m frames record """ if len(content) < 8: raise RecordError("x86_pv_p2m_frames: record length must be at" " least 8 bytes long") if len(content) % 8 != 0: raise RecordError("Length expected to be a multiple of 8, not %d" % (len(content), )) start, end = unpack("=II", content[:8]) self.info(" Start pfn 0x%x, End 0x%x" % (start, end))
def verify_record_emulator_context(self, content): """ Emulator Context record """ minsz = calcsize(EMULATOR_HEADER_FORMAT) if len(content) < minsz: raise RecordError("Length must be at least %d bytes, got %d" % (minsz, len(content))) emu_id, emu_idx = unpack(EMULATOR_HEADER_FORMAT, content[:minsz]) if emu_id not in emulator_id_to_str: raise RecordError("Unrecognised emulator id 0x%x" % (emu_id, )) self.info(" Index %d, type %s" % (emu_idx, emulator_id_to_str[emu_id]))
def verify_record_shared_info(self, content): """ shared info record """ contentsz = len(content) if contentsz != 4096: raise RecordError("Length expected to be 4906 bytes, not %d" % (contentsz, ))
def verify_record_hvm_params(self, content): """ hvm params record """ sz = calcsize(HVM_PARAMS_FORMAT) if len(content) < sz: raise RecordError("Length should be at least %u bytes" % (sz, )) count, rsvd = unpack(HVM_PARAMS_FORMAT, content[:sz]) if rsvd != 0: raise RecordError("Reserved field not zero (0x%04x)" % (rsvd, )) sz += count * calcsize(HVM_PARAMS_ENTRY_FORMAT) if len(content) != sz: raise RecordError("Length should be %u bytes" % (sz, ))
def verify_record_libxc_context(self, content): """ Libxc context record """ if len(content) != 0: raise RecordError("Libxc context record with non-zero length") # Verify the libxc stream, as we can't seek forwards through it VerifyLibxc(self.info, self.read).verify()
def verify_record_page_data(self, content): """ Page Data record """ minsz = calcsize(PAGE_DATA_FORMAT) if len(content) <= minsz: raise RecordError("PAGE_DATA record must be at least %d bytes long" % (minsz, )) count, res1 = unpack(PAGE_DATA_FORMAT, content[:minsz]) if res1 != 0: raise StreamError("Reserved bits set in PAGE_DATA record 0x%04x" % (res1, )) pfnsz = count * 8 if (len(content) - minsz) < pfnsz: raise RecordError("PAGE_DATA record must contain a pfn record for " "each count") pfns = list(unpack("=%dQ" % (count,), content[minsz:minsz + pfnsz])) nr_pages = 0 for idx, pfn in enumerate(pfns): if pfn & PAGE_DATA_PFN_RESZ_MASK: raise RecordError("Reserved bits set in pfn[%d]: 0x%016x", idx, pfn & PAGE_DATA_PFN_RESZ_MASK) if pfn >> PAGE_DATA_TYPE_SHIFT in (5, 6, 7, 8): raise RecordError("Invalid type value in pfn[%d]: 0x%016x", idx, pfn & PAGE_DATA_TYPE_LTAB_MASK) # We expect page data for each normal page or pagetable if PAGE_DATA_TYPE_NOTAB <= (pfn & PAGE_DATA_TYPE_LTABTYPE_MASK) \ <= PAGE_DATA_TYPE_L4TAB: nr_pages += 1 pagesz = nr_pages * 4096 if len(content) != minsz + pfnsz + pagesz: raise RecordError("Expected %u + %u + %u, got %u" % (minsz, pfnsz, pagesz, len(content)))
def verify_record_x86_pv_info(self, content): """ x86 PV Info record """ expectedsz = calcsize(X86_PV_INFO_FORMAT) if len(content) != expectedsz: raise RecordError("x86_pv_info: expected length of %d, got %d" % (expectedsz, len(content))) width, levels, res1, res2 = unpack(X86_PV_INFO_FORMAT, content) if width not in (4, 8): raise RecordError("Expected width of 4 or 8, got %d" % (width, )) if levels not in (3, 4): raise RecordError("Expected levels of 3 or 4, got %d" % (levels, )) if res1 != 0 or res2 != 0: raise StreamError("Reserved bits set in X86_PV_INFO: 0x%04x 0x%08x" % (res1, res2)) bitness = {4:32, 8:64}[width] self.info(" %sbit guest, %d levels of pagetables" % (bitness, levels))
def verify_record_tsc_info(self, content): """ tsc info record """ sz = calcsize(X86_TSC_INFO_FORMAT) if len(content) != sz: raise RecordError("Length should be %u bytes" % (sz, )) mode, khz, nsec, incarn, res1 = unpack(X86_TSC_INFO_FORMAT, content) if res1 != 0: raise StreamError("Reserved bits set in X86_TSC_INFO: 0x%08x" % (res1, )) self.info(" Mode %u, %u kHz, %u ns, incarnation %d" % (mode, khz, nsec, incarn))
def verify_record_x86_pv_vcpu_generic(self, content, name): """ Generic for all REC_TYPE_x86_pv_vcpu_{basic,extended,xsave,msrs} """ minsz = calcsize(X86_PV_VCPU_HDR_FORMAT) if len(content) <= minsz: raise RecordError("X86_PV_VCPU_%s record length must be at least %d" " bytes long" % (name, minsz)) vcpuid, res1 = unpack(X86_PV_VCPU_HDR_FORMAT, content[:minsz]) if res1 != 0: raise StreamError( "Reserved bits set in x86_pv_vcpu_%s record 0x%04x" % (name, res1)) self.info(" vcpu%d %s context, %d bytes" % (vcpuid, name, len(content) - minsz))
def verify_record_checkpoint_state(self, content): """ Checkpoint state """ if len(content) == 0: raise RecordError("Checkpoint state record with zero length")
def verify_record_checkpoint_end(self, content): """ Checkpoint end record """ if len(content) != 0: raise RecordError("Checkpoint end record with non-zero length")
def verify_record_checkpoint_dirty_pfn_list(self, content): """ checkpoint dirty pfn list """ raise RecordError("Found checkpoint dirty pfn list record in stream")
def verify_record_verify(self, content): """ verify record """ if len(content) != 0: raise RecordError("Verify record with non-zero length")
def verify_record_hvm_context(self, content): """ hvm context record """ if len(content) == 0: raise RecordError("Zero length HVM context")