Message ID | 151127329238.6888.17213631612102603209.stgit@Misha-PC.lan02.inno (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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;