@@ -1192,104 +1192,6 @@ int int_cmp(gconstpointer a, gconstpointer b)
}
}
-int mcd_arm_store_mem_spaces(CPUState *cpu, GArray *memspaces)
-{
- int nr_address_spaces = cpu->num_ases;
- uint32_t mem_space_id = 0;
-
- /*
- * TODO: atm we can only access physical memory addresses,
- * but trace32 needs fake locical spaces to work with
- */
-
- mem_space_id++;
- mcd_mem_space_st non_secure = {
- .name = "Non Secure",
- .id = mem_space_id,
- .type = 34,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- .is_secure = false,
- };
- g_array_append_vals(memspaces, (gconstpointer)&non_secure, 1);
- mem_space_id++;
- mcd_mem_space_st phys_non_secure = {
- .name = "Physical (Non Secure)",
- .id = mem_space_id,
- .type = 18,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- .is_secure = false,
- };
- g_array_append_vals(memspaces, (gconstpointer)&phys_non_secure, 1);
- if(nr_address_spaces > 1) {
- mem_space_id++;
- mcd_mem_space_st secure = {
- .name = "Secure",
- .id = mem_space_id,
- .type = 34,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- .is_secure = true,
- };
- g_array_append_vals(memspaces, (gconstpointer)&secure, 1);
- mem_space_id++;
- mcd_mem_space_st phys_secure = {
- .name = "Physical (Secure)",
- .id = mem_space_id,
- .type = 18,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- .is_secure = true,
- };
- g_array_append_vals(memspaces, (gconstpointer)&phys_secure, 1);
- }
- /* TODO: get dynamically how the per (CP15) space is called */
- mem_space_id++;
- mcd_mem_space_st gpr = {
- .name = "GPR Registers",
- .id = mem_space_id,
- .type = 1,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- };
- g_array_append_vals(memspaces, (gconstpointer)&gpr, 1);
- mem_space_id++;
- mcd_mem_space_st cpr = {
- .name = "CP15 Registers",
- .id = mem_space_id,
- .type = 1,
- .bits_per_mau = 8,
- .invariance = 1,
- .endian = 1,
- .min_addr = 0,
- .max_addr = -1,
- .supported_access_options = 0,
- };
- g_array_append_vals(memspaces, (gconstpointer)&cpr, 1);
- return 0;
-}
-
int init_resets(GArray *resets)
{
mcd_reset_st system_reset = { .id = 0, .name = RESET_SYSTEM};
@@ -1360,138 +1262,6 @@ void handle_query_cores(GArray *params, void *user_ctx)
g_free(arch);
}
-int mcd_arm_parse_core_xml_file(CPUClass *cc, GArray *reggroups,
- GArray *registers, int *current_group_id)
-{
- const char *xml_filename = NULL;
- const char *current_xml_filename = NULL;
- const char *xml_content = NULL;
- int i = 0;
-
- /* 1. get correct file */
- xml_filename = cc->gdb_core_xml_file;
- for (i = 0; ; i++) {
- current_xml_filename = xml_builtin[i][0];
- if (!current_xml_filename || (strncmp(current_xml_filename,
- xml_filename, strlen(xml_filename)) == 0
- && strlen(current_xml_filename) == strlen(xml_filename)))
- break;
- }
- /* without gpr registers we can do nothing */
- if (!current_xml_filename) {
- return -1;
- }
-
- /* 2. add group for gpr registers */
- mcd_reg_group_st gprregs = {
- .name = "GPR Registers",
- .id = *current_group_id
- };
- g_array_append_vals(reggroups, (gconstpointer)&gprregs, 1);
- *current_group_id = *current_group_id + 1;
-
- /* 3. parse xml */
- xml_content = xml_builtin[i][1];
- parse_reg_xml(xml_content, strlen(xml_content), registers,
- MCD_ARM_REG_TYPE_GPR);
- return 0;
-}
-
-int mcd_arm_parse_general_xml_files(CPUState *cpu, GArray *reggroups,
- GArray *registers, int *current_group_id) {
- const char *xml_filename = NULL;
- const char *current_xml_filename = NULL;
- const char *xml_content = NULL;
- int i = 0;
- uint8_t reg_type;
-
- /* iterate over all gdb xml files*/
- GDBRegisterState *r;
- for (r = cpu->gdb_regs; r; r = r->next) {
- xml_filename = r->xml;
- xml_content = NULL;
-
- /* 1. get xml content */
- xml_content = arm_mcd_get_dynamic_xml(cpu, xml_filename);
- if (xml_content) {
- if (strcmp(xml_filename, "system-registers.xml") == 0) {
- /* these are the coprocessor register */
- mcd_reg_group_st corprocessorregs = {
- .name = "CP15 Registers",
- .id = *current_group_id
- };
- g_array_append_vals(reggroups,
- (gconstpointer)&corprocessorregs, 1);
- *current_group_id = *current_group_id + 1;
- reg_type = MCD_ARM_REG_TYPE_CPR;
- }
- } else {
- /* its not a coprocessor xml -> it is a static xml file */
- for (i = 0; ; i++) {
- current_xml_filename = xml_builtin[i][0];
- if (!current_xml_filename || (strncmp(current_xml_filename,
- xml_filename, strlen(xml_filename)) == 0
- && strlen(current_xml_filename) == strlen(xml_filename)))
- break;
- }
- if (current_xml_filename) {
- xml_content = xml_builtin[i][1];
- /* select correct reg_type */
- if (strcmp(current_xml_filename, "arm-vfp.xml") == 0) {
- reg_type = MCD_ARM_REG_TYPE_VFP;
- } else if (strcmp(current_xml_filename, "arm-vfp3.xml") == 0) {
- reg_type = MCD_ARM_REG_TYPE_VFP;
- } else if (strcmp(current_xml_filename,
- "arm-vfp-sysregs.xml") == 0) {
- reg_type = MCD_ARM_REG_TYPE_VFP_SYS;
- } else if (strcmp(current_xml_filename,
- "arm-neon.xml") == 0) {
- reg_type = MCD_ARM_REG_TYPE_VFP;
- } else if (strcmp(current_xml_filename,
- "arm-m-profile-mve.xml") == 0) {
- reg_type = MCD_ARM_REG_TYPE_MVE;
- }
- } else {
- continue;
- }
- }
- /* 2. parse xml */
- parse_reg_xml(xml_content, strlen(xml_content), registers, reg_type);
- }
- return 0;
-}
-
-int mcd_arm_get_additional_register_info(GArray *reggroups, GArray *registers,
- CPUState *cpu)
-{
- mcd_reg_st *current_register;
- uint32_t i = 0;
-
- /* iterate over all registers */
- for (i = 0; i < registers->len; i++) {
- current_register = &(g_array_index(registers, mcd_reg_st, i));
- current_register->id = i;
- /* add mcd_reg_group_id and mcd_mem_space_id */
- if (strcmp(current_register->group, "cp_regs") == 0) {
- /* coprocessor registers */
- current_register->mcd_reg_group_id = 2;
- current_register->mcd_mem_space_id = 6;
- /*
- * get info for opcode
- * for 32bit the opcode is only 16 bit long
- * for 64bit it is 32 bit long
- */
- current_register->opcode |=
- arm_mcd_get_opcode(cpu, current_register->internal_id);
- } else {
- /* gpr register */
- current_register->mcd_reg_group_id = 1;
- current_register->mcd_mem_space_id = 5;
- }
- }
- return 0;
-}
-
void handle_open_core(GArray *params, void *user_ctx)
{
uint32_t cpu_id = get_param(params, 0)->cpu_id;
@@ -1506,28 +1276,28 @@ void handle_open_core(GArray *params, void *user_ctx)
GArray *reggroups = g_array_new(false, true, sizeof(mcd_reg_group_st));
GArray *registers = g_array_new(false, true, sizeof(mcd_reg_st));
- if (strcmp(arch, "arm") == 0) {
+ if (strcmp(arch, MCDSTUB_ARCH_ARM) == 0) {
/* TODO: make group and memspace ids dynamic */
int current_group_id = 1;
/* 1. store mem spaces */
- return_value = mcd_arm_store_mem_spaces(cpu, memspaces);
+ return_value = arm_mcd_store_mem_spaces(cpu, memspaces);
if (return_value != 0) {
g_assert_not_reached();
}
/* 2. parse core xml */
- return_value = mcd_arm_parse_core_xml_file(cc, reggroups,
+ return_value = arm_mcd_parse_core_xml_file(cc, reggroups,
registers, ¤t_group_id);
if (return_value != 0) {
g_assert_not_reached();
}
/* 3. parse other xmls */
- return_value = mcd_arm_parse_general_xml_files(cpu, reggroups,
+ return_value = arm_mcd_parse_general_xml_files(cpu, reggroups,
registers, ¤t_group_id);
if (return_value != 0) {
g_assert_not_reached();
}
/* 4. add additional data the the regs from the xmls */
- return_value = mcd_arm_get_additional_register_info(reggroups,
+ return_value = arm_mcd_get_additional_register_info(reggroups,
registers, cpu);
if (return_value != 0) {
g_assert_not_reached();
@@ -1939,7 +1709,7 @@ int mcd_read_register(CPUState *cpu, GByteArray *buf, int reg)
/* 2. read register */
CPUClass *cc = CPU_GET_CLASS(cpu);
gchar *arch = cc->gdb_arch_name(cpu);
- if (strcmp(arch, "arm") == 0) {
+ if (strcmp(arch, MCDSTUB_ARCH_ARM) == 0) {
g_free(arch);
return arm_mcd_read_register(cpu, buf, reg_type, internal_id);
} else {
@@ -1959,7 +1729,7 @@ int mcd_write_register(CPUState *cpu, GByteArray *buf, int reg)
/* 2. write register */
CPUClass *cc = CPU_GET_CLASS(cpu);
gchar *arch = cc->gdb_arch_name(cpu);
- if (strcmp(arch, "arm") == 0) {
+ if (strcmp(arch, MCDSTUB_ARCH_ARM) == 0) {
g_free(arch);
return arm_mcd_write_register(cpu, buf, reg_type, internal_id);
} else {
@@ -4,8 +4,7 @@
#include "exec/cpu-common.h"
#include "chardev/char.h"
#include "hw/core/cpu.h"
-/* just used for the register xml files */
-#include "exec/gdbstub.h"
+#include "mcdstub_common.h"
#define MAX_PACKET_LENGTH 1024
@@ -44,7 +43,9 @@ enum {
#define QUERY_TOTAL_NUMBER 12
#define CMD_SCHEMA_LENGTH 6
#define MCD_SYSTEM_NAME "qemu-system"
-#define ARGUMENT_STRING_LENGTH 64
+
+/* supported architectures */
+#define MCDSTUB_ARCH_ARM "arm"
/* tcp query packet values templates */
#define DEVICE_NAME_TEMPLATE(s) "qemu-" #s "-device"
@@ -63,16 +64,6 @@ enum {
#define STATE_STR_BREAK_RW(d) "stopped beacuse of read or write access at " #d
#define STATE_STR_BREAK_UNKNOWN "stopped for unknown reason"
-typedef struct GDBRegisterState {
- /* needed for the used gdb functions */
- int base_reg;
- int num_regs;
- gdb_get_reg_cb get_reg;
- gdb_set_reg_cb set_reg;
- const char *xml;
- struct GDBRegisterState *next;
-} GDBRegisterState;
-
typedef struct MCDProcess {
uint32_t pid;
bool attached;
@@ -160,48 +151,11 @@ typedef struct MCDState {
/* lives in main mcdstub.c */
extern MCDState mcdserver_state;
-typedef struct mcd_mem_space_st {
- const char *name;
- uint32_t id;
- uint32_t type;
- uint32_t bits_per_mau;
- uint8_t invariance;
- uint32_t endian;
- uint64_t min_addr;
- uint64_t max_addr;
- uint32_t supported_access_options;
- /* internal */
- bool is_secure;
-} mcd_mem_space_st;
-
-typedef struct mcd_reg_group_st {
- const char *name;
- uint32_t id;
-} mcd_reg_group_st;
-
typedef struct xml_attrib {
char argument[ARGUMENT_STRING_LENGTH];
char value[ARGUMENT_STRING_LENGTH];
} xml_attrib;
-typedef struct mcd_reg_st {
- /* xml info */
- char name[ARGUMENT_STRING_LENGTH];
- char group[ARGUMENT_STRING_LENGTH];
- char type[ARGUMENT_STRING_LENGTH];
- uint32_t bitsize;
- uint32_t id; /* id used by the mcd interface */
- uint32_t internal_id; /* id inside reg type */
- uint8_t reg_type;
- /* mcd metadata */
- uint32_t mcd_reg_group_id;
- uint32_t mcd_mem_space_id;
- uint32_t mcd_reg_type;
- uint32_t mcd_hw_thread_id;
- /* data for op-code */
- uint32_t opcode;
-} mcd_reg_st;
-
typedef struct mcd_reset_st {
const char *name;
uint8_t id;
@@ -291,8 +245,6 @@ void handle_query_mem_spaces_c(GArray *params, void *user_ctx);
void handle_query_regs_f(GArray *params, void *user_ctx);
void handle_query_regs_c(GArray *params, void *user_ctx);
void handle_open_server(GArray *params, void *user_ctx);
-void parse_reg_xml(const char *xml, int size, GArray* registers,
- uint8_t reg_type);
void handle_reset(GArray *params, void *user_ctx);
void handle_query_state(GArray *params, void *user_ctx);
void handle_read_register(GArray *params, void *user_ctx);
@@ -308,14 +260,6 @@ void handle_breakpoint_remove(GArray *params, void *user_ctx);
int mcd_breakpoint_insert(CPUState *cpu, int type, vaddr addr);
int mcd_breakpoint_remove(CPUState *cpu, int type, vaddr addr);
-/* arm specific functions */
-int mcd_arm_store_mem_spaces(CPUState *cpu, GArray *memspaces);
-int mcd_arm_parse_core_xml_file(CPUClass *cc, GArray *reggroups,
- GArray *registers, int *current_group_id);
-int mcd_arm_parse_general_xml_files(CPUState *cpu, GArray* reggroups,
- GArray *registers, int *current_group_id);
-int mcd_arm_get_additional_register_info(GArray *reggroups, GArray *registers,
- CPUState *cpu);
/* sycall handling */
void mcd_syscall_reset(void);
void mcd_disable_syscalls(void);
new file mode 100644
@@ -0,0 +1,46 @@
+#ifndef MCDSTUB_COMMON_H
+#define MCDSTUB_COMMON_H
+
+#define ARGUMENT_STRING_LENGTH 64
+
+typedef struct mcd_mem_space_st {
+ const char *name;
+ uint32_t id;
+ uint32_t type;
+ uint32_t bits_per_mau;
+ uint8_t invariance;
+ uint32_t endian;
+ uint64_t min_addr;
+ uint64_t max_addr;
+ uint32_t supported_access_options;
+ /* internal */
+ bool is_secure;
+} mcd_mem_space_st;
+
+typedef struct mcd_reg_st {
+ /* xml info */
+ char name[ARGUMENT_STRING_LENGTH];
+ char group[ARGUMENT_STRING_LENGTH];
+ char type[ARGUMENT_STRING_LENGTH];
+ uint32_t bitsize;
+ uint32_t id; /* id used by the mcd interface */
+ uint32_t internal_id; /* id inside reg type */
+ uint8_t reg_type;
+ /* mcd metadata */
+ uint32_t mcd_reg_group_id;
+ uint32_t mcd_mem_space_id;
+ uint32_t mcd_reg_type;
+ uint32_t mcd_hw_thread_id;
+ /* data for op-code */
+ uint32_t opcode;
+} mcd_reg_st;
+
+typedef struct mcd_reg_group_st {
+ const char *name;
+ uint32_t id;
+} mcd_reg_group_st;
+
+void parse_reg_xml(const char *xml, int size, GArray* registers,
+ uint8_t reg_type);
+
+#endif /* MCDSTUB_COMMON_H */
@@ -344,3 +344,234 @@ int arm_mcd_set_scr(CPUState *cs, bool secure)
}
return 0;
}
+
+int arm_mcd_store_mem_spaces(CPUState *cpu, GArray *memspaces)
+{
+ int nr_address_spaces = cpu->num_ases;
+ uint32_t mem_space_id = 0;
+
+ /*
+ * TODO: atm we can only access physical memory addresses,
+ * but trace32 needs fake locical spaces to work with
+ */
+
+ mem_space_id++;
+ mcd_mem_space_st non_secure = {
+ .name = "Non Secure",
+ .id = mem_space_id,
+ .type = 34,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ .is_secure = false,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&non_secure, 1);
+ mem_space_id++;
+ mcd_mem_space_st phys_non_secure = {
+ .name = "Physical (Non Secure)",
+ .id = mem_space_id,
+ .type = 18,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ .is_secure = false,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&phys_non_secure, 1);
+ if(nr_address_spaces > 1) {
+ mem_space_id++;
+ mcd_mem_space_st secure = {
+ .name = "Secure",
+ .id = mem_space_id,
+ .type = 34,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ .is_secure = true,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&secure, 1);
+ mem_space_id++;
+ mcd_mem_space_st phys_secure = {
+ .name = "Physical (Secure)",
+ .id = mem_space_id,
+ .type = 18,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ .is_secure = true,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&phys_secure, 1);
+ }
+ /* TODO: get dynamically how the per (CP15) space is called */
+ mem_space_id++;
+ mcd_mem_space_st gpr = {
+ .name = "GPR Registers",
+ .id = mem_space_id,
+ .type = 1,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&gpr, 1);
+ mem_space_id++;
+ mcd_mem_space_st cpr = {
+ .name = "CP15 Registers",
+ .id = mem_space_id,
+ .type = 1,
+ .bits_per_mau = 8,
+ .invariance = 1,
+ .endian = 1,
+ .min_addr = 0,
+ .max_addr = -1,
+ .supported_access_options = 0,
+ };
+ g_array_append_vals(memspaces, (gconstpointer)&cpr, 1);
+ return 0;
+}
+
+int arm_mcd_parse_core_xml_file(CPUClass *cc, GArray *reggroups,
+ GArray *registers, int *current_group_id)
+{
+ const char *xml_filename = NULL;
+ const char *current_xml_filename = NULL;
+ const char *xml_content = NULL;
+ int i = 0;
+
+ /* 1. get correct file */
+ xml_filename = cc->gdb_core_xml_file;
+ for (i = 0; ; i++) {
+ current_xml_filename = xml_builtin[i][0];
+ if (!current_xml_filename || (strncmp(current_xml_filename,
+ xml_filename, strlen(xml_filename)) == 0
+ && strlen(current_xml_filename) == strlen(xml_filename)))
+ break;
+ }
+ /* without gpr registers we can do nothing */
+ if (!current_xml_filename) {
+ return -1;
+ }
+
+ /* 2. add group for gpr registers */
+ mcd_reg_group_st gprregs = {
+ .name = "GPR Registers",
+ .id = *current_group_id
+ };
+ g_array_append_vals(reggroups, (gconstpointer)&gprregs, 1);
+ *current_group_id = *current_group_id + 1;
+
+ /* 3. parse xml */
+ xml_content = xml_builtin[i][1];
+ parse_reg_xml(xml_content, strlen(xml_content), registers,
+ MCD_ARM_REG_TYPE_GPR);
+ return 0;
+}
+
+int arm_mcd_parse_general_xml_files(CPUState *cpu, GArray *reggroups,
+ GArray *registers, int *current_group_id) {
+ const char *xml_filename = NULL;
+ const char *current_xml_filename = NULL;
+ const char *xml_content = NULL;
+ int i = 0;
+ uint8_t reg_type;
+
+ /* iterate over all gdb xml files*/
+ GDBRegisterState *r;
+ for (r = cpu->gdb_regs; r; r = r->next) {
+ xml_filename = r->xml;
+ xml_content = NULL;
+
+ /* 1. get xml content */
+ xml_content = arm_mcd_get_dynamic_xml(cpu, xml_filename);
+ if (xml_content) {
+ if (strcmp(xml_filename, "system-registers.xml") == 0) {
+ /* these are the coprocessor register */
+ mcd_reg_group_st corprocessorregs = {
+ .name = "CP15 Registers",
+ .id = *current_group_id
+ };
+ g_array_append_vals(reggroups,
+ (gconstpointer)&corprocessorregs, 1);
+ *current_group_id = *current_group_id + 1;
+ reg_type = MCD_ARM_REG_TYPE_CPR;
+ }
+ } else {
+ /* its not a coprocessor xml -> it is a static xml file */
+ for (i = 0; ; i++) {
+ current_xml_filename = xml_builtin[i][0];
+ if (!current_xml_filename || (strncmp(current_xml_filename,
+ xml_filename, strlen(xml_filename)) == 0
+ && strlen(current_xml_filename) == strlen(xml_filename)))
+ break;
+ }
+ if (current_xml_filename) {
+ xml_content = xml_builtin[i][1];
+ /* select correct reg_type */
+ if (strcmp(current_xml_filename, "arm-vfp.xml") == 0) {
+ reg_type = MCD_ARM_REG_TYPE_VFP;
+ } else if (strcmp(current_xml_filename, "arm-vfp3.xml") == 0) {
+ reg_type = MCD_ARM_REG_TYPE_VFP;
+ } else if (strcmp(current_xml_filename,
+ "arm-vfp-sysregs.xml") == 0) {
+ reg_type = MCD_ARM_REG_TYPE_VFP_SYS;
+ } else if (strcmp(current_xml_filename,
+ "arm-neon.xml") == 0) {
+ reg_type = MCD_ARM_REG_TYPE_VFP;
+ } else if (strcmp(current_xml_filename,
+ "arm-m-profile-mve.xml") == 0) {
+ reg_type = MCD_ARM_REG_TYPE_MVE;
+ }
+ } else {
+ continue;
+ }
+ }
+ /* 2. parse xml */
+ parse_reg_xml(xml_content, strlen(xml_content), registers, reg_type);
+ }
+ return 0;
+}
+
+int arm_mcd_get_additional_register_info(GArray *reggroups, GArray *registers,
+ CPUState *cpu)
+{
+ mcd_reg_st *current_register;
+ uint32_t i = 0;
+
+ /* iterate over all registers */
+ for (i = 0; i < registers->len; i++) {
+ current_register = &(g_array_index(registers, mcd_reg_st, i));
+ current_register->id = i;
+ /* add mcd_reg_group_id and mcd_mem_space_id */
+ if (strcmp(current_register->group, "cp_regs") == 0) {
+ /* coprocessor registers */
+ current_register->mcd_reg_group_id = 2;
+ current_register->mcd_mem_space_id = 6;
+ /*
+ * get info for opcode
+ * for 32bit the opcode is only 16 bit long
+ * for 64bit it is 32 bit long
+ */
+ current_register->opcode |=
+ arm_mcd_get_opcode(cpu, current_register->internal_id);
+ } else {
+ /* gpr register */
+ current_register->mcd_reg_group_id = 1;
+ current_register->mcd_mem_space_id = 5;
+ }
+ }
+ return 0;
+}
+
@@ -1,6 +1,21 @@
#ifndef ARM_MCDSTUB_H
#define ARM_MCDSTUB_H
+#include "hw/core/cpu.h"
+#include "mcdstub/mcdstub_common.h"
+/* just used for the register xml files */
+#include "exec/gdbstub.h"
+
+typedef struct GDBRegisterState {
+ /* needed for the used gdb functions */
+ int base_reg;
+ int num_regs;
+ gdb_get_reg_cb get_reg;
+ gdb_set_reg_cb set_reg;
+ const char *xml;
+ struct GDBRegisterState *next;
+} GDBRegisterState;
+
/* ids for each different type of register */
enum {
MCD_ARM_REG_TYPE_GPR,
@@ -17,5 +32,12 @@ int arm_mcd_write_register(CPUState *cs, GByteArray *mem_buf, uint8_t reg_type,
uint32_t n);
uint16_t arm_mcd_get_opcode(CPUState *cs, uint32_t n);
int arm_mcd_set_scr(CPUState *cs, bool secure);
+int arm_mcd_store_mem_spaces(CPUState *cpu, GArray *memspaces);
+int arm_mcd_parse_core_xml_file(CPUClass *cc, GArray *reggroups,
+ GArray *registers, int *current_group_id);
+int arm_mcd_parse_general_xml_files(CPUState *cpu, GArray* reggroups,
+ GArray *registers, int *current_group_id);
+int arm_mcd_get_additional_register_info(GArray *reggroups, GArray *registers,
+ CPUState *cpu);
#endif /* ARM_MCDSTUB_H */
From: neder <nicolas.eder@lauterbach.com> --- mcdstub/mcdstub.c | 244 ++------------------------------------- mcdstub/mcdstub.h | 64 +--------- mcdstub/mcdstub_common.h | 46 ++++++++ target/arm/mcdstub.c | 231 ++++++++++++++++++++++++++++++++++++ target/arm/mcdstub.h | 22 ++++ 5 files changed, 310 insertions(+), 297 deletions(-) create mode 100644 mcdstub/mcdstub_common.h