示例#1
0
    def mem_writeval(self):
        try:
            width = get_option_width(self.length) if is_option_valid_width(
                self.length) else int(self.length, 16)
        except ValueError:
            self.logger.error(
                "Must specify <length> argument in 'mem writeval' as one of {}"
                .format(CMD_OPTS_WIDTH))
            return

        if width not in (0x1, 0x2, 0x4):
            self.logger.error(
                "Must specify <length> argument in 'mem writeval' as one of {}"
                .format(CMD_OPTS_WIDTH))
            return
        self.logger.log(
            '[CHIPSEC] Writing {:X}-byte value 0x{:X} to PA 0x{:016X}..'.
            format(width, self.write_data, self.phys_address))
        if 0x1 == width:
            self.cs.mem.write_physical_mem_byte(self.phys_address,
                                                self.write_data)
        elif 0x2 == width:
            self.cs.mem.write_physical_mem_word(self.phys_address,
                                                self.write_data)
        elif 0x4 == width:
            self.cs.mem.write_physical_mem_dword(self.phys_address,
                                                 self.write_data)
示例#2
0
    def mem_readval(self):
        width = 0x4
        value = 0x0
        if self.length:
            try:
                width = get_option_width(self.length) if is_option_valid_width(
                    self.length) else int(self.length, 16)
            except ValueError:
                self.logger.error("[CHIPSEC] Bad length given '{}'".format(
                    self.length))
                return

        if width not in (0x1, 0x2, 0x4):
            self.logger.error(
                "Must specify <length> argument in 'mem readval' as one of {}".
                format(CMD_OPTS_WIDTH))
            return
        self.logger.log(
            '[CHIPSEC] Reading {:X}-byte value from PA 0x{:016X}..'.format(
                width, self.phys_address))
        if 0x1 == width:
            value = self.cs.mem.read_physical_mem_byte(self.phys_address)
        elif 0x2 == width:
            value = self.cs.mem.read_physical_mem_word(self.phys_address)
        elif 0x4 == width:
            value = self.cs.mem.read_physical_mem_dword(self.phys_address)
        self.logger.log('[CHIPSEC] Value = 0x{:X}'.format(value))
示例#3
0
    def vmem_writeval(self):
        if chipsec_util.is_option_valid_width(self.length):
            width = chipsec_util.get_option_width(self.length)
        else:
            try:
                width = int(self.length, 16)
            except ValueError:
                width = 0

        self.logger.log(
            '[CHIPSEC] Writing {:X}-byte value 0x{:X} to VA 0x{:016X}..'.
            format(width, self.value, self.virt_address))
        try:
            if 0x1 == width:
                self._vmem.write_virtual_mem_byte(self.virt_address,
                                                  self.value)
            elif 0x2 == width:
                self._vmem.write_virtual_mem_word(self.virt_address,
                                                  self.value)
            elif 0x4 == width:
                self._vmem.write_virtual_mem_dword(self.virt_address,
                                                   self.value)
            else:
                self.logger.error(
                    "Must specify <length> argument in 'mem writeval' as one of {}"
                    .format(chipsec_util.CMD_OPTS_WIDTH))
        except (TypeError, OSError):
            self.logger.error('Error mapping VA to PA.')
示例#4
0
    def vmem_readval(self):
        width = 0x4
        value = 0x0
        if self.length is not None:
            if chipsec_util.is_option_valid_width(self.length):
                width = chipsec_util.get_option_width(self.length)
            else:
                try:
                    width = int(self.length, 16)
                except:
                    width = 0

        self.logger.log(
            '[CHIPSEC] Reading {:X}-byte value from VA 0x{:016X}.'.format(
                width, self.virt_address))
        try:
            if 0x1 == width:
                value = self._vmem.read_virtual_mem_byte(self.virt_address)
            elif 0x2 == width:
                value = self._vmem.read_virtual_mem_word(self.virt_address)
            elif 0x4 == width:
                value = self._vmem.read_virtual_mem_dword(self.virt_address)
            else:
                self.logger.error(
                    "Must specify <length> argument in 'mem readval' as one of {}"
                    .format(chipsec_util.CMD_OPTS_WIDTH))
                return
        except (TypeError, OSError):
            self.logger.error('Error mapping VA to PA.')
            return
        self.logger.log('[CHIPSEC] value = 0x{:X}'.format(value))
示例#5
0
class PortIOCommand(BaseCommand):
    """
    >>> chipsec_util io list
    >>> chipsec_util io <io_port> <width> [value]

    Examples:

    >>> chipsec_util io list
    >>> chipsec_util io 0x61 1
    >>> chipsec_util io 0x430 byte 0x0
    """

    def requires_driver(self):
        # No driver required when printing the util documentation
        if len(self.argv) < 3:
            return False
        return True

    def run(self):
        if len(self.argv) < 3:
            print PortIOCommand.__doc__
            return

        try:
            _iobar = chipsec.hal.iobar.iobar( self.cs )
        except chipsec.hal.iobar.IOBARRuntimeError, msg:
            print msg
            return

        op = self.argv[2]
        if ( 'list' == op ):
            _iobar.list_IO_BARs()
            return

        t = time.time()

        if len(self.argv) < 3:
            print PortIOCommand.__doc__
            return

        io_port = int(self.argv[2],16)

        width = 0x1
        if len(self.argv) > 3: 
            width = chipsec_util.get_option_width(self.argv[3]) if chipsec_util.is_option_valid_width(self.argv[3]) else int(self.argv[3],16)

        if 5 == len(self.argv):
            value = int(self.argv[4], 16)
            self.logger.log( "[CHIPSEC] OUT 0x%04X <- 0x%08X (size = 0x%02x)" % (io_port, value, width) )
            if   0x1 == width: self.cs.io.write_port_byte( io_port, value )
            elif 0x2 == width: self.cs.io.write_port_word( io_port, value )
            elif 0x4 == width: self.cs.io.write_port_dword( io_port, value )
        else:
            if   0x1 == width: value = self.cs.io.read_port_byte( io_port )
            elif 0x2 == width: value = self.cs.io.read_port_word( io_port )
            elif 0x4 == width: value = self.cs.io.read_port_dword( io_port )
            self.logger.log( "[CHIPSEC] IN 0x%04X -> 0x%08X (size = 0x%02x)" % (io_port, value, width) )

        self.logger.log( "[CHIPSEC] (io) time elapsed %.3f" % (time.time()-t) )
示例#6
0
    def pci_write(self):
            width = get_option_width(self.size) if is_option_valid_width(self.size) else int(self.size, 16)

            if   1 == width: self.cs.pci.write_byte ( self.bus, self.device, self.function, self.offset, self.value )
            elif 2 == width: self.cs.pci.write_word ( self.bus, self.device, self.function, self.offset, self.value )
            elif 4 == width: self.cs.pci.write_dword( self.bus, self.device, self.function, self.offset, self.value )
            else:
                self.logger.error( "Width should be one of {}".format(CMD_OPTS_WIDTH) )
                return
            self.logger.log( "[CHIPSEC] Write 0x{:X} to PCI {:02X}:{:02X}.{:02X} + 0x{:02X}".format(self.value, self.bus, self.device, self.function, self.offset) )
