|
@@ -18,8 +18,13 @@
|
|
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
|
*/
|
|
|
#include "qemu/osdep.h"
|
|
|
+#include "accel/tcg/vcpu-state.h"
|
|
|
#include "cpu.h"
|
|
|
+#include "exec/gdbstub.h"
|
|
|
#include "gdbstub/helpers.h"
|
|
|
+#ifdef CONFIG_LINUX_USER
|
|
|
+#include "linux-user/qemu.h"
|
|
|
+#endif
|
|
|
|
|
|
#ifdef TARGET_X86_64
|
|
|
static const int gpr_map[16] = {
|
|
@@ -406,3 +411,49 @@ int x86_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
|
|
/* Unrecognised register. */
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_LINUX_USER
|
|
|
+
|
|
|
+#define IDX_ORIG_AX 0
|
|
|
+
|
|
|
+static int x86_cpu_gdb_read_linux_register(CPUState *cs, GByteArray *mem_buf,
|
|
|
+ int n)
|
|
|
+{
|
|
|
+ X86CPU *cpu = X86_CPU(cs);
|
|
|
+ CPUX86State *env = &cpu->env;
|
|
|
+
|
|
|
+ switch (n) {
|
|
|
+ case IDX_ORIG_AX:
|
|
|
+ return gdb_get_reg(env, mem_buf, get_task_state(cs)->orig_ax);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int x86_cpu_gdb_write_linux_register(CPUState *cs, uint8_t *mem_buf,
|
|
|
+ int n)
|
|
|
+{
|
|
|
+ X86CPU *cpu = X86_CPU(cs);
|
|
|
+ CPUX86State *env = &cpu->env;
|
|
|
+
|
|
|
+ switch (n) {
|
|
|
+ case IDX_ORIG_AX:
|
|
|
+ return gdb_write_reg(env, mem_buf, &get_task_state(cs)->orig_ax);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+void x86_cpu_gdb_init(CPUState *cs)
|
|
|
+{
|
|
|
+#ifdef CONFIG_LINUX_USER
|
|
|
+ gdb_register_coprocessor(cs, x86_cpu_gdb_read_linux_register,
|
|
|
+ x86_cpu_gdb_write_linux_register,
|
|
|
+#ifdef TARGET_X86_64
|
|
|
+ gdb_find_static_feature("i386-64bit-linux.xml"),
|
|
|
+#else
|
|
|
+ gdb_find_static_feature("i386-32bit-linux.xml"),
|
|
|
+#endif
|
|
|
+ 0);
|
|
|
+#endif
|
|
|
+}
|