diff mbox

[v3,10/45] windbg: structures for parsing data stream

Message ID 151127329238.6888.17213631612102603209.stgit@Misha-PC.lan02.inno (mailing list archive)
State New, archived
Headers show

Commit Message

Mikhail Abakumov Nov. 21, 2017, 2:08 p.m. UTC
Added structures for parsing data stream from windbg to packet.

Signed-off-by: Mihail Abakumov <mikhail.abakumov@ispras.ru>
Signed-off-by: Pavel Dovgalyuk <dovgaluk@ispras.ru>
Signed-off-by: Dmitriy Koltunov <koltunov@ispras.ru>
---
 include/exec/windbgstub-utils.h |   11 +++++++++++
 windbgstub.c                    |   30 ++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

Comments

Ladi Prosek Nov. 28, 2017, 1:45 p.m. UTC | #1
On Tue, Nov 21, 2017 at 3:08 PM, Mihail Abakumov
<mikhail.abakumov@ispras.ru> wrote:
> Added structures for parsing data stream from windbg to packet.
>
> Signed-off-by: Mihail Abakumov <mikhail.abakumov@ispras.ru>
> Signed-off-by: Pavel Dovgalyuk <dovgaluk@ispras.ru>
> Signed-off-by: Dmitriy Koltunov <koltunov@ispras.ru>
> ---
>  include/exec/windbgstub-utils.h |   11 +++++++++++
>  windbgstub.c                    |   30 ++++++++++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
>
> diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h
> index 42dbca1e22..2d74fb847a 100755
> --- a/include/exec/windbgstub-utils.h
> +++ b/include/exec/windbgstub-utils.h
> @@ -48,6 +48,17 @@ typedef struct InitedAddr {
>      bool is_init;
>  } InitedAddr;
>
> +typedef struct PacketData {
> +    union {
> +        struct {
> +            DBGKD_MANIPULATE_STATE64 m64;
> +            uint8_t extra[PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)];

nit:
  uint8_t extra[0];

The buf field below already defines the size and in a more readable way.

> +        };
> +        uint8_t buf[PACKET_MAX_SIZE];
> +    };
> +    uint16_t extra_size;
> +} PacketData;
> +
>  InitedAddr *windbg_get_KPCR(void);
>  InitedAddr *windbg_get_version(void);
>
> diff --git a/windbgstub.c b/windbgstub.c
> index e9aabd807b..395f244d4f 100755
> --- a/windbgstub.c
> +++ b/windbgstub.c
> @@ -19,6 +19,36 @@
>  #include "sysemu/kvm.h"
>  #include "sysemu/reset.h"
>
> +typedef enum ParsingState {
> +    STATE_LEADER,
> +    STATE_PACKET_TYPE,
> +    STATE_PACKET_BYTE_COUNT,
> +    STATE_PACKET_ID,
> +    STATE_PACKET_CHECKSUM,
> +    STATE_PACKET_DATA,
> +    STATE_TRAILING_BYTE,
> +} ParsingState;
> +
> +typedef enum ParsingResult {
> +    RESULT_NONE,
> +    RESULT_BREAKIN_BYTE,
> +    RESULT_UNKNOWN_PACKET,
> +    RESULT_CONTROL_PACKET,
> +    RESULT_DATA_PACKET,
> +    RESULT_ERROR,
> +} ParsingResult;
> +
> +typedef struct ParsingContext {
> +    /* index in the current buffer,
> +       which depends on the current state */
> +    int index;
> +    ParsingState state;
> +    ParsingResult result;
> +    KD_PACKET packet;
> +    PacketData data;
> +    const char *name;
> +} ParsingContext;
> +
>  typedef struct WindbgState {
>      bool is_loaded;
>
>
diff mbox

Patch

diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h
index 42dbca1e22..2d74fb847a 100755
--- a/include/exec/windbgstub-utils.h
+++ b/include/exec/windbgstub-utils.h
@@ -48,6 +48,17 @@  typedef struct InitedAddr {
     bool is_init;
 } InitedAddr;
 
+typedef struct PacketData {
+    union {
+        struct {
+            DBGKD_MANIPULATE_STATE64 m64;
+            uint8_t extra[PACKET_MAX_SIZE - sizeof(DBGKD_MANIPULATE_STATE64)];
+        };
+        uint8_t buf[PACKET_MAX_SIZE];
+    };
+    uint16_t extra_size;
+} PacketData;
+
 InitedAddr *windbg_get_KPCR(void);
 InitedAddr *windbg_get_version(void);
 
diff --git a/windbgstub.c b/windbgstub.c
index e9aabd807b..395f244d4f 100755
--- a/windbgstub.c
+++ b/windbgstub.c
@@ -19,6 +19,36 @@ 
 #include "sysemu/kvm.h"
 #include "sysemu/reset.h"
 
+typedef enum ParsingState {
+    STATE_LEADER,
+    STATE_PACKET_TYPE,
+    STATE_PACKET_BYTE_COUNT,
+    STATE_PACKET_ID,
+    STATE_PACKET_CHECKSUM,
+    STATE_PACKET_DATA,
+    STATE_TRAILING_BYTE,
+} ParsingState;
+
+typedef enum ParsingResult {
+    RESULT_NONE,
+    RESULT_BREAKIN_BYTE,
+    RESULT_UNKNOWN_PACKET,
+    RESULT_CONTROL_PACKET,
+    RESULT_DATA_PACKET,
+    RESULT_ERROR,
+} ParsingResult;
+
+typedef struct ParsingContext {
+    /* index in the current buffer,
+       which depends on the current state */
+    int index;
+    ParsingState state;
+    ParsingResult result;
+    KD_PACKET packet;
+    PacketData data;
+    const char *name;
+} ParsingContext;
+
 typedef struct WindbgState {
     bool is_loaded;