Exemple #1
0
    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))
Exemple #2
0
    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")
Exemple #3
0
    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))
Exemple #4
0
    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))
Exemple #5
0
    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]))
Exemple #6
0
    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, ))
Exemple #7
0
    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, ))
Exemple #8
0
    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()
Exemple #9
0
    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)))
Exemple #10
0
    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))
Exemple #11
0
    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))
Exemple #12
0
    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))
Exemple #13
0
 def verify_record_checkpoint_state(self, content):
     """ Checkpoint state """
     if len(content) == 0:
         raise RecordError("Checkpoint state record with zero length")
Exemple #14
0
    def verify_record_checkpoint_end(self, content):
        """ Checkpoint end record """

        if len(content) != 0:
            raise RecordError("Checkpoint end record with non-zero length")
Exemple #15
0
 def verify_record_checkpoint_dirty_pfn_list(self, content):
     """ checkpoint dirty pfn list """
     raise RecordError("Found checkpoint dirty pfn list record in stream")
Exemple #16
0
    def verify_record_verify(self, content):
        """ verify record """

        if len(content) != 0:
            raise RecordError("Verify record with non-zero length")
Exemple #17
0
    def verify_record_hvm_context(self, content):
        """ hvm context record """

        if len(content) == 0:
            raise RecordError("Zero length HVM context")