示例#7
0
    def run(self):
        if len(self.argv) < 3:
            print(PortIOCommand.__doc__)
            return

        try:
            _iobar = iobar.IOBAR(self.cs)
        except iobar.IOBARRuntimeError as msg:
            print(msg)
            return

        op = self.argv[2]
        if ('list' == op):
            _iobar.list_IO_BARs()
            return

        t = time.time()

        if len(self.argv) < 3:
            print(PortIOCommand.__doc__)
            return

        io_port = int(self.argv[2], 16)

        width = 0x1
        if len(self.argv) > 3:
            width = chipsec_util.get_option_width(
                self.argv[3]) if chipsec_util.is_option_valid_width(
                    self.argv[3]) else int(self.argv[3], 16)

        if 5 == len(self.argv):
            value = int(self.argv[4], 16)
            self.logger.log(
                "[CHIPSEC] OUT 0x{:04X} <- 0x{:08X} (size = 0x{:02X})".format(
                    io_port, value, width))
            if 0x1 == width: self.cs.io.write_port_byte(io_port, value)
            elif 0x2 == width: self.cs.io.write_port_word(io_port, value)
            elif 0x4 == width: self.cs.io.write_port_dword(io_port, value)
            else:
                self.logger.log(
                    "Invalid write size requested. 1,2,4 supported")
                return
        else:
            if 0x1 == width: value = self.cs.io.read_port_byte(io_port)
            elif 0x2 == width: value = self.cs.io.read_port_word(io_port)
            elif 0x4 == width: value = self.cs.io.read_port_dword(io_port)
            else:
                self.logger.log("Invalid read size requested. 1,2,4 supported")
                return
            self.logger.log(
                "[CHIPSEC] IN 0x{:04X} -> 0x{:08X} (size = 0x{:02X})".format(
                    io_port, value, width))

        self.logger.log(
            "[CHIPSEC] (io) time elapsed {:.3f}".format(time.time() - t))
示例#8
0
    def pci_read(self):
            width = 4
            if self.size is not None:
                width = get_option_width(self.size) if is_option_valid_width(self.size) else int(self.size, 16)

            if   1 == width: pci_value = self.cs.pci.read_byte (self.bus, self.device, self.function, self.offset)
            elif 2 == width: pci_value = self.cs.pci.read_word (self.bus, self.device, self.function, self.offset)
            elif 4 == width: pci_value = self.cs.pci.read_dword(self.bus, self.device, self.function, self.offset)
            else:
                self.logger.error( "Width should be one of {}".format(CMD_OPTS_WIDTH) )
                return
            self.logger.log( "[CHIPSEC] PCI {:02X}:{:02X}.{:02X} + 0x{:02X}: 0x{:X}".format(self.bus, self.device, self.function, self.offset, pci_value) )
示例#9
0
class MemCommand(BaseCommand):
    """
    >>> chipsec_util mem <op> <physical_address> <length> [value|buffer_file]
    >>>
    >>> <physical_address> : 64-bit physical address
    >>> <op>               : read|readval|write|writeval|allocate|pagedump
    >>> <length>           : byte|word|dword or length of the buffer from <buffer_file>
    >>> <value>            : byte, word or dword value to be written to memory at <physical_address>
    >>> <buffer_file>      : file with the contents to be written to memory at <physical_address>

    Examples:

    >>> chipsec_util mem <op>     <physical_address> <length> [value|file]
    >>> chipsec_util mem readval  0xFED40000         dword
    >>> chipsec_util mem read     0x41E              0x20     buffer.bin
    >>> chipsec_util mem writeval 0xA0000            dword    0x9090CCCC
    >>> chipsec_util mem write    0x100000000        0x1000   buffer.bin
    >>> chipsec_util mem write    0x100000000        0x10     000102030405060708090A0B0C0D0E0F
    >>> chipsec_util mem allocate                    0x1000
    >>> chipsec_util mem pagedump 0xFED00000         0x100000
    """
    def requires_driver(self):
        # No driver required when printing the util documentation
        if len(self.argv) < 3:
            return False
        return True

    def run(self):
        size = 0x100

        if len(self.argv) < 3:
            print MemCommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if 'allocate' == op and 4 == len(self.argv):
            size = int(self.argv[3], 16)
            (va, pa) = self.cs.mem.alloc_physical_mem(size)
            self.logger.log(
                '[CHIPSEC] Allocated %X bytes of physical memory: VA = 0x%016X, PA = 0x%016X'
                % (size, va, pa))

        elif 'pagedump' == op and len(self.argv) > 3:
            start = long(self.argv[3], 16)
            length = long(
                self.argv[4],
                16) if len(self.argv) > 4 else chipsec.defines.BOUNDARY_4KB
            end = start + length

            dump_region_to_path(chipsec.file.get_main_dir(), start, end)

        elif 'read' == op:
            phys_address = int(self.argv[3], 16)
            size = int(self.argv[4], 16) if len(self.argv) > 4 else 0x100
            self.logger.log(
                '[CHIPSEC] reading buffer from memory: PA = 0x%016X, len = 0x%X..'
                % (phys_address, size))
            buffer = self.cs.mem.read_physical_mem(phys_address, size)
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                chipsec.file.write_file(buf_file, buffer)
                self.logger.log("[CHIPSEC] written 0x%X bytes to '%s'" %
                                (len(buffer), buf_file))
            else:
                print_buffer(buffer)

        elif 'readval' == op:
            phys_address = int(self.argv[3], 16)
            width = 0x4
            if len(self.argv) > 4:
                width = chipsec_util.get_option_width(
                    self.argv[4]) if chipsec_util.is_option_valid_width(
                        self.argv[4]) else int(self.argv[4], 16)
            self.logger.log(
                '[CHIPSEC] reading %X-byte value from PA 0x%016X..' %
                (width, phys_address))
            if 0x1 == width:
                value = self.cs.mem.read_physical_mem_byte(phys_address)
            elif 0x2 == width:
                value = self.cs.mem.read_physical_mem_word(phys_address)
            elif 0x4 == width:
                value = self.cs.mem.read_physical_mem_dword(phys_address)
            self.logger.log('[CHIPSEC] value = 0x%X' % value)

        elif 'write' == op:
            phys_address = int(self.argv[3], 16)
            if len(self.argv) > 4:
                size = int(self.argv[4], 16)
            else:
                self.logger.error(
                    "must specify <length> argument in 'mem write'")
                return
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                if not os.path.exists(buf_file):
                    #buffer = buf_file.decode('hex')
                    try:
                        buffer = bytearray.fromhex(buf_file)
                    except ValueError, e:
                        self.logger.error("incorrect <value> specified: '%s'" %
                                          buf_file)
                        self.logger.error(str(e))
                        return
                    self.logger.log(
                        "[CHIPSEC] read 0x%X hex bytes from command-line: %s'"
                        % (len(buffer), buf_file))
                else:
                    buffer = chipsec.file.read_file(buf_file)
                    self.logger.log(
                        "[CHIPSEC] read 0x%X bytes from file '%s'" %
                        (len(buffer), buf_file))

                if len(buffer) < size:
                    self.logger.error(
                        "number of bytes read (0x%X) is less than the specified <length> (0x%X)"
                        % (len(buffer), size))
                    return

                self.logger.log(
                    '[CHIPSEC] writing buffer to memory: PA = 0x%016X, len = 0x%X..'
                    % (phys_address, size))
                self.cs.mem.write_physical_mem(phys_address, size, buffer)
            else:
                self.logger.error(
                    "must specify <buffer>|<file> argument in 'mem write'")
                return

        elif 'writeval' == op:
            phys_address = int(self.argv[3], 16)
            if len(self.argv) > 4:
                width = chipsec_util.get_option_width(
                    self.argv[4]) if chipsec_util.is_option_valid_width(
                        self.argv[4]) else int(self.argv[4], 16)
            else:
                self.logger.error(
                    "must specify <length> argument in 'mem writeval' as one of %s"
                    % chipsec_util.CMD_OPTS_WIDTH)
                return
            if len(self.argv) > 5:
                value = int(self.argv[5], 16)
            else:
                self.logger.error(
                    "must specify <value> argument in 'mem writeval'")
                return

            self.logger.log(
                '[CHIPSEC] writing %X-byte value 0x%X to PA 0x%016X..' %
                (width, value, phys_address))
            if 0x1 == width:
                self.cs.mem.write_physical_mem_byte(phys_address, value)
            elif 0x2 == width:
                self.cs.mem.write_physical_mem_word(phys_address, value)
            elif 0x4 == width:
                self.cs.mem.write_physical_mem_dword(phys_address, value)
