[SerialICE] New patch to review for serialice: 9d5fcdd SerialICE: Create capsule for serial protocol

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Mon Aug 20 23:03:52 CEST 2012


Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1468

-gerrit

commit 9d5fcdd21c92f8918730448692eacb04439f22ca
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Mon Aug 20 16:21:33 2012 +0300

    SerialICE: Create capsule for serial protocol
    
    Change makes it easier to make a more generic "multiplex" that chooses
    if operations are handled by Qemu or external target. Also it allows
    for the use of another communication channel in place of serial stream.
    
    Change-Id: I46e0abf8b1f4e1fa4dd30332778f5e73528a8dd4
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 qemu-0.15.x/serialice-com.c | 52 +++++++++++++++++++++++++++++++--------------
 qemu-0.15.x/serialice.c     | 20 ++++++++++-------
 qemu-0.15.x/serialice.h     | 29 ++++++++++++-------------
 3 files changed, 62 insertions(+), 39 deletions(-)

diff --git a/qemu-0.15.x/serialice-com.c b/qemu-0.15.x/serialice-com.c
index ef5fd84..ee539f4 100644
--- a/qemu-0.15.x/serialice-com.c
+++ b/qemu-0.15.x/serialice-com.c
@@ -52,12 +52,15 @@ typedef struct {
 } SerialICEState;
 
 static SerialICEState *s;
+static const SerialICE_target serialice_protocol;
 const char *serialice_mainboard = NULL;
 
 #ifndef WIN32
 static struct termios options;
 #endif
 
+// **************************************************************************
+// low level communication with the SerialICE shell (serial communication)
 static int handshake_mode = 0;
 
 static void *mallocz(unsigned int size)
@@ -157,7 +160,7 @@ static int serialice_wait_prompt(void)
     return 0;
 }
 
-void serialice_serial_init(void)
+const SerialICE_target *serialice_serial_init(void)
 {
     s = mallocz(sizeof(SerialICEState));
 
@@ -252,13 +255,17 @@ void serialice_serial_init(void)
     serialice_write(s, "@", 1);
 
     handshake_mode = 0;         // from now on, warn about readback errors.
+    return &serialice_protocol;
+}
 
-    serialice_get_version();
-
-    serialice_get_mainboard();
+void serialice_serial_exit(void)
+{
+    free(s->command);
+    free(s->buffer);
+    free(s);
 }
 
-void serialice_command(const char *command, int reply_len)
+static void serialice_command(const char *command, int reply_len)
 {
 #if SERIALICE_DEBUG > 5
     int i;
@@ -296,7 +303,10 @@ void serialice_command(const char *command, int reply_len)
 #endif
 }
 
-void serialice_get_version(void)
+// **************************************************************************
+// high level communication with the SerialICE shell
+
+static void msg_version(void)
 {
     int len = 0;
     printf("SerialICE: Version.....: ");
@@ -313,7 +323,7 @@ void serialice_get_version(void)
     printf("%s\n", s->buffer);
 }
 
-void serialice_get_mainboard(void)
+static void msg_mainboard(void)
 {
     int len = 31;
 
@@ -326,7 +336,7 @@ void serialice_get_mainboard(void)
     printf("%s\n", serialice_mainboard);
 }
 
-uint32_t serialice_io_read_wrapper(uint16_t port, unsigned int size)
+static uint32_t msg_io_read(uint16_t port, unsigned int size)
 {
     switch (size) {
     case 1:
@@ -350,7 +360,7 @@ uint32_t serialice_io_read_wrapper(uint16_t port, unsigned int size)
     }
 }
 
-void serialice_io_write_wrapper(uint16_t port, unsigned int size, uint32_t data)
+static void msg_io_write(uint16_t port, unsigned int size, uint32_t data)
 {
     switch (size) {
     case 1:
@@ -371,7 +381,7 @@ void serialice_io_write_wrapper(uint16_t port, unsigned int size, uint32_t data)
     return;
 }
 
-uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size)
+static uint32_t msg_load(uint32_t addr, unsigned int size)
 {
     switch (size) {
     case 1:
@@ -395,7 +405,7 @@ uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size)
     return 0;
 }
 
