[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 05/46] windbg: added helper features
From: |
Ladi Prosek |
Subject: |
Re: [Qemu-devel] [PATCH v4 05/46] windbg: added helper features |
Date: |
Thu, 14 Dec 2017 13:13:56 +0100 |
On Mon, Dec 11, 2017 at 2:21 PM, Mihail Abakumov
<address@hidden> wrote:
> Added some helper features for windbgstub.
>
> Signed-off-by: Mihail Abakumov <address@hidden>
> Signed-off-by: Pavel Dovgalyuk <address@hidden>
> Signed-off-by: Dmitriy Koltunov <address@hidden>
> ---
> include/exec/windbgstub-utils.h | 31 +++++++++++++++++++++++++++++++
> include/exec/windbgstub.h | 6 ++++++
> 2 files changed, 37 insertions(+)
>
> diff --git a/include/exec/windbgstub-utils.h b/include/exec/windbgstub-utils.h
> index 2390597f1f..4c747fa23e 100755
> --- a/include/exec/windbgstub-utils.h
> +++ b/include/exec/windbgstub-utils.h
> @@ -13,7 +13,38 @@
> #define WINDBGSTUB_UTILS_H
>
> #include "qemu/osdep.h"
> +#include "qemu/error-report.h"
> +#include "log.h"
> +#include "cpu.h"
> #include "exec/windbgstub.h"
> #include "exec/windbgkd.h"
>
> +#define WINDBG_DEBUG(...) do { \
> + if (WINDBG_DEBUG_ON) { \
> + qemu_log(WINDBG ": " __VA_ARGS__); \
> + qemu_log("\n"); \
> + } \
> +} while (false)
> +
> +#define WINDBG_ERROR(...) error_report(WINDBG ": " __VA_ARGS__)
> +
> +#define FMT_ADDR "addr:0x" TARGET_FMT_lx
> +#define FMT_ERR "Error:%d"
> +
> +#define UINT8_P(ptr) ((uint8_t *) (ptr))
> +#define PTR(var) UINT8_P(&var)
> +
> +#define sizeof_field(type, field) sizeof(((type *) NULL)->field)
> +
> +#define READ_VMEM(cpu, addr, type) ({ \
> + type _t; \
> + cpu_memory_rw_debug(cpu, addr, PTR(_t), sizeof(type), 0); \
> + _t; \
> +})
> +
> +typedef struct SizedBuf {
> + uint8_t *data;
> + size_t size;
> +} SizedBuf;
> +
Ah, I thought you'd remove it completely. I was thinking about
something like this (patch on top of your series):
diff --git a/include/exec/windbgstub-utils.h
b/include/exec/windbgstub-utils.h
index d3e737e031..ece1c8ce60 100755
--- a/include/exec/windbgstub-utils.h
+++ b/include/exec/windbgstub-utils.h
@@ -50,11 +50,6 @@
# define ldtul_p(p) ldl_p(p)
#endif
-typedef struct SizedBuf {
- uint8_t *data;
- size_t size;
-} SizedBuf;
-
typedef struct InitedAddr {
target_ulong addr;
bool is_init;
@@ -97,8 +92,8 @@ void kd_api_query_memory(CPUState *cpu, PacketData
*pd);
void kd_api_get_context_ex(CPUState *cpu, PacketData *pd);
void kd_api_set_context_ex(CPUState *cpu, PacketData *pd);
-SizedBuf kd_gen_exception_sc(CPUState *cpu);
-SizedBuf kd_gen_load_symbols_sc(CPUState *cpu);
+void kd_gen_exception_sc(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE
*sc);
+void kd_gen_load_symbols_sc(CPUState *cpu,
DBGKD_ANY_WAIT_STATE_CHANGE *sc);
bool windbg_on_load(void);
diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c
index c38bfa7448..6c42b95fe9 100755
--- a/target/i386/windbgstub.c
+++ b/target/i386/windbgstub.c
@@ -1184,40 +1184,25 @@ static void kd_init_state_change(CPUState
*cpu,
}
}
-SizedBuf kd_gen_exception_sc(CPUState *cpu)
+void kd_gen_exception_sc(CPUState *cpu, DBGKD_ANY_WAIT_STATE_CHANGE
*sc)
{
CPUArchState *env = cpu->env_ptr;
- DBGKD_ANY_WAIT_STATE_CHANGE *sc;
DBGKM_EXCEPTION_RECORD64 *exc;
- SizedBuf buf;
- buf.size = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE) + sizeof(int);
- buf.data = g_malloc0(buf.size);
- sc = (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data;
exc = &sc->u.Exception.ExceptionRecord;
kd_init_state_change(cpu, sc);
stl_p(&sc->NewState, DbgKdExceptionStateChange);
stl_p(&exc->ExceptionCode, 0x80000003);
sttul_p(&exc->ExceptionAddress, env->eip);
-
- return buf;
}
-SizedBuf kd_gen_load_symbols_sc(CPUState *cpu)
+void kd_gen_load_symbols_sc(CPUState *cpu,
DBGKD_ANY_WAIT_STATE_CHANGE *sc)
{
- DBGKD_ANY_WAIT_STATE_CHANGE *sc;
- SizedBuf buf;
-
- buf.size = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
- buf.data = g_malloc0(buf.size);
- sc = (DBGKD_ANY_WAIT_STATE_CHANGE *) buf.data;
kd_init_state_change(cpu, sc);
stl_p(&sc->NewState, DbgKdLoadSymbolsStateChange);
stl_p(&sc->u.LoadSymbols.PathNameLength, 0);
-
- return buf;
}
#endif
diff --git a/windbgstub.c b/windbgstub.c
index a458b962de..d8712af103 100755
--- a/windbgstub.c
+++ b/windbgstub.c
@@ -117,9 +117,15 @@ static void windbg_send_control_packet(uint16_t
type)
static void windbg_bp_handler(CPUState *cpu)
{
- SizedBuf buf = kd_gen_exception_sc(cpu);
- windbg_send_data_packet(buf.data, buf.size,
PACKET_TYPE_KD_STATE_CHANGE64);
- g_free(buf.data);
+ struct {
+ DBGKD_ANY_WAIT_STATE_CHANGE sc;
+ int extra;
+ } sc_with_extra;
+
+ memset(&sc_with_extra, 0, sizeof(sc_with_extra));
+ kd_gen_exception_sc(cpu, &sc_with_extra.sc);
+ windbg_send_data_packet((uint8_t *)&sc_with_extra,
sizeof(sc_with_extra),
+ PACKET_TYPE_KD_STATE_CHANGE64);
}
static void windbg_vm_stop(void)
@@ -264,6 +270,8 @@ static void
windbg_process_data_packet(ParsingContext *ctx)
static void windbg_process_control_packet(ParsingContext *ctx)
{
+ DBGKD_ANY_WAIT_STATE_CHANGE sc;
+
switch (ctx->packet.PacketType) {
case PACKET_TYPE_KD_ACKNOWLEDGE:
break;
@@ -273,10 +281,10 @@ static void
windbg_process_control_packet(ParsingContext *ctx)
windbg_send_control_packet(ctx->packet.PacketType);
windbg_state->ctrl_packet_id = INITIAL_PACKET_ID;
- SizedBuf buf = kd_gen_load_symbols_sc(qemu_get_cpu(0));
- windbg_send_data_packet(buf.data, buf.size,
+ memset(&sc, 0, sizeof(sc));
+ kd_gen_load_symbols_sc(qemu_get_cpu(0), &sc);
+ windbg_send_data_packet((uint8_t *)&sc, sizeof(sc),
PACKET_TYPE_KD_STATE_CHANGE64);
- g_free(buf.data);
break;
}
default:
> #endif
> diff --git a/include/exec/windbgstub.h b/include/exec/windbgstub.h
> index 1a6e1cc6e5..21bc552e58 100755
> --- a/include/exec/windbgstub.h
> +++ b/include/exec/windbgstub.h
> @@ -12,6 +12,12 @@
> #ifndef WINDBGSTUB_H
> #define WINDBGSTUB_H
>
> +#define WINDBG "windbg"
> +
> +#ifndef WINDBG_DEBUG_ON
> +#define WINDBG_DEBUG_ON false
> +#endif
> +
> int windbg_server_start(const char *device);
>
> #endif
>
- [Qemu-devel] [PATCH v4 00/46] Windbg supporting, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 01/46] windbg: added empty windbgstub files, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 02/46] windbg: added windbg's KD header file, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 03/46] windbg: modified windbgkd.h, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 04/46] windbg: added '-windbg' option, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 05/46] windbg: added helper features, Mihail Abakumov, 2017/12/11
- Re: [Qemu-devel] [PATCH v4 05/46] windbg: added helper features,
Ladi Prosek <=
- [Qemu-devel] [PATCH v4 06/46] windbg: added WindbgState, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 07/46] windbg: added chardev, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 08/46] windbg: hook to wrmsr operation, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 09/46] windbg: handler of fs/gs register, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 10/46] windbg: structures for parsing data stream, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 11/46] windbg: parsing data stream, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 12/46] windbg: send data and control packets, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 13/46] windbg: handler of parsing context, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 14/46] windbg: init DBGKD_ANY_WAIT_STATE_CHANGE, Mihail Abakumov, 2017/12/11
- [Qemu-devel] [PATCH v4 15/46] windbg: generate ExceptionStateChange, Mihail Abakumov, 2017/12/11