示例#10
0
    def run(self):
        size = 0x100

        if len(self.argv) < 3:
            print MemCommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if 'allocate' == op and 4 == len(self.argv):
            size = int(self.argv[3], 16)
            (va, pa) = self.cs.mem.alloc_physical_mem(size)
            self.logger.log(
                '[CHIPSEC] Allocated %X bytes of physical memory: VA = 0x%016X, PA = 0x%016X'
                % (size, va, pa))

        elif 'pagedump' == op and len(self.argv) > 3:
            start = long(self.argv[3], 16)
            length = long(
                self.argv[4],
                16) if len(self.argv) > 4 else chipsec.defines.BOUNDARY_4KB
            end = start + length

            dump_region_to_path(chipsec.file.get_main_dir(), start, end)

        elif 'read' == op:
            phys_address = int(self.argv[3], 16)
            size = int(self.argv[4], 16) if len(self.argv) > 4 else 0x100
            self.logger.log(
                '[CHIPSEC] reading buffer from memory: PA = 0x%016X, len = 0x%X..'
                % (phys_address, size))
            buffer = self.cs.mem.read_physical_mem(phys_address, size)
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                chipsec.file.write_file(buf_file, buffer)
                self.logger.log("[CHIPSEC] written 0x%X bytes to '%s'" %
                                (len(buffer), buf_file))
            else:
                print_buffer(buffer)

        elif 'readval' == op:
            phys_address = int(self.argv[3], 16)
            width = 0x4
            if len(self.argv) > 4:
                width = chipsec_util.get_option_width(
                    self.argv[4]) if chipsec_util.is_option_valid_width(
                        self.argv[4]) else int(self.argv[4], 16)
            self.logger.log(
                '[CHIPSEC] reading %X-byte value from PA 0x%016X..' %
                (width, phys_address))
            if 0x1 == width:
                value = self.cs.mem.read_physical_mem_byte(phys_address)
            elif 0x2 == width:
                value = self.cs.mem.read_physical_mem_word(phys_address)
            elif 0x4 == width:
                value = self.cs.mem.read_physical_mem_dword(phys_address)
            self.logger.log('[CHIPSEC] value = 0x%X' % value)

        elif 'write' == op:
            phys_address = int(self.argv[3], 16)
            if len(self.argv) > 4:
                size = int(self.argv[4], 16)
            else:
                self.logger.error(
                    "must specify <length> argument in 'mem write'")
                return
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                if not os.path.exists(buf_file):
                    #buffer = buf_file.decode('hex')
                    try:
                        buffer = bytearray.fromhex(buf_file)
                    except ValueError, e:
                        self.logger.error("incorrect <value> specified: '%s'" %
                                          buf_file)
                        self.logger.error(str(e))
                        return
                    self.logger.log(
                        "[CHIPSEC] read 0x%X hex bytes from command-line: %s'"
                        % (len(buffer), buf_file))
                else:
                    buffer = chipsec.file.read_file(buf_file)
                    self.logger.log(
                        "[CHIPSEC] read 0x%X bytes from file '%s'" %
                        (len(buffer), buf_file))

                if len(buffer) < size:
                    self.logger.error(
                        "number of bytes read (0x%X) is less than the specified <length> (0x%X)"
                        % (len(buffer), size))
                    return

                self.logger.log(
                    '[CHIPSEC] writing buffer to memory: PA = 0x%016X, len = 0x%X..'
                    % (phys_address, size))
                self.cs.mem.write_physical_mem(phys_address, size, buffer)
            else:
                self.logger.error(
                    "must specify <buffer>|<file> argument in 'mem write'")
                return
示例#11
0
文件: pci_cmd.py 项目: daveti/chipsec
    def run(self):
        if len(self.argv) < 3:
            print PCICommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if ( 'enumerate' == op ):
            self.logger.log( "[CHIPSEC] Enumerating available PCIe devices.." )
            print_pci_devices( self.cs.pci.enumerate_devices() )
            self.logger.log( "[CHIPSEC] (pci) time elapsed %.3f" % (time.time()-t) )
            return

        elif ( 'dump' == op ):

            if len(self.argv) == 3:
                self.logger.log( "[CHIPSEC] dumping configuration of available PCI devices.." )
                self.cs.pci.print_pci_config_all()

            elif len(self.argv) > 5:
                bus       = int(self.argv[3],16)
                device    = int(self.argv[4],16)
                function  = int(self.argv[5],16)
                self.logger.log( "[CHIPSEC] PCI device %02X:%02X.%02X configuration:" % (bus,device,function) )
                cfg_buf = self.cs.pci.dump_pci_config( bus, device, function )
                pretty_print_hex_buffer( cfg_buf )
            else:
                print PCICommand.__doc__
                return

        elif ( 'xrom' == op ):

            if len(self.argv) < 5:
                self.logger.log( "[CHIPSEC] enumerating PCI expansion ROMs.." )
                xrom_addr = int(self.argv[3],16) if len(self.argv) == 4 else None
                _xroms = self.cs.pci.enumerate_xroms( True, True, xrom_addr )
                self.logger.log( "[CHIPSEC] found %d PCI expansion ROMs" % len(_xroms) )
                if len(_xroms) > 0: print_pci_XROMs( _xroms )
            elif len(self.argv) > 5:
                bus       = int(self.argv[3],16)
                device    = int(self.argv[4],16)
                function  = int(self.argv[5],16)
                xrom_addr = int(self.argv[6],16) if len(self.argv) > 6 else None
                self.logger.log( "[CHIPSEC] locating PCI expansion ROM (XROM) of %02X:%02X.%02X..." % (bus,device,function) )
                exists,xrom = self.cs.pci.find_XROM( bus, device, function, True, True, xrom_addr )
                if exists:
                    self.logger.log( "[CHIPSEC] found XROM of %02X:%02X.%02X" % (bus,device,function) )
                    if xrom is not None:
                        self.logger.log( "[CHIPSEC] XROM enabled = %d, base = 0x%08X, size = 0x%08X" % (xrom.en,xrom.base,xrom.size) )
                        if xrom.header is not None: self.logger.log( "[CHIPSEC] XROM header: %s" % xrom.header )
                else:
                    self.logger.log( "[CHIPSEC] coudn't find XROM of %02X:%02X.%02X" % (bus,device,function) )
            else:
                print PCICommand.__doc__
                return

        else:

            if len(self.argv) < 6:
                print PCICommand.__doc__
                return

            bus      = int(self.argv[2],16)
            device   = int(self.argv[3],16)
            function = int(self.argv[4],16)
            offset   = int(self.argv[5],16)
            width    = 4
            if len(self.argv) > 6:
                width = chipsec_util.get_option_width(self.argv[6]) if chipsec_util.is_option_valid_width(self.argv[6]) else int(self.argv[6],16)

            if 8 == len(self.argv):
                value = int(self.argv[7], 16)
                self.logger.log( "[CHIPSEC] write 0x%X to PCI %02X:%02X.%02X + 0x%02X" % (value, bus, device, function, offset) )
                if   1 == width: self.cs.pci.write_byte ( bus, device, function, offset, value )
                elif 2 == width: self.cs.pci.write_word ( bus, device, function, offset, value )
                elif 4 == width: self.cs.pci.write_dword( bus, device, function, offset, value )
                else: self.logger.error( "width should be one of %s" % chipsec_util.CMD_OPTS_WIDTH )
            else:
                if   1 == width: pci_value = self.cs.pci.read_byte (bus, device, function, offset)
                elif 2 == width: pci_value = self.cs.pci.read_word (bus, device, function, offset)
                elif 4 == width: pci_value = self.cs.pci.read_dword(bus, device, function, offset)
                else:
                    self.logger.error( "width should be one of %s" % chipsec_util.CMD_OPTS_WIDTH )
                    return
                self.logger.log( "[CHIPSEC] PCI %02X:%02X.%02X + 0x%02X: 0x%X" % (bus, device, function, offset, pci_value) )

        self.logger.log( "[CHIPSEC] (pci) time elapsed %.3f" % (time.time()-t) )
