diff mbox series

[v2,10/29] handler for resets added

Message ID 20231006090610.26171-11-nicolas.eder@lauterbach.com
State New
Headers show
Series first version of mcdstub | expand

Commit Message

nicolas.eder@lauterbach.com Oct. 6, 2023, 9:05 a.m. UTC
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(-)
diff mbox series

Patch

diff --git a/mcdstub/internals.h b/mcdstub/internals.h
index a4d49a4a84..0de8d8fd07 100644
--- a/mcdstub/internals.h
+++ b/mcdstub/internals.h
@@ -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);
diff --git a/mcdstub/mcd_shared_defines.h b/mcdstub/mcd_shared_defines.h
index e0b27ce5e6..7e96129cdf 100644
--- a/mcdstub/mcd_shared_defines.h
+++ b/mcdstub/mcd_shared_defines.h
@@ -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
diff --git a/mcdstub/mcdstub.c b/mcdstub/mcdstub.c
index a0c4c2794f..85e0c3a219 100644
--- a/mcdstub/mcdstub.c
+++ b/mcdstub/mcdstub.c
@@ -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
+    }
+    
+}