@@ -25,6 +25,7 @@
// schema defines
#define ARG_SCHEMA_QRYHANDLE 'q'
#define ARG_SCHEMA_STRING 's'
+#define ARG_SCHEMA_INT 'd'
#define ARG_SCHEMA_CORENUM 'c'
// resets
@@ -34,8 +35,8 @@
// more
#define QUERY_TOTAL_NUMBER 11 //FIXME: set this to a usefull value in the end
-#define CMD_SCHEMA_LENGTH 2
-#define MCD_MAX_CORES 128
+#define CMD_SCHEMA_LENGTH 3
+#define MAX_SCHEMA_ARGS CMD_SCHEMA_LENGTH-1
#define MCD_SYSTEM_NAME "qemu-system"
// tcp query packet values templates
#define DEVICE_NAME_TEMPLATE(s) "qemu-" #s "-device"
@@ -77,17 +78,17 @@ typedef enum MCDThreadIdKind {
} MCDThreadIdKind;
typedef union MCDCmdVariant {
- const char *data;
+ const char *data;
+ int data_int;
+ int query_handle;
+ int cpu_id;
struct {
MCDThreadIdKind kind;
uint32_t pid;
uint32_t tid;
} thread_id;
- int query_handle;
- int cpu_id;
-
} MCDCmdVariant;
#define get_param(p, i) (&g_array_index(p, MCDCmdVariant, i))
@@ -277,6 +278,7 @@ 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);
+void handle_reset(GArray *params, void *user_ctx);
// arm specific functions
int mcd_arm_store_mem_spaces(CPUState *cpu, GArray* memspaces);
@@ -11,6 +11,7 @@
#define TCP_CHAR_CLOSE_SERVER 'D'
#define TCP_CHAR_CLOSE_CORE 'd'
#define TCP_CHAR_KILLQEMU 'k'
+#define TCP_CHAR_RESET 'r'
// tcp protocol chars
#define TCP_ACKNOWLEDGED '+'
@@ -54,4 +55,7 @@
#define TCP_ARGUMENT_OPTION "option"
#define TCP_ARGUMENT_ACTION "action"
+// for packets sent to qemu
+#define ARGUMENT_SEPARATOR ';'
+
#endif
@@ -508,6 +508,16 @@ int mcd_handle_packet(const char *line_buf)
cmd_parser = &close_core_cmd_desc;
}
break;
+ case TCP_CHAR_RESET:
+ {
+ static MCDCmdParseEntry reset_cmd_desc = {
+ .handler = handle_reset,
+ };
+ reset_cmd_desc.cmd = (char[2]) { (char) TCP_CHAR_RESET, '\0' };
+ strcpy(reset_cmd_desc.schema, (char[3]) { (char) ARG_SCHEMA_INT, ARG_SCHEMA_INT, '\0' });
+ cmd_parser = &reset_cmd_desc;
+ }
+ break;
default:
// could not perform the command (because its unknown)
mcd_put_packet("");
@@ -564,24 +574,42 @@ void run_cmd_parser(const char *data, const MCDCmdParseEntry *cmd)
}
int cmd_parse_params(const char *data, const char *schema, GArray *params) {
- MCDCmdVariant this_param;
-
+
char data_buffer[64] = {0};
- if (schema[0] == ARG_SCHEMA_STRING) {
- this_param.data = data;
- g_array_append_val(params, this_param);
- }
- else if (schema[0] == ARG_SCHEMA_QRYHANDLE) {
- strncat(data_buffer, data, strlen(data));
- this_param.query_handle = atoi(data_buffer);
- g_array_append_val(params, this_param);
+ char *separator = strchr(data_buffer, ARGUMENT_SEPARATOR);
+ int seperator_index = (int)(separator - data);
+
+ if (separator) {
+ // we got two arguments
+ strncpy(data_buffer, data, seperator_index);
}
- else if (schema[0] == ARG_SCHEMA_CORENUM) {
- strncat(data_buffer, data, strlen(data));
- this_param.cpu_id = atoi(data_buffer);
- g_array_append_val(params, this_param);
+ else {
+ strncpy(data_buffer, data, strlen(data));
}
+ for (int i = 0; i<MAX_SCHEMA_ARGS; i++) {
+ MCDCmdVariant this_param;
+ if (schema[i] == ARG_SCHEMA_STRING) {
+ this_param.data = data_buffer;
+ g_array_append_val(params, this_param);
+ }
+ else if (schema[i] == ARG_SCHEMA_INT) {
+ this_param.data_int = atoi(data_buffer);
+ g_array_append_val(params, this_param);
+ }
+ else if (schema[i] == ARG_SCHEMA_QRYHANDLE) {
+ this_param.query_handle = atoi(data_buffer);
+ g_array_append_val(params, this_param);
+ }
+ else if (schema[i] == ARG_SCHEMA_CORENUM) {
+ this_param.cpu_id = atoi(data_buffer);
+ g_array_append_val(params, this_param);
+ }
+ if (separator) {
+ // we got two arguments
+ strncpy(data_buffer, &data[seperator_index+1], strlen(&data[seperator_index+1]));
+ }
+ }
return 0;
}
@@ -1532,3 +1560,12 @@ void handle_query_regs_c(GArray *params, void *user_ctx) {
TCP_ARGUMENT_TYPE, my_register.mcd_reg_type, TCP_ARGUMENT_THREAD, my_register.mcd_hw_thread_id);
mcd_put_strbuf();
}
+
+void handle_reset(GArray *params, void *user_ctx) {
+ int reset_id = get_param(params, 0)->data_int;
+ int bool_halt_after_reset = get_param(params, 1)->data_int;
+ if (reset_id>=0 && bool_halt_after_reset) {
+ //fun for the compiler
+ }
+
+}
From: neder <nicolas.eder@lauterbach.com> --- mcdstub/internals.h | 14 ++++---- mcdstub/mcd_shared_defines.h | 4 +++ mcdstub/mcdstub.c | 65 ++++++++++++++++++++++++++++-------- 3 files changed, 63 insertions(+), 20 deletions(-)