core: Deinitialize GDB in avr_terminate()
[simavr] / simavr / sim / sim_gdb.c
index d5313fd..faa016f 100644 (file)
@@ -32,6 +32,7 @@
 #include <poll.h>
 #include <pthread.h>
 #include "sim_avr.h"
+#include "sim_core.h" // for SET_SREG_FROM, READ_SREG_INTO
 #include "sim_hex.h"
 #include "avr_eeprom.h"
 #include "sim_gdb.h"
@@ -210,6 +211,7 @@ static int gdb_write_register(avr_gdb_t * g, int regi, uint8_t * src)
                        return 1;
                case 32:
                        g->avr->data[R_SREG] = *src;
+                       SET_SREG_FROM(g->avr, *src);
                        return 1;
                case 33:
                        g->avr->data[R_SPL] = src[0];
@@ -228,8 +230,11 @@ static int gdb_read_register(avr_gdb_t * g, int regi, char * rep)
                case 0 ... 31:
                        sprintf(rep, "%02x", g->avr->data[regi]);
                        break;
-               case 32:
-                       sprintf(rep, "%02x", g->avr->data[R_SREG]);
+               case 32: {
+                               uint8_t sreg;
+                               READ_SREG_INTO(g->avr, sreg);
+                               sprintf(rep, "%02x", sreg);
+                       }
                        break;
                case 33:
                        sprintf(rep, "%02x%02x", g->avr->data[R_SPL], g->avr->data[R_SPH]);
@@ -303,11 +308,11 @@ static void gdb_handle_command(avr_gdb_t * g, char * cmd)
                        } else if (addr >= 0x800000 && (addr - 0x800000) == avr->ramend+1 && len == 2) {
                                // Allow GDB to read a value just after end of stack.
                                // This is necessary to make instruction stepping work when stack is empty
-                               printf("GDB read just past end of stack %08x, %08x; returning zero\n", addr, len);
+                               AVR_LOG(avr, LOG_TRACE, "GDB: read just past end of stack %08x, %08x; returning zero\n", addr, len);
                                gdb_send_reply(g, "0000");
                                break;
                        } else {
-                               printf("read memory error %08x, %08x (ramend %04x)\n", addr, len, avr->ramend+1);
+                               AVR_LOG(avr, LOG_ERROR, "GDB: read memory error %08x, %08x (ramend %04x)\n", addr, len, avr->ramend+1);
                                gdb_send_reply(g, "E01");
                                break;
                        }
@@ -339,7 +344,7 @@ static void gdb_handle_command(avr_gdb_t * g, char * cmd)
                                avr_ioctl(avr, AVR_IOCTL_EEPROM_SET, &ee);
                                gdb_send_reply(g, "OK");                                                        
                        } else {
-                               printf("write memory error %08x, %08x\n", addr, len);
+                               AVR_LOG(avr, LOG_ERROR, "GDB: write memory error %08x, %08x\n", addr, len);
                                gdb_send_reply(g, "E01");
                        }               
                }       break;
@@ -532,7 +537,7 @@ int avr_gdb_init(avr_t * avr)
        avr->gdb = NULL;
 
        if ((g->listen = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
-               fprintf(stderr, "Can't create socket: %s", strerror(errno));
+               AVR_LOG(avr, LOG_ERROR, "GDB: Can't create socket: %s", strerror(errno));
                return -1;
        }
 
@@ -544,7 +549,7 @@ int avr_gdb_init(avr_t * avr)
        address.sin_port = htons (avr->gdb_port);
 
        if (bind(g->listen, (struct sockaddr *) &address, sizeof(address))) {
-               fprintf(stderr, "Can not bind socket: %s", strerror(errno));
+               AVR_LOG(avr, LOG_ERROR, "GDB: Can not bind socket: %s", strerror(errno));
                return -1;
        }
        if (listen(g->listen, 1)) {
@@ -561,3 +566,12 @@ int avr_gdb_init(avr_t * avr)
        
        return 0;
 }
+
+void avr_deinit_gdb(avr_t * avr)
+{
+       if (avr->gdb->listen != -1)
+          close(avr->gdb->listen);
+       if (avr->gdb->s != -1)
+          close(avr->gdb->s);
+       free(avr->gdb);
+}