-void serialice_store_wrapper(uint32_t addr, unsigned int size, uint32_t data)
+static void msg_store(uint32_t addr, unsigned int size, uint32_t data)
 {
     switch (size) {
     case 1:
@@ -415,8 +425,7 @@ void serialice_store_wrapper(uint32_t addr, unsigned int size, uint32_t data)
     }
 }
 
-void serialice_rdmsr_wrapper(uint32_t addr, uint32_t key,
-                             uint32_t * hi, uint32_t * lo)
+static void msg_rdmsr(uint32_t addr, uint32_t key, uint32_t * hi, uint32_t * lo)
 {
     sprintf(s->command, "*rc%08x.%08x", addr, key);
     // command read back: "\n00000000.00000000" (18 characters)
@@ -426,14 +435,13 @@ void serialice_rdmsr_wrapper(uint32_t addr, uint32_t key,
     *lo = (uint32_t) strtoul(s->buffer + 10, (char **)NULL, 16);
 }
 
-void serialice_wrmsr_wrapper(uint32_t addr, uint32_t key,
-                             uint32_t hi, uint32_t lo)
+static void msg_wrmsr(uint32_t addr, uint32_t key, uint32_t hi, uint32_t lo)
 {
     sprintf(s->command, "*wc%08x.%08x=%08x.%08x", addr, key, hi, lo);
     serialice_command(s->command, 0);
 }
 
-void serialice_cpuid_wrapper(uint32_t eax, uint32_t ecx, cpuid_regs_t * ret)
+static void msg_cpuid(uint32_t eax, uint32_t ecx, cpuid_regs_t * ret)
 {
     sprintf(s->command, "*ci%08x.%08x", eax, ecx);
     // command read back: "\n000006f2.00000000.00001234.12340324"
@@ -447,3 +455,15 @@ void serialice_cpuid_wrapper(uint32_t eax, uint32_t ecx, cpuid_regs_t * ret)
     ret->ecx = (uint32_t) strtoul(s->buffer + 19, (char **)NULL, 16);
     ret->edx = (uint32_t) strtoul(s->buffer + 28, (char **)NULL, 16);
 }
+
+static const SerialICE_target serialice_protocol = {
+    .version = msg_version,
+    .mainboard = msg_mainboard,
+    .io_read = msg_io_read,
+    .io_write = msg_io_write,
+    .load = msg_load,
+    .store = msg_store,
+    .rdmsr = msg_rdmsr,
+    .wrmsr = msg_wrmsr,
+    .cpuid = msg_cpuid,
+};
diff --git a/qemu-0.15.x/serialice.c b/qemu-0.15.x/serialice.c
index 74aa9ff..5fe5cfb 100644
--- a/qemu-0.15.x/serialice.c
+++ b/qemu-0.15.x/serialice.c
@@ -50,6 +50,8 @@
 #define DEFAULT_RAM_SIZE 128
 #define BIOS_FILENAME "bios.bin"
 
+const SerialICE_target *target;
+
 int serialice_active = 0;
 
 static DisplayState *ds;
@@ -113,7 +115,7 @@ uint64_t serialice_rdmsr(uint32_t addr, uint32_t key)
 
     filtered = serialice_rdmsr_filter(addr, &hi, &lo);
     if (!filtered) {
-        serialice_rdmsr_wrapper(addr, key, &hi, &lo);
+        target->rdmsr(addr, key, &hi, &lo);
     }
 
     ret = hi;
@@ -136,7 +138,7 @@ void serialice_wrmsr(uint64_t data, uint32_t addr, uint32_t key)
     filtered = serialice_wrmsr_filter(addr, &hi, &lo);
 
     if (!filtered) {
-        serialice_wrmsr_wrapper(addr, key, hi, lo);
+        target->wrmsr(addr, key, hi, lo);
     }
 
     serialice_wrmsr_log(addr, hi, lo, filtered);
@@ -147,7 +149,7 @@ cpuid_regs_t serialice_cpuid(uint32_t eax, uint32_t ecx)
     cpuid_regs_t ret;
     int filtered;
 
-    serialice_cpuid_wrapper(eax, ecx, &ret);
+    target->cpuid(eax, ecx, &ret);
 
     filtered = serialice_cpuid_filter(eax, ecx, &ret);
 
@@ -182,7 +184,7 @@ int serialice_handle_load(uint32_t addr, uint32_t * result,
     source = serialice_memory_read_filter(addr, result, data_size);
 
     if (source & READ_FROM_SERIALICE) {
-        *result = serialice_load_wrapper(addr, data_size);
+        *result = target->load(addr, data_size);
         return 1;
     }
 
@@ -222,7 +224,7 @@ int serialice_handle_store(uint32_t addr, uint32_t val, unsigned int data_size)
     serialice_log_store(write_to_target, addr, filtered_data, data_size);
 
     if (write_to_target) {
-        serialice_store_wrapper(addr, data_size, filtered_data);
+        target->store(addr, data_size, filtered_data);
     }
 
     return (write_to_qemu == 0);
@@ -237,7 +239,7 @@ uint32_t serialice_io_read(uint16_t port, unsigned int size)
 
     filtered = serialice_io_read_filter(&data, port, size);
     if (!filtered) {
-        return serialice_io_read_wrapper(port, size);
+        return target->io_read(port, size);
     }
 
     data = mask_data(data, size);
@@ -256,7 +258,7 @@ void serialice_io_write(uint16_t port, unsigned int size, uint32 data)
         data = mask_data(filtered_data, size);
     } else {
         data = mask_data(filtered_data, size);
-        serialice_io_write_wrapper(port, size, data);
+        target->io_write(port, size, data);
     }
 
     serialice_io_write_log(0, data, port, size);
@@ -270,7 +272,9 @@ static void serialice_init(void)
     serialice_screen();
 
     printf("SerialICE: Open connection to target hardware...\n");
-    serialice_serial_init();
+    target = serialice_serial_init();
+    target->version();
+    target->mainboard();
 
     printf("SerialICE: LUA init...\n");
     serialice_lua_init();
diff --git a/qemu-0.15.x/serialice.h b/qemu-0.15.x/serialice.h
index 4624deb..3a12b53 100644
--- a/qemu-0.15.x/serialice.h
+++ b/qemu-0.15.x/serialice.h
@@ -44,12 +44,6 @@ extern int serialice_active;
 int serialice_lua_init(void);
 const char *serialice_lua_execute(const char *cmd);
 
-void serialice_serial_init(void);
-void serialice_command(const char *command, int reply_len);
-
-void serialice_get_version(void);
-void serialice_get_mainboard(void);
-
 uint32_t serialice_io_read(uint16_t port, unsigned int size);
 void serialice_io_write(uint16_t port, unsigned int size, uint32_t data);
 
@@ -69,15 +63,20 @@ void serialice_log_load(int caught, uint32_t addr, uint32_t result,
 int serialice_handle_store(uint32_t addr, uint32_t val, unsigned int data_size);
 
 /* serialice protocol */
-uint32_t serialice_io_read_wrapper(uint16_t port, unsigned int size);
-void serialice_io_write_wrapper(uint16_t port, unsigned int size, uint32_t data);
-
-uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size);
-void serialice_store_wrapper(uint32_t addr, unsigned int size, uint32_t data);
-
-void serialice_rdmsr_wrapper(uint32_t addr, uint32_t key, uint32_t *hi, uint32_t *lo);
-void serialice_wrmsr_wrapper(uint32_t addr, uint32_t key, uint32_t hi, uint32_t lo);
-void serialice_cpuid_wrapper(uint32_t eax, uint32_t ecx, cpuid_regs_t * ret);
+typedef struct {
+    void (*version) (void);
+    void (*mainboard) (void);
+    uint32_t (*io_read) (uint16_t port, unsigned int size);
+    void (*io_write) (uint16_t port, unsigned int size, uint32_t data);
+    uint32_t (*load) (uint32_t addr, unsigned int size);
+    void (*store) (uint32_t addr, unsigned int size, uint32_t data);
+    void (*rdmsr) (uint32_t addr, uint32_t key, uint32_t * hi, uint32_t * lo);
+    void (*wrmsr) (uint32_t addr, uint32_t key, uint32_t hi, uint32_t lo);
+    void (*cpuid) (uint32_t eax, uint32_t ecx, cpuid_regs_t * ret);
+} SerialICE_target;
+
+const SerialICE_target *serialice_serial_init(void);
+void serialice_serial_exit(void);
 
 /* serialice LUA */
 int serialice_io_read_filter(uint32_t * data, uint16_t port, int size);



More information about the SerialICE mailing list