Exemplo n.º 1
0
    def _execute(self, input):
        if input:
            self._latest_command = input
        else:
            input = self._latest_command

        if input == 'q':
            global_env.stop_all()
            global_env.dbg_event.set()
        elif input == 'h':
            logger.critical("In the future this will show you the help.")
        elif input == 'c' or input == 'continue':
            logger.critical("Continue")
            global_env.dbg_event.set()
        elif input == 'ci':
            logger.critical(global_env.get_info())
            logger.critical("Continue ..")
            global_env.dbg_event.set()
        elif input == 'n' or input == 'next':
            global_env.STEPPING = True
            global_env.dbg_event.set()
            logger.critical("Next ..")
        elif input == 's off':
            global_env.STEPPING = False
        elif input == 's on':
            global_env.STEPPING = True
        elif self.break1_re.match(input):
            # Breakpoint decimal
            address = self.break1_number_re.search(input).group()
            self._gdb_breakpoint_insert(int(address), 4, 0)
        elif self.break2_re.match(input):
            # Breakpoint hex
            address = self.break2_number_re.search(input).group()
            self._gdb_breakpoint_remove(int(address, 16), 4, 0)
        elif input == 'info' or input == 'i':
            print global_env.get_info()
        else:
            logger.critical("Wrong command.")
Exemplo n.º 2
0
 def run(self):
     while True:
         try:
             if self._stopped:
                 logger.critical("System was stopped")
                 break
 
             input = self.char_driver.read_byte()
             if not input:
                 logger.critical("Client closed connection.")
                 break
             logger.critical("Received char (%s) => (%s)", ord(input), input)
             self.process_byte(input)
         except socket.timeout:
             # check events now
             if global_env.dbg_breakpoint_hit:
                 global_env.dbg_breakpoint_hit = False
                 self._send_anonymous_stop_signal()
         except:
             break
     
     logger.critical("Makkah: Terminated via GDBstub")
     global_env.stop_all()
     global_env.dbg_event.set()
Exemplo n.º 3
0
def shutdown(signum, frame):
    logger.info("Received shutdown.")
    global_env.stop_all()
Exemplo n.º 4
0
    def gdb_handle_packet(self):
        def unknown_command():
            _buffer = (c_uint8 * 2)()
            _buffer[0] = ord('\x00')
            _buffer[1] = ord('\x00')
            self._put_packet(_buffer, 1)

        index = 0
        ch = chr(self.PIBuffer[index])
        index = 1
        if ch == 'z' or ch == 'Z':
            type, index = self._strtoul(self.PIBuffer, index, True)
            if self.PIBuffer[index] == ord(','):
                index += 1
            addr, index = self._strtoul(self.PIBuffer, index, True)
            if self.PIBuffer[index] == ord(','):
                index += 1
            length, index = self._strtoul(self.PIBuffer, index, True)

            if ch == 'Z':
                res = self._gdb_breakpoint_insert(addr, length, type);
            else:
                res = self._gdb_breakpoint_remove(addr, length, type);
            if res >= 0:
                str = "OK"
                self._put_packet(self._str_to_buf(str), len(str))
            elif res == -self.ENOSYS:
                str = ""
                self._put_packet(self._str_to_buf(str), len(str))
            else:
                str = "E22"
                self._put_packet(self._str_to_buf(str), len(str))
        elif ch == '?':
            # Initializing.
            str = "T05thread:01;"
            global_env.GDB_IPs = []
            global_env.GDB_ops = []
            self._put_packet(self._str_to_buf(str), len(str))
        elif ch == 'H':
            type = self.PIBuffer[index]
            index += 1
            thread, index = self._strtoul(self.PIBuffer, index, True)
            if thread == -1 or thread == 0:
                str = "OK"
                self._put_packet(self._str_to_buf(str), len(str));
            else:
                raise NotImplemented()
        elif ch == 'q':
            next_char = chr(self.PIBuffer[index])
            if next_char == 'C':
                # Current thread.
                str = 'QC1'
                self._put_packet(self._str_to_buf(str), len(str))
            else:
                unknown_command()
        elif ch == 'g':
            #FIXME
            str = ''
            for i in range(16):
                value = self._tohex(global_env.main_cpu.register_read(i).value, 8, '0')
                logger.critical(value)
                str += value
                logger.critical("Reading register (%s) => (%s)", i, value)
            self._put_packet(self._str_to_buf(str), len(str))
        elif ch == 'p':
            #FIXME
            register_no, index = self._strtoul(self.PIBuffer, index, True)
            if register_no < 16:
                str = self._tohex(global_env.main_cpu.register_read(register_no).value, 8, '0')
                logger.critical("Reading register (%s) => (%s)", register_no, str)
                self._put_packet(self._str_to_buf(str), len(str))
            else:
                str = '00000000'
                self._put_packet(self._str_to_buf(str), len(str))
        elif ch == 'm':
            addr, index = self._strtoul(self.PIBuffer, index, True)
            if self.PIBuffer[index] == ord(','):
                index += 1
            length, _ = self._strtoul(self.PIBuffer, index, True)
            arr_length = length * 2
            _buffer = (c_uint8 * arr_length)()
            
            # Change your identity to imitate the cpu that's accessing this memory region
            global_env.THREAD_ENV.engine_id = global_env.main_cpu.get_name()
            i = 0
            try:
                for _ in range(length / 4):
                    value = global_env.main_cpu.mmu_read(addr + i).value
                    hex_value = (self._tohex(value, 8, '0'))
                    for index in range(8):
                        _buffer[index] = ord(hex_value[index])
                    i += 4

                self._put_packet(_buffer, arr_length)
            except:
                str = "E14"
                self._put_packet(self._str_to_buf(str), len(str))
        elif ch == 'v':
            if chr(self.PIBuffer[index]) == 'C' and chr(self.PIBuffer[index + 1]) == 'o' and \
                chr(self.PIBuffer[index + 2]) == 'n' and chr(self.PIBuffer[index + 3]) == 't':
                if chr(self.PIBuffer[index + 4]) == '?':
                    str = 'vCont;c;C;s;S'
                    self._put_packet(self._str_to_buf(str), len(str))
                elif chr(self.PIBuffer[index + 4]) == ';' and chr(self.PIBuffer[index + 5]) == 'c':
                    global_env.STEPPING = False
                    global_env.dbg_event.set()
                elif chr(self.PIBuffer[index + 4]) == ';' and chr(self.PIBuffer[index + 5]) == 's':
                    global_env.STEPPING = True
                    global_env.dbg_event.set()
        elif ch == 'k':
            logger.critical("Makkah: Terminated via GDBstub")
            global_env.stop_all()
            global_env.dbg_event.set()
        else:
            unknown_command()

        return GDBStates['RS_IDLE']