1872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes/* 2872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * Copyright (C) 2008 The Android Open Source Project 3872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * 4872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * you may not use this file except in compliance with the License. 6872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * You may obtain a copy of the License at 7872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * 8872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * 10872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * Unless required by applicable law or agreed to in writing, software 11872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * See the License for the specific language governing permissions and 14872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * limitations under the License. 15872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes */ 16872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes/* 17872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * JDWP internal interfaces. 18872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes */ 19fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_JDWP_JDWP_PRIV_H_ 20fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_JDWP_JDWP_PRIV_H_ 21872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 22872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes#include "debugger.h" 23872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes#include "jdwp/jdwp.h" 24872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes#include "jdwp/jdwp_event.h" 25872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 26872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes#include <pthread.h> 27872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes#include <sys/uio.h> 28872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 29872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes/* 30872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes * JDWP constants. 31872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes */ 32cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderSizeOffset = 0U; 33cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderIdOffset = 4U; 34cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderFlagsOffset = 8U; 35cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderErrorCodeOffset = 9U; 36cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderCmdSetOffset = 9U; 37cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderCmdOffset = 10U; 38cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kJDWPHeaderLen = 11U; 39cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPFlagReply = 0x80; 40872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 41cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr const char kMagicHandshake[] = "JDWP-Handshake"; 42cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr size_t kMagicHandshakeLen = sizeof(kMagicHandshake) - 1; 43cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertz 44cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertz/* Invoke commands */ 45cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPClassTypeCmdSet = 3U; 46cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPClassTypeInvokeMethodCmd = 3U; 47cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPClassTypeNewInstanceCmd = 4U; 4870fa1a5497c057eecf336c60975fbca015f8aebdAlex Lightstatic constexpr uint8_t kJDWPInterfaceTypeCmdSet = 5U; 4970fa1a5497c057eecf336c60975fbca015f8aebdAlex Lightstatic constexpr uint8_t kJDWPInterfaceTypeInvokeMethodCmd = 1U; 50cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPObjectReferenceCmdSet = 9U; 51cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPObjectReferenceInvokeCmd = 6U; 52cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertz 53cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertz/* Event command */ 54cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPEventCmdSet = 64U; 55cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPEventCompositeCmd = 100U; 56748474146da0c6484fa3dca0a700f612d47550c3Elliott Hughes 57872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes/* DDM support */ 58cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPDdmCmdSet = 199U; // 0xc7, or 'G'+128 59cbc5064ff05179b97b416f00ca579c55e38cd7d9Sebastien Hertzstatic constexpr uint8_t kJDWPDdmCmd = 1U; 60872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 61872d4ec7225444d9400d30f9027247deb91012fdElliott Hughesnamespace art { 62872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 63872d4ec7225444d9400d30f9027247deb91012fdElliott Hughesnamespace JDWP { 64872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 65872d4ec7225444d9400d30f9027247deb91012fdElliott Hughesstruct JdwpState; 66872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 675d10a87ea630b22180d3731018a70b77270c726eElliott Hughesbool InitSocketTransport(JdwpState*, const JdwpOptions*); 685d10a87ea630b22180d3731018a70b77270c726eElliott Hughesbool InitAdbTransport(JdwpState*, const JdwpOptions*); 69872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 70872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes/* 7168a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes * Base class for the adb and socket JdwpNetState implementations. 72872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes */ 73872d4ec7225444d9400d30f9027247deb91012fdElliott Hughesclass JdwpNetStateBase { 74f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes public: 7593ba893c20532990a430741e0a97212900094e8cBrian Carlstrom explicit JdwpNetStateBase(JdwpState*); 765d10a87ea630b22180d3731018a70b77270c726eElliott Hughes virtual ~JdwpNetStateBase(); 77cb69306eefc1e6e42b3eaec8b479a268222b01b6Elliott Hughes 785d10a87ea630b22180d3731018a70b77270c726eElliott Hughes virtual bool Accept() = 0; 795d10a87ea630b22180d3731018a70b77270c726eElliott Hughes virtual bool Establish(const JdwpOptions*) = 0; 805d10a87ea630b22180d3731018a70b77270c726eElliott Hughes virtual void Shutdown() = 0; 815d10a87ea630b22180d3731018a70b77270c726eElliott Hughes virtual bool ProcessIncoming() = 0; 8268a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 83cb69306eefc1e6e42b3eaec8b479a268222b01b6Elliott Hughes void ConsumeBytes(size_t byte_count); 8468a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 8568a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes bool IsConnected(); 8668a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 8768a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes bool IsAwaitingHandshake(); 8868a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 8968a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes void Close(); 9068a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 9190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier ssize_t WritePacket(ExpandBuf* pReply, size_t length) REQUIRES(!socket_lock_); 9290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier ssize_t WriteBufferedPacket(const std::vector<iovec>& iov) REQUIRES(!socket_lock_); 93ad466adf38db74a9840659626858196091151a64Mathieu Chartier Mutex* GetSocketLock() { 94ad466adf38db74a9840659626858196091151a64Mathieu Chartier return &socket_lock_; 95ad466adf38db74a9840659626858196091151a64Mathieu Chartier } 96ad466adf38db74a9840659626858196091151a64Mathieu Chartier ssize_t WriteBufferedPacketLocked(const std::vector<iovec>& iov); 97872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 987934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom int clientSock; // Active connection to debugger. 995d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1007934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom int wake_pipe_[2]; // Used to break out of select. 1015d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1025d10a87ea630b22180d3731018a70b77270c726eElliott Hughes uint8_t input_buffer_[8192]; 1035d10a87ea630b22180d3731018a70b77270c726eElliott Hughes size_t input_count_; 1045d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1055d10a87ea630b22180d3731018a70b77270c726eElliott Hughes protected: 1065d10a87ea630b22180d3731018a70b77270c726eElliott Hughes bool HaveFullPacket(); 1075d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1085d10a87ea630b22180d3731018a70b77270c726eElliott Hughes bool MakePipe(); 1095d10a87ea630b22180d3731018a70b77270c726eElliott Hughes void WakePipe(); 1105d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1115d10a87ea630b22180d3731018a70b77270c726eElliott Hughes void SetAwaitingHandshake(bool new_state); 1125d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 1135d10a87ea630b22180d3731018a70b77270c726eElliott Hughes JdwpState* state_; 1145d10a87ea630b22180d3731018a70b77270c726eElliott Hughes 115f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes private: 116f8349361a16a4e2796efe9f3586b994e8d4834e4Elliott Hughes // Used to serialize writes to the socket. 117872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes Mutex socket_lock_; 11868a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes 11968a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes // Are we waiting for the JDWP handshake? 12068a5e3c9115f9ba396563ce3b72df9cb036bc665Elliott Hughes bool awaiting_handshake_; 121872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes}; 122872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 123872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes} // namespace JDWP 124872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 125872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes} // namespace art 126872d4ec7225444d9400d30f9027247deb91012fdElliott Hughes 127fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_JDWP_JDWP_PRIV_H_ 128