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