@@ -13,7 +13,47 @@
#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 DPRINTF(fmt, ...) \
+ do { \
+ if (WINDBG_DPRINT) { \
+ qemu_log("windbg: " fmt, ##__VA_ARGS__); \
+ } \
+ } while (0)
+
+#define WINDBG_ERROR(...) error_report("windbg: " __VA_ARGS__)
+
+#define FMT_ADDR "addr:0x" TARGET_FMT_lx
+#define FMT_ERR "Error:%d"
+
+#define PTR(var) ((uint8_t *) (&var))
+
+#define VMEM_ADDR(cpu, addr) \
+ ({ \
+ target_ulong _addr; \
+ cpu_memory_rw_debug(cpu, addr, PTR(_addr), sizeof(target_ulong), 0); \
+ ldtul_p(&_addr); \
+ })
+
+#if TARGET_LONG_BITS == 64
+#define sttul_p(p, v) stq_p(p, v)
+#define ldtul_p(p) ldq_p(p)
+#else
+#define sttul_p(p, v) stl_p(p, v)
+#define ldtul_p(p) ldl_p(p)
+#endif
+
+typedef struct InitedAddr {
+ target_ulong addr;
+ bool is_init;
+} InitedAddr;
+
+const char *kd_api_name(int id);
+const char *kd_pkt_type_name(int id);
+
#endif /* WINDBGSTUB_UTILS_H */
@@ -12,6 +12,12 @@
#ifndef WINDBGSTUB_H
#define WINDBGSTUB_H
+#ifdef DEBUG_WINDBG
+#define WINDBG_DPRINT true
+#else
+#define WINDBG_DPRINT false
+#endif
+
int windbg_server_start(const char *device);
#endif /* WINDBGSTUB_H */
@@ -10,3 +10,86 @@
*/
#include "exec/windbgstub-utils.h"
+
+static const char *kd_api_names[] = {
+ "DbgKdReadVirtualMemoryApi",
+ "DbgKdWriteVirtualMemoryApi",
+ "DbgKdGetContextApi",
+ "DbgKdSetContextApi",
+ "DbgKdWriteBreakPointApi",
+ "DbgKdRestoreBreakPointApi",
+ "DbgKdContinueApi",
+ "DbgKdReadControlSpaceApi",
+ "DbgKdWriteControlSpaceApi",
+ "DbgKdReadIoSpaceApi",
+ "DbgKdWriteIoSpaceApi",
+ "DbgKdRebootApi",
+ "DbgKdContinueApi2",
+ "DbgKdReadPhysicalMemoryApi",
+ "DbgKdWritePhysicalMemoryApi",
+ "DbgKdQuerySpecialCallsApi",
+ "DbgKdSetSpecialCallApi",
+ "DbgKdClearSpecialCallsApi",
+ "DbgKdSetInternalBreakPointApi",
+ "DbgKdGetInternalBreakPointApi",
+ "DbgKdReadIoSpaceExtendedApi",
+ "DbgKdWriteIoSpaceExtendedApi",
+ "DbgKdGetVersionApi",
+ "DbgKdWriteBreakPointExApi",
+ "DbgKdRestoreBreakPointExApi",
+ "DbgKdCauseBugCheckApi",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "DbgKdSwitchProcessor",
+ "DbgKdPageInApi",
+ "DbgKdReadMachineSpecificRegister",
+ "DbgKdWriteMachineSpecificRegister",
+ "OldVlm1",
+ "OldVlm2",
+ "DbgKdSearchMemoryApi",
+ "DbgKdGetBusDataApi",
+ "DbgKdSetBusDataApi",
+ "DbgKdCheckLowMemoryApi",
+ "DbgKdClearAllInternalBreakpointsApi",
+ "DbgKdFillMemoryApi",
+ "DbgKdQueryMemoryApi",
+ "DbgKdSwitchPartition",
+ "DbgKdWriteCustomBreakpointApi",
+ "DbgKdGetContextExApi",
+ "DbgKdSetContextExApi",
+ "DbgKdUnknownApi",
+};
+
+static const char *kd_packet_type_names[] = {
+ "PACKET_TYPE_UNUSED",
+ "PACKET_TYPE_KD_STATE_CHANGE32",
+ "PACKET_TYPE_KD_STATE_MANIPULATE",
+ "PACKET_TYPE_KD_DEBUG_IO",
+ "PACKET_TYPE_KD_ACKNOWLEDGE",
+ "PACKET_TYPE_KD_RESEND",
+ "PACKET_TYPE_KD_RESET",
+ "PACKET_TYPE_KD_STATE_CHANGE64",
+ "PACKET_TYPE_KD_POLL_BREAKIN",
+ "PACKET_TYPE_KD_TRACE_IO",
+ "PACKET_TYPE_KD_CONTROL_REQUEST",
+ "PACKET_TYPE_KD_FILE_IO",
+ "PACKET_TYPE_MAX",
+};
+
+const char *kd_api_name(int id)
+{
+ return (id >= DbgKdMinimumManipulate && id < DbgKdMaximumManipulate)
+ ? kd_api_names[id - DbgKdMinimumManipulate]
+ : kd_api_names[DbgKdMaximumManipulate - DbgKdMinimumManipulate];
+}
+
+const char *kd_pkt_type_name(int id)
+{
+ return (id >= 0 && id < PACKET_TYPE_MAX)
+ ? kd_packet_type_names[id]
+ : kd_packet_type_names[PACKET_TYPE_MAX - 1];
+}