示例#12
0
    def run(self):
        if len(self.argv) < 3:
            print PCICommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if ('enumerate' == op):
            self.logger.log("[CHIPSEC] Enumerating available PCIe devices..")
            print_pci_devices(self.cs.pci.enumerate_devices())
            self.logger.log("[CHIPSEC] (pci) time elapsed %.3f" %
                            (time.time() - t))
            return

        elif ('dump' == op):

            if len(self.argv) == 3:
                self.logger.log(
                    "[CHIPSEC] dumping configuration of available PCI devices.."
                )
                self.cs.pci.print_pci_config_all()

            elif len(self.argv) > 5:
                bus = int(self.argv[3], 16)
                device = int(self.argv[4], 16)
                function = int(self.argv[5], 16)
                self.logger.log(
                    "[CHIPSEC] PCI device %02X:%02X.%02X configuration:" %
                    (bus, device, function))
                cfg_buf = self.cs.pci.dump_pci_config(bus, device, function)
                pretty_print_hex_buffer(cfg_buf)
            else:
                print PCICommand.__doc__
                return

        elif ('xrom' == op):

            if len(self.argv) < 5:
                self.logger.log("[CHIPSEC] enumerating PCI expansion ROMs..")
                xrom_addr = int(self.argv[3], 16) if len(
                    self.argv) == 4 else None
                _xroms = self.cs.pci.enumerate_xroms(True, True, xrom_addr)
                self.logger.log("[CHIPSEC] found %d PCI expansion ROMs" %
                                len(_xroms))
                if len(_xroms) > 0: print_pci_XROMs(_xroms)
            elif len(self.argv) > 5:
                bus = int(self.argv[3], 16)
                device = int(self.argv[4], 16)
                function = int(self.argv[5], 16)
                xrom_addr = int(self.argv[6],
                                16) if len(self.argv) > 6 else None
                self.logger.log(
                    "[CHIPSEC] locating PCI expansion ROM (XROM) of %02X:%02X.%02X..."
                    % (bus, device, function))
                exists, xrom = self.cs.pci.find_XROM(bus, device, function,
                                                     True, True, xrom_addr)
                if exists:
                    self.logger.log("[CHIPSEC] found XROM of %02X:%02X.%02X" %
                                    (bus, device, function))
                    if xrom is not None:
                        self.logger.log(
                            "[CHIPSEC] XROM enabled = %d, base = 0x%08X, size = 0x%08X"
                            % (xrom.en, xrom.base, xrom.size))
                        if xrom.header is not None:
                            self.logger.log("[CHIPSEC] XROM header: %s" %
                                            xrom.header)
                else:
                    self.logger.log(
                        "[CHIPSEC] coudn't find XROM of %02X:%02X.%02X" %
                        (bus, device, function))
            else:
                print PCICommand.__doc__
                return

        elif ('cmd' == op):
            cmd_mask = 0xFFFF
            pci_class = None
            pci_sub_class = None
            if len(self.argv) >= 4:
                cmd_mask = int(self.argv[3], 16)
            if len(self.argv) >= 5:
                pci_class = int(self.argv[4], 16)
            if len(self.argv) >= 6:
                pci_sub_class = int(self.argv[5], 16)
            self.logger.log('BDF     | VID:DID   | CMD  | CLS | Sub CLS')
            self.logger.log('------------------------------------------')
            for (b, d, f, vid, did) in self.cs.pci.enumerate_devices():
                dev_cls = self.cs.pci.read_byte(b, d, f, PCI_HDR_CLS_OFF)
                if pci_class is not None and (dev_cls != pci_class):
                    continue
                dev_sub_cls = self.cs.pci.read_byte(b, d, f,
                                                    PCI_HDR_SUB_CLS_OFF)
                if pci_sub_class is not None and (dev_sub_cls !=
                                                  pci_sub_class):
                    continue
                cmd_reg = self.cs.pci.read_word(b, d, f, PCI_HDR_CMD_OFF)
                if (cmd_reg & cmd_mask) == 0:
                    continue
                self.logger.log(
                    '{:02X}:{:02X}.{:X} | {:04X}:{:04X} | {:04X} | {:02X}  | {:02X}'
                    .format(b, d, f, vid, did, cmd_reg, dev_cls, dev_sub_cls))
        else:

            if len(self.argv) < 6:
                print PCICommand.__doc__
                return

            bus = int(self.argv[2], 16)
            device = int(self.argv[3], 16)
            function = int(self.argv[4], 16)
            offset = int(self.argv[5], 16)
            width = 4
            if len(self.argv) > 6:
                width = chipsec_util.get_option_width(
                    self.argv[6]) if chipsec_util.is_option_valid_width(
                        self.argv[6]) else int(self.argv[6], 16)

            if 8 == len(self.argv):
                value = int(self.argv[7], 16)
                self.logger.log(
                    "[CHIPSEC] write 0x%X to PCI %02X:%02X.%02X + 0x%02X" %
                    (value, bus, device, function, offset))
                if 1 == width:
                    self.cs.pci.write_byte(bus, device, function, offset,
                                           value)
                elif 2 == width:
                    self.cs.pci.write_word(bus, device, function, offset,
                                           value)
                elif 4 == width:
                    self.cs.pci.write_dword(bus, device, function, offset,
                                            value)
                else:
                    self.logger.error("width should be one of %s" %
                                      chipsec_util.CMD_OPTS_WIDTH)
            else:
                if 1 == width:
                    pci_value = self.cs.pci.read_byte(bus, device, function,
                                                      offset)
                elif 2 == width:
                    pci_value = self.cs.pci.read_word(bus, device, function,
                                                      offset)
                elif 4 == width:
                    pci_value = self.cs.pci.read_dword(bus, device, function,
                                                       offset)
                else:
                    self.logger.error("width should be one of %s" %
                                      chipsec_util.CMD_OPTS_WIDTH)
                    return
                self.logger.log("[CHIPSEC] PCI %02X:%02X.%02X + 0x%02X: 0x%X" %
                                (bus, device, function, offset, pci_value))

        self.logger.log("[CHIPSEC] (pci) time elapsed %.3f" %
                        (time.time() - t))
