RNBRemote.h revision bcf07b37b3e3cd37ac74cc42c12009f130f185a3
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- RNBRemote.h ---------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Created by Greg Clayton on 12/12/07.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __RNBRemote_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __RNBRemote_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBDefs.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNB.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBContext.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBSocket.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadMutex.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <deque>
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBSocket;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBContext;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass PThreadEvents;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerenum event_loop_mode { debug_nub, gdb_remote_protocol, done };
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBRemote
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum {
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        invalid_packet = 0,
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ack,                            // '+'
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        nack,                           // '-'
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        halt,                           // ^C  (async halt)
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        use_extended_mode,              // '!'
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        why_halted,                     // '?'
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_argv,                       // 'A'
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_bp,                         // 'B'
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cont,                           // 'c'
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        continue_with_sig,              // 'C'
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        detach,                         // 'D'
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        read_general_regs,              // 'g'
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        write_general_regs,             // 'G'
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_thread,                     // 'H'
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        step_inferior_one_cycle,        // 'i'
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        signal_and_step_inf_one_cycle,  // 'I'
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kill,                           // 'k'
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        read_memory,                    // 'm'
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        write_memory,                   // 'M'
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        read_register,                  // 'p'
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        write_register,                 // 'P'
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        restart,                        // 'R'
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        single_step,                    // 's'
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        single_step_with_sig,           // 'S'
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        search_mem_backwards,           // 't'
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        thread_alive_p,                 // 'T'
64c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton        vattach,                        // 'vAttach;pid'
65c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton        vattachwait,                    // 'vAttachWait:XX...' where XX is one or more hex encoded process name ASCII bytes
66c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton        vattachname,                    // 'vAttachName:XX...' where XX is one or more hex encoded process name ASCII bytes
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        vcont,                          // 'vCont'
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        vcont_list_actions,             // 'vCont?'
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        write_data_to_memory,           // 'X'
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        insert_mem_bp,                  // 'Z0'
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        remove_mem_bp,                  // 'z0'
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        insert_hardware_bp,             // 'Z1'
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        remove_hardware_bp,             // 'z1'
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        insert_write_watch_bp,          // 'Z2'
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        remove_write_watch_bp,          // 'z2'
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        insert_read_watch_bp,           // 'Z3'
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        remove_read_watch_bp,           // 'z3'
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        insert_access_watch_bp,         // 'Z4'
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        remove_access_watch_bp,         // 'z4'
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_current_thread_id,        // 'qC'
82d05213b79411eb12bcd75f07d33f5245c07edb0dJason Molenda        query_get_pid,                  // 'qGetPid'
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_memory_crc,               // 'qCRC:'
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_thread_ids_first,         // 'qfThreadInfo'
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_thread_ids_subsequent,    // 'qsThreadInfo'
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_thread_extra_info,        // 'qThreadExtraInfo'
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_thread_stop_info,         // 'qThreadStopInfo'
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_image_offsets,            // 'qOffsets'
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_symbol_lookup,            // 'gSymbols'
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_launch_success,           // 'qLaunchSuccess'
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_register_info,            // 'qRegisterInfo'
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_shlib_notify_info_addr,   // 'qShlibInfoAddr'
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_step_packet_supported,    // 'qStepPacketSupported'
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        query_host_info,                // 'qHostInfo'
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pass_signals_to_inferior,       // 'QPassSignals'
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        start_noack_mode,               // 'QStartNoAckMode'
97c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton        prefix_reg_packets_with_tid,    // 'QPrefixRegisterPacketsWithThreadID
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_logging_mode,               // 'QSetLogging:'
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_max_packet_size,            // 'QSetMaxPacketSize:'
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_max_payload_size,           // 'QSetMaxPayloadSize:'
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        set_environment_variable,       // 'QEnvironment:'
10204f081d0572d046456009ce8273ab2ff0a985219Jason Molenda        set_environment_variable_hex,   // 'QEnvironmentHexEncoded:'
103a4582404fa50f89485e69a17281673147217d64fGreg Clayton        set_launch_arch,                // 'QLaunchArch:'
1040a7f75f9e375911ca91a884968b0efa36f18588dGreg Clayton        set_disable_aslr,               // 'QSetDisableASLR:'
105a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton        set_stdin,                      // 'QSetSTDIN:'
106a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton        set_stdout,                     // 'QSetSTDOUT:'
107a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton        set_stderr,                     // 'QSetSTDERR:'
108a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton        set_working_dir,                // 'QSetWorkingDir:'
109bcf07b37b3e3cd37ac74cc42c12009f130f185a3Jason Molenda        memory_region_info,             // 'qMemoryRegionInfo:'
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        allocate_memory,                // '_M'
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        deallocate_memory,              // '_m'
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        unknown_type,
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } PacketEnum;
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef rnb_err_t (RNBRemote::*HandlePacketCallback)(const char *p);
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    RNBRemote ();
11920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    ~RNBRemote ();
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    void            Initialize();
12220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
12320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    bool            InitializeRegisters ();
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t       HandleAsyncPacket(PacketEnum *type = NULL);
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t       HandleReceivedPacket(PacketEnum *type = NULL);
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    nub_thread_t    GetContinueThread () const
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return m_continue_thread;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void            SetContinueThread (nub_thread_t tid)
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_continue_thread = tid;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    nub_thread_t    GetCurrentThread () const
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (m_thread == 0 || m_thread == -1)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return DNBProcessGetCurrentThread (m_ctx.ProcessID());
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return m_thread;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void            SetCurrentThread (nub_thread_t tid)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        DNBProcessSetCurrentThread (m_ctx.ProcessID(), tid);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        m_thread = tid;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void*    ThreadFunctionReadRemoteData(void *arg);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void            StartReadRemoteDataThread ();
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void            StopReadRemoteDataThread ();
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void NotifyThatProcessStopped (void);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_A (const char *p);
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_H (const char *p);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qC (const char *p);
160d05213b79411eb12bcd75f07d33f5245c07edb0dJason Molenda    rnb_err_t HandlePacket_qGetPid (const char *p);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qLaunchSuccess (const char *p);
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qRegisterInfo (const char *p);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qShlibInfoAddr (const char *p);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qStepPacketSupported (const char *p);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qThreadInfo (const char *p);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qThreadExtraInfo (const char *p);
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qThreadStopInfo (const char *p);
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_qHostInfo (const char *p);
169c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QStartNoAckMode (const char *p);
170c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QThreadSuffixSupported (const char *p);
171c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QSetLogging (const char *p);
172c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QSetDisableASLR (const char *p);
173a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    rnb_err_t HandlePacket_QSetSTDIO (const char *p);
174a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    rnb_err_t HandlePacket_QSetWorkingDir (const char *p);
175c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QSetMaxPayloadSize (const char *p);
176c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QSetMaxPacketSize (const char *p);
177c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QEnvironment (const char *p);
17804f081d0572d046456009ce8273ab2ff0a985219Jason Molenda    rnb_err_t HandlePacket_QEnvironmentHexEncoded (const char *p);
179a4582404fa50f89485e69a17281673147217d64fGreg Clayton    rnb_err_t HandlePacket_QLaunchArch (const char *p);
180c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    rnb_err_t HandlePacket_QPrefixRegisterPacketsWithThreadID (const char *p);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_last_signal (const char *p);
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_m (const char *p);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_M (const char *p);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_X (const char *p);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_g (const char *p);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_G (const char *p);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_z (const char *p);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_T (const char *p);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_p (const char *p);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_P (const char *p);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_c (const char *p);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_C (const char *p);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_D (const char *p);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_k (const char *p);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_s (const char *p);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_S (const char *p);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_v (const char *p);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_UNIMPLEMENTED (const char *p);
199db2bab463047edba4b01da1fcaf70f15e778095eGreg Clayton    rnb_err_t HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_AllocateMemory (const char *p);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_DeallocateMemory (const char *p);
202bcf07b37b3e3cd37ac74cc42c12009f130f185a3Jason Molenda    rnb_err_t HandlePacket_MemoryRegionInfo (const char *p);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t HandlePacket_stop_process (const char *p);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t SendStopReplyPacketForThread (nub_thread_t tid);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t SendSTDOUTPacket (char *buf, nub_size_t buf_size);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t SendSTDERRPacket (char *buf, nub_size_t buf_size);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void      FlushSTDIO ();
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RNBContext&     Context() { return m_ctx; }
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RNBSocket&      Comm() { return m_comm; }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    void
216a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    SetUseNativeRegisters (bool b)
217a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    {
218a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton        m_use_native_regs = b;
219a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton    }
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Outlaw some contructors
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RNBRemote (const RNBRemote &);
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t GetCommData ();
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void CommDataReceived(const std::string& data);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Packet
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef std::vector<Packet>         collection;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::iterator        iterator;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::const_iterator  const_iterator;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PacketEnum type;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        HandlePacketCallback normal;    // Function to call when inferior is halted
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        HandlePacketCallback async;     // Function to call when inferior is running
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string abbrev;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string printable_name;
2384fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton
2394fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        bool
2404fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        IsPlatformPacket () const
2414fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        {
2424fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            switch (type)
2434fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            {
2444fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            case set_logging_mode:
2454fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            case query_host_info:
2464fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton                return true;
247e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton            default:
248e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton                    break;
2494fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            }
2504fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            return false;
2514fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton        }
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Packet() :
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            type(invalid_packet),
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            normal (NULL),
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            async (NULL),
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            abbrev (),
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            printable_name ()
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Packet( PacketEnum in_type,
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                HandlePacketCallback in_normal,
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                HandlePacketCallback in_async,
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *in_abbrev,
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const char *in_printable_name) :
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            type    (in_type),
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            normal  (in_normal),
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            async   (in_async),
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            abbrev  (in_abbrev),
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            printable_name (in_printable_name)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t       GetPacket (std::string &packet_data, RNBRemote::Packet& packet_info, bool wait);
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t       SendPacket (const std::string &);
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void CreatePacketTable ();
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    rnb_err_t GetPacketPayload (std::string &);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
281c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    nub_thread_t
282c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton    ExtractThreadIDFromThreadSuffix (const char *p);
283c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // gdb can send multiple Z/z packets for the same address and
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // these calls must be ref counted.
286fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen    struct Breakpoint
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Breakpoint(nub_break_t breakID) :
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_breakID(breakID),
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_refCount(1)
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Breakpoint() :
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_breakID(INVALID_NUB_BREAK_ID),
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_refCount(0)
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Breakpoint(const Breakpoint& rhs) :
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_breakID(rhs.m_breakID),
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_refCount(rhs.m_refCount)
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        nub_break_t BreakID() const { return m_breakID; }
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t RefCount() const { return m_refCount; }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Release() { if (m_refCount > 0) --m_refCount; }
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void Retain() { ++m_refCount; }
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        nub_break_t m_breakID;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t m_refCount;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::map<nub_addr_t, Breakpoint> BreakpointMap;
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef BreakpointMap::iterator          BreakpointMapIter;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef BreakpointMap::const_iterator    BreakpointMapConstIter;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RNBContext      m_ctx;              // process context
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RNBSocket       m_comm;             // communication port
31920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    std::string     m_arch;
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    nub_thread_t    m_continue_thread;  // thread to continue; 0 for any, -1 for all
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    nub_thread_t    m_thread;           // thread for other ops; 0 for any, -1 for all
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PThreadMutex    m_mutex;            // Mutex that protects
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t        m_packets_recvd;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Packet::collection m_packets;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::deque<std::string> m_rx_packets;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string     m_rx_partial_data;  // For packets that may come in more than one batch, anything left over can be left here
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    pthread_t       m_rx_pthread;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointMap   m_breakpoints;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BreakpointMap   m_watchpoints;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t        m_max_payload_size;  // the maximum sized payload we should send to gdb
33120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    bool            m_extended_mode:1,   // are we in extended mode?
33220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    m_noack_mode:1,      // are we in no-ack mode?
333c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                    m_noack_mode_just_enabled:1, // Did we just enable this and need to compute one more checksum?
334c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                    m_use_native_regs:1, // Use native registers by querying DNB layer for register definitions?
335c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                    m_thread_suffix_supported:1; // Set to true if the 'p', 'P', 'g', and 'G' packets should be prefixed with the thread ID and colon:
336c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                                                                // "$pRR;thread:TTTT;" instead of "$pRR"
337c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                                                                // "$PRR=VVVVVVVV;thread:TTTT;" instead of "$PRR=VVVVVVVV"
338c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                                                                // "$g;thread:TTTT" instead of "$g"
339c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton                                                                // "$GVVVVVVVVVVVVVV;thread:TTTT;#00 instead of "$GVVVVVVVVVVVVVV"
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/* We translate the /usr/include/mach/exception_types.h exception types
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS).  These hard
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   values in its include/gdb/signals.h.  */
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BAD_ACCESS      0x91
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BAD_INSTRUCTION 0x92
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_ARITHMETIC      0x93
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_EMULATION       0x94
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_SOFTWARE        0x95
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BREAKPOINT      0x96
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/* Generally speaking, you can't assume gdb can receive more than 399 bytes
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   at a time with a random gdb.  This bufsize constant is only specifying
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   how many bytes gdb can *receive* from debugserver -- it tells us nothing
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   about how many bytes gdb might try to send in a single packet.  */
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEFAULT_GDB_REMOTE_PROTOCOL_BUFSIZE 399
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef __RNBRemote_h__
362