Add dumping
authorLauri Kasanen <cand@gmx.com>
Fri, 28 May 2021 08:40:27 +0000 (11:40 +0300)
committerLauri Kasanen <cand@gmx.com>
Fri, 28 May 2021 08:40:27 +0000 (11:40 +0300)
main.c

diff --git a/main.c b/main.c
index 5012602b756c5ffd7bca90933be29543386ae2d4..d3d1e97687b6009c1bef3e9efb51469b5d96021c 100644 (file)
--- a/main.c
+++ b/main.c
@@ -197,6 +197,43 @@ static void load(const char arg[], uint8_t *ram) {
        fclose(f);
 }
 
+static void dump(const char src[], const uint8_t ram[]) {
+       const char *ptr = strchr(src, ':');
+       if (!ptr) {
+               printf("Invalid dump\n");
+               exit(1);
+       }
+
+       char name[PATH_MAX];
+       memcpy(name, src, ptr - src);
+       name[ptr - src] = '\0';
+
+       ptr++;
+       const uint32_t addr = strtol(ptr, NULL, 0);
+
+       ptr = strchr(ptr, ':');
+       if (!ptr) {
+               printf("Invalid dump\n");
+               exit(1);
+       }
+
+       ptr++;
+       const uint32_t len = strtol(ptr, NULL, 0);
+
+       //printf("Saving to %s, from %x, len %u\n", name, addr, len);
+
+       FILE *f = fopen(name, "w");
+       if (!f) {
+               printf("Can't open %s\n", name);
+               exit(1);
+       }
+
+       if (fwrite(&ram[addr], len, 1, f) != 1)
+               abort();
+
+       fclose(f);
+}
+
 static void setfpregs(const int vcpu, struct kvm_fpu *fpregs) {
        // KVM_[SG]ET_FPU isn't supported on PPC, we have to move individual regs...
        unsigned i;
@@ -407,6 +444,11 @@ int main(int argc, char **argv) {
                printf("Exited because %u\n", run->exit_reason);
        }
 
+       unsigned i;
+       for (i = 0; i < num_dumps; i++) {
+               dump(dumps[i], ram);
+       }
+
        close(kvm);
        free(progmem);
        free(ram);