示例#13
0
    def run(self):
        if len(self.argv) < 3:
            print PCICommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if ('enumerate' == op):
            self.logger.log("[CHIPSEC] Enumerating available PCIe devices..")
            print_pci_devices(self.cs.pci.enumerate_devices())
            self.logger.log("[CHIPSEC] (pci) time elapsed %.3f" %
                            (time.time() - t))
            return

        elif ('dump' == op):

            if len(self.argv) == 3:
                self.logger.log(
                    "[CHIPSEC] dumping configuration of available PCI devices.."
                )
                self.cs.pci.print_pci_config_all()

            elif len(self.argv) > 5:
                bus = int(self.argv[3], 16)
                device = int(self.argv[4], 16)
                function = int(self.argv[5], 16)
                self.logger.log(
                    "[CHIPSEC] PCI device %02X:%02X.%02X configuration:" %
                    (bus, device, function))
                cfg_buf = self.cs.pci.dump_pci_config(bus, device, function)
                pretty_print_hex_buffer(cfg_buf)
            else:
                print PCICommand.__doc__
                return

        elif ('xrom' == op):

            if len(self.argv) < 5:
                self.logger.log("[CHIPSEC] enumerating PCI expansion ROMs..")
                xrom_addr = int(self.argv[3], 16) if len(
                    self.argv) == 4 else None
                _xroms = self.cs.pci.enumerate_xroms(True, True, xrom_addr)
                self.logger.log("[CHIPSEC] found %d PCI expansion ROMs" %
                                len(_xroms))
                if len(_xroms) > 0: print_pci_XROMs(_xroms)
            elif len(self.argv) > 5:
                bus = int(self.argv[3], 16)
                device = int(self.argv[4], 16)
                function = int(self.argv[5], 16)
                xrom_addr = int(self.argv[6],
                                16) if len(self.argv) > 6 else None
                self.logger.log(
                    "[CHIPSEC] locating PCI expansion ROM (XROM) of %02X:%02X.%02X..."
                    % (bus, device, function))
                exists, xrom = self.cs.pci.find_XROM(bus, device, function,
                                                     True, True, xrom_addr)
                if exists:
                    self.logger.log("[CHIPSEC] found XROM of %02X:%02X.%02X" %
                                    (bus, device, function))
                    if xrom is not None:
                        self.logger.log(
                            "[CHIPSEC] XROM enabled = %d, base = 0x%08X, size = 0x%08X"
                            % (xrom.en, xrom.base, xrom.size))
                        if xrom.header is not None:
                            self.logger.log("[CHIPSEC] XROM header: %s" %
                                            xrom.header)
                else:
                    self.logger.log(
                        "[CHIPSEC] coudn't find XROM of %02X:%02X.%02X" %
                        (bus, device, function))
            else:
                print PCICommand.__doc__
                return

        else:

            if len(self.argv) < 6:
                print PCICommand.__doc__
                return

            bus = int(self.argv[2], 16)
            device = int(self.argv[3], 16)
            function = int(self.argv[4], 16)
            offset = int(self.argv[5], 16)
            width = 4
            if len(self.argv) > 6:
                width = chipsec_util.get_option_width(
                    self.argv[6]) if chipsec_util.is_option_valid_width(
                        self.argv[6]) else int(self.argv[6], 16)

            if 8 == len(self.argv):
                value = int(self.argv[7], 16)
                self.logger.log(
                    "[CHIPSEC] write 0x%X to PCI %02X:%02X.%02X + 0x%02X" %
                    (value, bus, device, function, offset))
                if 1 == width:
                    self.cs.pci.write_byte(bus, device, function, offset,
                                           value)
                elif 2 == width:
                    self.cs.pci.write_word(bus, device, function, offset,
                                           value)
                elif 4 == width:
                    self.cs.pci.write_dword(bus, device, function, offset,
                                            value)
                else:
                    self.logger.error("width should be one of %s" %
                                      chipsec_util.CMD_OPTS_WIDTH)
            else:
                if 1 == width:
                    pci_value = self.cs.pci.read_byte(bus, device, function,
                                                      offset)
                elif 2 == width:
                    pci_value = self.cs.pci.read_word(bus, device, function,
                                                      offset)
                elif 4 == width:
                    pci_value = self.cs.pci.read_dword(bus, device, function,
                                                       offset)
                else:
                    self.logger.error("width should be one of %s" %
                                      chipsec_util.CMD_OPTS_WIDTH)
                    return
                self.logger.log("[CHIPSEC] PCI %02X:%02X.%02X + 0x%02X: 0x%X" %
                                (bus, device, function, offset, pci_value))

        self.logger.log("[CHIPSEC] (pci) time elapsed %.3f" %
                        (time.time() - t))
示例#14
0
    def run(self):
        size = 0x100

        if len(self.argv) < 3:
            print MemCommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if 'allocate'   == op and 4 == len(self.argv):
            size = int(self.argv[3],16)
            (va, pa) = self.cs.mem.alloc_physical_mem( size )
            self.logger.log( '[CHIPSEC] Allocated %X bytes of physical memory: VA = 0x%016X, PA = 0x%016X' % (size, va, pa) )

        elif 'pagedump' == op and len(self.argv) > 3:
            start   = long(self.argv[3],16)
            length  = long(self.argv[4],16) if len(self.argv) > 4 else chipsec.defines.BOUNDARY_4KB
            end = start + length

            dump_region_to_path( chipsec.file.get_main_dir(), start, end )

        elif 'read'     == op:
            phys_address = int(self.argv[3],16)
            size         = int(self.argv[4],16) if len(self.argv) > 4 else 0x100
            self.logger.log( '[CHIPSEC] reading buffer from memory: PA = 0x%016X, len = 0x%X..' % (phys_address, size) )
            buffer = self.cs.mem.read_physical_mem( phys_address, size )
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                chipsec.file.write_file( buf_file, buffer )
                self.logger.log( "[CHIPSEC] written 0x%X bytes to '%s'" % (len(buffer), buf_file) )
            else:
                print_buffer( buffer )

        elif 'readval'  == op:
            phys_address = int(self.argv[3],16)
            width        = 0x4
            if len(self.argv) > 4: 
                width = chipsec_util.get_option_width(self.argv[4]) if chipsec_util.is_option_valid_width(self.argv[4]) else int(self.argv[4],16)
            self.logger.log( '[CHIPSEC] reading %X-byte value from PA 0x%016X..' % (width, phys_address) )
            if   0x1 == width: value = self.cs.mem.read_physical_mem_byte ( phys_address )
            elif 0x2 == width: value = self.cs.mem.read_physical_mem_word ( phys_address )
            elif 0x4 == width: value = self.cs.mem.read_physical_mem_dword( phys_address )
            self.logger.log( '[CHIPSEC] value = 0x%X' % value )

        elif 'write'    == op:
            phys_address = int(self.argv[3],16)
            if len(self.argv) > 4: 
                size = int(self.argv[4],16)
            else:
                self.logger.error( "must specify <length> argument in 'mem write'" )
                return
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                if not os.path.exists( buf_file ):
                    #buffer = buf_file.decode('hex')
                    try:
                      buffer = bytearray.fromhex(buf_file)
                    except ValueError, e:
                        self.logger.error( "incorrect <value> specified: '%s'" % buf_file )
                        self.logger.error( str(e) )
                        return
                    self.logger.log( "[CHIPSEC] read 0x%X hex bytes from command-line: %s'" % (len(buffer), buf_file) )
                else:
                    buffer = chipsec.file.read_file( buf_file )
                    self.logger.log( "[CHIPSEC] read 0x%X bytes from file '%s'" % (len(buffer), buf_file) )

                if len(buffer) < size:
                    self.logger.error( "number of bytes read (0x%X) is less than the specified <length> (0x%X)" % (len(buffer),size) )
                    return

                self.logger.log( '[CHIPSEC] writing buffer to memory: PA = 0x%016X, len = 0x%X..' % (phys_address, size) )
                self.cs.mem.write_physical_mem( phys_address, size, buffer )
            else:
                self.logger.error( "must specify <buffer>|<file> argument in 'mem write'" )
                return
示例#15
0
def mem(argv):
    """
    >>> chipsec_util mem <op> <physical_address> <length> [value|buffer_file]
    >>>
    >>> <physical_address> : 64-bit physical address
    >>> <op>               : read|readval|write|writeval|allocate
    >>> <length>           : byte|word|dword or length of the buffer from <buffer_file>
    >>> <value>            : byte, word or dword value to be written to memory at <physical_address>
    >>> <buffer_file>      : file with the contents to be written to memory at <physical_address>

    Examples:

    >>> chipsec_util mem <op>     <physical_address> <length> [value|file]
    >>> chipsec_util mem readval  0xFED40000         dword
    >>> chipsec_util mem read     0x41E              0x20     buffer.bin
    >>> chipsec_util mem writeval 0xA0000            dword    0x9090CCCC
    >>> chipsec_util mem write    0x100000000        0x1000   buffer.bin
    >>> chipsec_util mem write    0x100000000        0x10     000102030405060708090A0B0C0D0E0F
    >>> chipsec_util mem allocate                    0x1000
    """

    phys_address    = 0
    size = 0x100

    if 3 > len(argv):
        print mem.__doc__
        return

    op = argv[2]
    t = time.time()

    if 'allocate'   == op and 4 == len(argv):
        size = int(argv[3],16)
        (va, pa) = chipsec_util._cs.mem.alloc_physical_mem( size )
        logger().log( '[CHIPSEC] Allocated %X bytes of physical memory: VA = 0x%016X, PA = 0x%016X' % (size, va, pa) )

    elif 'read'     == op:
        phys_address = int(argv[3],16)
        size         = int(argv[4],16) if len(argv) > 4 else 0x100
        logger().log( '[CHIPSEC] reading buffer from memory: PA = 0x%016X, len = 0x%X..' % (phys_address, size) )
        buffer = chipsec_util._cs.mem.read_physical_mem( phys_address, size )
        if len(argv) > 5:
            buf_file = argv[5]
            chipsec.file.write_file( buf_file, buffer )
            logger().log( "[CHIPSEC] written 0x%X bytes to '%s'" % (len(buffer), buf_file) )
        else:
            print_buffer( buffer )

    elif 'readval'  == op:
        phys_address = int(argv[3],16)
        width        = 0x4
        if len(argv) > 4: 
            width = chipsec_util.get_option_width(argv[4]) if chipsec_util.is_option_valid_width(argv[4]) else int(argv[4],16)
        logger().log( '[CHIPSEC] reading value from memory: PA = 0x%016X, width = 0x%X..' % (phys_address, size) )
        if   0x1 == width: value = chipsec_util._cs.mem.read_physical_mem_byte ( phys_address )
        elif 0x2 == width: value = chipsec_util._cs.mem.read_physical_mem_word ( phys_address )
        elif 0x4 == width: value = chipsec_util._cs.mem.read_physical_mem_dword( phys_address )
        logger().log( '[CHIPSEC] value = 0x%X' % value )

    elif 'write'    == op:
        phys_address = int(argv[3],16)
        if len(argv) > 4: 
            size = int(argv[4],16)
        else:
            logger().error( "must specify <length> argument in 'mem write'" )
            return
        if len(argv) > 5:
            buf_file = argv[5]
            if not os.path.exists( buf_file ):
                #buffer = buf_file.decode('hex')
                try:
                  buffer = bytearray.fromhex(buf_file)
                except ValueError, e:
                    logger().error( "incorrect <value> specified: '%s'" % buf_file )
                    logger().error( str(e) )
                    return
                logger().log( "[CHIPSEC] read 0x%X hex bytes from command-line: %s'" % (len(buffer), buf_file) )
            else:
                buffer = chipsec.file.read_file( buf_file )
                logger().log( "[CHIPSEC] read 0x%X bytes from file '%s'" % (len(buffer), buf_file) )

            if len(buffer) < size:
                logger().error( "number of bytes read (0x%X) is less than the specified <length> (0x%X)" % (len(buffer),size) )
                return

            logger().log( '[CHIPSEC] writing buffer to memory: PA = 0x%016X, len = 0x%X..' % (phys_address, size) )
            chipsec_util._cs.mem.write_physical_mem( phys_address, size, buffer )
        else:
            logger().error( "must specify <buffer>|<file> argument in 'mem write'" )
            return
示例#16
0
    op = argv[2]
    if ( 'list' == op ):
        _iobar.list_IO_BARs()
        return

    t = time.time()

    if len(argv) < 3:
        print port_io.__doc__
        return

    io_port = int(argv[2],16)

    width = 0x1
    if len(argv) > 3: 
        width = chipsec_util.get_option_width(argv[3]) if chipsec_util.is_option_valid_width(argv[3]) else int(argv[3],16)

    if 5 == len(argv):
        value = int(argv[4], 16)
        logger().log( "[CHIPSEC] OUT 0x%04X <- 0x%08X (size = 0x%02x)" % (io_port, value, width) )
        if   0x1 == width: chipsec_util._cs.io.write_port_byte( io_port, value )
        elif 0x2 == width: chipsec_util._cs.io.write_port_word( io_port, value )
        elif 0x4 == width: chipsec_util._cs.io.write_port_dword( io_port, value )
    else:
        if   0x1 == width: value = chipsec_util._cs.io.read_port_byte( io_port )
        elif 0x2 == width: value = chipsec_util._cs.io.read_port_word( io_port )
        elif 0x4 == width: value = chipsec_util._cs.io.read_port_dword( io_port )
        logger().log( "[CHIPSEC] IN 0x%04X -> 0x%08X (size = 0x%02x)" % (io_port, value, width) )

    logger().log( "[CHIPSEC] (io) time elapsed %.3f" % (time.time()-t) )
示例#17
0
    def run(self):
        try:
            _vmem = virtmem.VirtMemory(self.cs)
        except:
            return

        size = 0x100

        if len(self.argv) < 3:
            print (VMemCommand.__doc__)
            return

        op = self.argv[2]

        if 'allocate'   == op and 4 == len(self.argv):
            size = int(self.argv[3],16)
            (va, pa) = _vmem.alloc_virtual_mem( size )
            self.logger.log( '[CHIPSEC] Allocated {:X} bytes of virtual memory: VA = 0x{:016X}, PA = 0x{:016X}'.format(size, va, pa) )

        elif 'search' == op and len(self.argv) > 5:
            virt_address = int(self.argv[3],16)
            size         = int(self.argv[4],16)
                      
            buffer = _vmem.read_virtual_mem( virt_address, size )
            buffer = chipsec.defines.bytestostring(buffer)
            offset = buffer.find(self.argv[5])

            if offset != -1:
                self.logger.log( '[CHIPSEC] search buffer from memory: VA = 0x{:016X}, len = 0x{:X}, target address= 0x{:X}..'.format(virt_address, size, virt_address + offset) )
            else:
                self.logger.log( '[CHIPSEC] search buffer from memory: VA = 0x{:016X}, len = 0x{:X}, can not find the target in the searched range..'.format(virt_address, size) )

        elif 'read'     == op:
            virt_address = int(self.argv[3],16)
            size         = int(self.argv[4],16) if len(self.argv) > 4 else 0x100
            self.logger.log( '[CHIPSEC] reading buffer from memory: VA = 0x{:016X}, len = 0x{:X}..'.format(virt_address, size) )
            buffer = _vmem.read_virtual_mem( virt_address, size )
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                chipsec.file.write_file( buf_file, buffer )
                self.logger.log( "[CHIPSEC] written 0x{:X} bytes to '{}'".format(len(buffer), buf_file) )
            else:
                print_buffer( chipsec.defines.bytestostring(buffer) )

        elif 'readval'  == op:
            virt_address = int(self.argv[3],16)
            width        = 0x4
            if len(self.argv) > 4: 
                width = chipsec_util.get_option_width(self.argv[4]) if chipsec_util.is_option_valid_width(self.argv[4]) else int(self.argv[4],16)
            self.logger.log( '[CHIPSEC] reading {:X}-byte value from VA 0x{:016X}..'.format(width, virt_address) )
            if   0x1 == width: value = _vmem.read_virtual_mem_byte ( virt_address )
            elif 0x2 == width: value = _vmem.read_virtual_mem_word ( virt_address )
            elif 0x4 == width: value = _vmem.read_virtual_mem_dword( virt_address )
            self.logger.log( '[CHIPSEC] value = 0x{:X}'.format(value) )

        elif 'write'    == op:
            virt_address = int(self.argv[3],16)
            if len(self.argv) > 4: 
                size = int(self.argv[4],16)
            else:
                self.logger.error( "must specify <length> argument in 'mem write'" )
                return
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                if not os.path.exists( buf_file ):
                    #buffer = buf_file.decode('hex')
                    try:
                      buffer = bytearray.fromhex(buf_file)
                    except ValueError as e:
                        self.logger.error( "incorrect <value> specified: '{}'".format(buf_file) )
                        self.logger.error( str(e) )
                        return
                    self.logger.log( "[CHIPSEC] read 0x{:X} hex bytes from command-line: {}'".format(len(buffer), buf_file) )
                else:
                    buffer = chipsec.file.read_file( buf_file )
                    self.logger.log( "[CHIPSEC] read 0x{:X} bytes from file '{}'".format(len(buffer), buf_file) )

                if len(buffer) < size:
                    self.logger.error( "number of bytes read (0x{:X}) is less than the specified <length> (0x{:X})".format(len(buffer),size) )
                    return

                self.logger.log( '[CHIPSEC] writing buffer to memory: VA = 0x{:016X}, len = 0x{:X}..'.format(virt_address, size) )
                _vmem.write_virtual_mem( virt_address, size, buffer )
            else:
                self.logger.error( "must specify <buffer>|<file> argument in 'mem write'" )
                return

        elif 'writeval' == op:
            virt_address = int(self.argv[3],16)
            if len(self.argv) > 4: 
                width = chipsec_util.get_option_width(self.argv[4]) if chipsec_util.is_option_valid_width(self.argv[4]) else int(self.argv[4],16)
            else:
                self.logger.error( "must specify <length> argument in 'mem writeval' as one of {}".format(chipsec_util.CMD_OPTS_WIDTH) )
                return
            if len(self.argv) > 5: 
                value = int(self.argv[5],16)
            else:
                self.logger.error( "must specify <value> argument in 'mem writeval'" )
                return

            self.logger.log( '[CHIPSEC] writing {:X}-byte value 0x{:X} to VA 0x{:016X}..'.format(width, value, virt_address) )
            if   0x1 == width: _vmem.write_virtual_mem_byte ( virt_address, value )
            elif 0x2 == width: _vmem.write_virtual_mem_word ( virt_address, value )
            elif 0x4 == width: _vmem.write_virtual_mem_dword( virt_address, value )

        elif 'getphys' == op:
            virt_address = int(self.argv[3],16)
            pa = _vmem.va2pa( virt_address )
            if pa != None:
                self.logger.log( '[CHIPSEC] Allocated {:X} bytes of virtual memory: VA = 0x{:016X}, PA = 0x{:016X}'.format(size, virt_address, pa) )
            
        else:
                print (VMemCommand.__doc__)
                return
示例#18
0
                    % (len(buffer), size))
                return

            logger().log(
                '[CHIPSEC] writing buffer to memory: PA = 0x%016X, len = 0x%X..'
                % (phys_address, size))
            chipsec_util._cs.mem.write_physical_mem(phys_address, size, buffer)
        else:
            logger().error(
                "must specify <buffer>|<file> argument in 'mem write'")
            return

    elif 'writeval' == op:
        phys_address = int(argv[3], 16)
        if len(argv) > 4:
            width = chipsec_util.get_option_width(
                argv[4]) if chipsec_util.is_option_valid_width(
                    argv[4]) else int(argv[4], 16)
        else:
            logger().error(
                "must specify <length> argument in 'mem writeval' as one of %s"
                % chipsec_util.CMD_OPTS_WIDTH)
            return
        if len(argv) > 5:
            value = int(argv[5], 16)
        else:
            logger().error("must specify <value> argument in 'mem writeval'")
            return

        logger().log('[CHIPSEC] writing %X-byte value 0x%X to PA 0x%016X..' %
                     (width, value, phys_address))
        if 0x1 == width:
示例#19
0
    def run(self):
        size = 0x100

        if len(self.argv) < 3:
            print(MemCommand.__doc__)
            return

        op = self.argv[2]
        t = time.time()

        if 'allocate' == op and 4 == len(self.argv):
            size = int(self.argv[3], 16)
            (va, pa) = self.cs.mem.alloc_physical_mem(size)
            self.logger.log(
                '[CHIPSEC] Allocated {:X} bytes of physical memory: VA = 0x{:016X}, PA = 0x{:016X}'
                .format(size, va, pa))

        elif 'search' == op and len(self.argv) > 5:
            phys_address = int(self.argv[3], 16)
            size = int(self.argv[4], 16)

            buffer = self.cs.mem.read_physical_mem(phys_address, size)
            buffer = chipsec.defines.bytestostring(buffer)
            offset = buffer.find(self.argv[5])

            if offset != -1:
                self.logger.log(
                    '[CHIPSEC] search buffer from memory: PA = 0x{:016X}, len = 0x{:X}, target address= 0x{:X}..'
                    .format(phys_address, size, phys_address + offset))
            else:
                self.logger.log(
                    '[CHIPSEC] search buffer from memory: PA = 0x{:016X}, len = 0x{:X}, can not find the target in the searched range..'
                    .format(phys_address, size))

        elif 'pagedump' == op and len(self.argv) > 3:
            start = int(self.argv[3], 16)
            length = int(
                self.argv[4],
                16) if len(self.argv) > 4 else chipsec.defines.BOUNDARY_4KB
            end = start + length
            self.dump_region_to_path(chipsec.file.get_main_dir(), start, end)

        elif 'read' == op:
            phys_address = int(self.argv[3], 16)
            size = int(self.argv[4], 16) if len(self.argv) > 4 else 0x100
            self.logger.log(
                '[CHIPSEC] reading buffer from memory: PA = 0x{:016X}, len = 0x{:X}..'
                .format(phys_address, size))
            buffer = self.cs.mem.read_physical_mem(phys_address, size)
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                chipsec.file.write_file(buf_file, buffer)
                self.logger.log(
                    "[CHIPSEC] written 0x{:X} bytes to '{}'".format(
                        len(buffer), buf_file))
            else:
                print_buffer(chipsec.defines.bytestostring(buffer))

        elif 'readval' == op:
            phys_address = int(self.argv[3], 16)
            width = 0x4
            if len(self.argv) > 4:
                width = chipsec_util.get_option_width(
                    self.argv[4]) if chipsec_util.is_option_valid_width(
                        self.argv[4]) else int(self.argv[4], 16)
            self.logger.log(
                '[CHIPSEC] reading {:X}-byte value from PA 0x{:016X}..'.format(
                    width, phys_address))
            if 0x1 == width:
                value = self.cs.mem.read_physical_mem_byte(phys_address)
            elif 0x2 == width:
                value = self.cs.mem.read_physical_mem_word(phys_address)
            elif 0x4 == width:
                value = self.cs.mem.read_physical_mem_dword(phys_address)
            self.logger.log('[CHIPSEC] value = 0x{:X}'.format(value))

        elif 'write' == op:
            phys_address = int(self.argv[3], 16)
            if len(self.argv) > 4:
                size = int(self.argv[4], 16)
            else:
                self.logger.error(
                    "must specify <length> argument in 'mem write'")
                return
            if len(self.argv) > 5:
                buf_file = self.argv[5]
                if not os.path.exists(buf_file):
                    #buffer = buf_file.decode('hex')
                    try:
                        buffer = bytearray.fromhex(buf_file)
                    except ValueError as e:
                        self.logger.error(
                            "incorrect <value> specified: '{}'".format(
                                buf_file))
                        self.logger.error(str(e))
                        return
                    self.logger.log(
                        "[CHIPSEC] read 0x{:X} hex bytes from command-line: {}'"
                        .format(len(buffer), buf_file))
                else:
                    buffer = chipsec.file.read_file(buf_file)
                    self.logger.log(
                        "[CHIPSEC] read 0x{:X} bytes from file '{}'".format(
                            len(buffer), buf_file))

                if len(buffer) < size:
                    self.logger.error(
                        "number of bytes read (0x{:X}) is less than the specified <length> (0x{:X})"
                        .format(len(buffer), size))
                    return

                self.logger.log(
                    '[CHIPSEC] writing buffer to memory: PA = 0x{:016X}, len = 0x{:X}..'
                    .format(phys_address, size))
                self.cs.mem.write_physical_mem(phys_address, size, buffer)
            else:
                self.logger.error(
                    "must specify <buffer>|<file> argument in 'mem write'")
                return

        elif 'writeval' == op:
            phys_address = int(self.argv[3], 16)
            if len(self.argv) > 4:
                width = chipsec_util.get_option_width(
                    self.argv[4]) if chipsec_util.is_option_valid_width(
                        self.argv[4]) else int(self.argv[4], 16)
            else:
                self.logger.error(
                    "must specify <length> argument in 'mem writeval' as one of {}"
                    .format(chipsec_util.CMD_OPTS_WIDTH))
                return
            if len(self.argv) > 5:
                value = int(self.argv[5], 16)
            else:
                self.logger.error(
                    "must specify <value> argument in 'mem writeval'")
                return

            self.logger.log(
                '[CHIPSEC] writing {:X}-byte value 0x{:X} to PA 0x{:016X}..'.
                format(width, value, phys_address))
            if 0x1 == width:
                self.cs.mem.write_physical_mem_byte(phys_address, value)
            elif 0x2 == width:
                self.cs.mem.write_physical_mem_word(phys_address, value)
            elif 0x4 == width:
                self.cs.mem.write_physical_mem_dword(phys_address, value)

        else:
            print(MemCommand.__doc__)
            return

        self.logger.log(
            "[CHIPSEC] (mem) time elapsed {:.3f}".format(time.time() - t))
示例#20
0
    def run(self):
        if len(self.argv) < 3:
            print PCICommand.__doc__
            return

        op = self.argv[2]
        t = time.time()

        if ( 'enumerate' == op ):
            self.logger.log( "[CHIPSEC] Enumerating available PCIe devices.." )
            print_pci_devices( self.cs.pci.enumerate_devices() )
            self.logger.log( "[CHIPSEC] (pci) time elapsed %.3f" % (time.time()-t) )
            return

        elif ( 'dump' == op ):

            if len(self.argv) == 3:
                self.logger.log( "[CHIPSEC] dumping configuration of available PCI devices.." )
                self.cs.pci.print_pci_config_all()

            elif len(self.argv) > 5:
                bus       = int(self.argv[3],16)
                device    = int(self.argv[4],16)
                function  = int(self.argv[5],16)
                self.logger.log( "[CHIPSEC] PCI device %02X:%02X.%02X configuration:" % (bus,device,function) )
                cfg_buf = self.cs.pci.dump_pci_config( bus, device, function )
                pretty_print_hex_buffer( cfg_buf )
            else:
                print PCICommand.__doc__
                return

        elif ( 'xrom' == op ):

            if len(self.argv) < 5:
                self.logger.log( "[CHIPSEC] enumerating PCI expansion ROMs.." )
                xrom_addr = int(self.argv[3],16) if len(self.argv) == 4 else None
                _xroms = self.cs.pci.enumerate_xroms( True, True, xrom_addr )
                self.logger.log( "[CHIPSEC] found %d PCI expansion ROMs" % len(_xroms) )
                if len(_xroms) > 0: print_pci_XROMs( _xroms )
            elif len(self.argv) > 5:
                bus       = int(self.argv[3],16)
                device    = int(self.argv[4],16)
                function  = int(self.argv[5],16)
                xrom_addr = int(self.argv[6],16) if len(self.argv) > 6 else None
                self.logger.log( "[CHIPSEC] locating PCI expansion ROM (XROM) of %02X:%02X.%02X..." % (bus,device,function) )
                exists,xrom = self.cs.pci.find_XROM( bus, device, function, True, True, xrom_addr )
                if exists:
                    self.logger.log( "[CHIPSEC] found XROM of %02X:%02X.%02X" % (bus,device,function) )
                    if xrom is not None:
                        self.logger.log( "[CHIPSEC] XROM enabled = %d, base = 0x%08X, size = 0x%08X" % (xrom.en,xrom.base,xrom.size) )
                        if xrom.header is not None: self.logger.log( "[CHIPSEC] XROM header: %s" % xrom.header )
                else:
                    self.logger.log( "[CHIPSEC] coudn't find XROM of %02X:%02X.%02X" % (bus,device,function) )
            else:
                print PCICommand.__doc__
                return

        elif ('cmd' == op):
            cmd_mask = 0xFFFF
            pci_class = None
            pci_sub_class = None
            if len(self.argv) >= 4:
                cmd_mask = int(self.argv[3],16)
            if len(self.argv) >= 5:
                pci_class = int(self.argv[4],16)
            if len(self.argv) >= 6:
                pci_sub_class = int(self.argv[5],16)
            self.logger.log('BDF     | VID:DID   | CMD  | CLS | Sub CLS')
            self.logger.log('------------------------------------------')
            for (b, d, f, vid, did) in self.cs.pci.enumerate_devices():
                dev_cls = self.cs.pci.read_byte(b, d, f, PCI_HDR_CLS_OFF)
                if pci_class is not None and (dev_cls != pci_class):
                    continue
                dev_sub_cls = self.cs.pci.read_byte(b, d, f, PCI_HDR_SUB_CLS_OFF)
                if pci_sub_class is not None and (dev_sub_cls != pci_sub_class):
                    continue
                cmd_reg = self.cs.pci.read_word(b, d, f, PCI_HDR_CMD_OFF)
                if (cmd_reg & cmd_mask) == 0:
                    continue
                self.logger.log('{:02X}:{:02X}.{:X} | {:04X}:{:04X} | {:04X} | {:02X}  | {:02X}'.format(b, d, f, vid, did, cmd_reg, dev_cls, dev_sub_cls))
        else:

            if len(self.argv) < 6:
                print PCICommand.__doc__
                return

            bus      = int(self.argv[2],16)
            device   = int(self.argv[3],16)
            function = int(self.argv[4],16)
            offset   = int(self.argv[5],16)
            width    = 4
            if len(self.argv) > 6:
                width = chipsec_util.get_option_width(self.argv[6]) if chipsec_util.is_option_valid_width(self.argv[6]) else int(self.argv[6],16)

            if 8 == len(self.argv):
                value = int(self.argv[7], 16)
                self.logger.log( "[CHIPSEC] write 0x%X to PCI %02X:%02X.%02X + 0x%02X" % (value, bus, device, function, offset) )
                if   1 == width: self.cs.pci.write_byte ( bus, device, function, offset, value )
                elif 2 == width: self.cs.pci.write_word ( bus, device, function, offset, value )
                elif 4 == width: self.cs.pci.write_dword( bus, device, function, offset, value )
                else: self.logger.error( "width should be one of %s" % chipsec_util.CMD_OPTS_WIDTH )
            else:
                if   1 == width: pci_value = self.cs.pci.read_byte (bus, device, function, offset)
                elif 2 == width: pci_value = self.cs.pci.read_word (bus, device, function, offset)
                elif 4 == width: pci_value = self.cs.pci.read_dword(bus, device, function, offset)
                else:
                    self.logger.error( "width should be one of %s" % chipsec_util.CMD_OPTS_WIDTH )
                    return
                self.logger.log( "[CHIPSEC] PCI %02X:%02X.%02X + 0x%02X: 0x%X" % (bus, device, function, offset, pci_value) )

        self.logger.log( "[CHIPSEC] (pci) time elapsed %.3f" % (time.time()-t) )