SATN fixes (Blue Swirl).
[qemu] / hw / slavio_misc.c
index 597a0cb..904f44e 100644 (file)
@@ -44,7 +44,7 @@ typedef struct MiscState {
     int irq;
     uint8_t config;
     uint8_t aux1, aux2;
-    uint8_t diag, mctrl;
+    uint8_t diag, mctrl, sysctrl;
 } MiscState;
 
 #define MISC_MAXADDR 1
@@ -64,7 +64,7 @@ static void slavio_misc_reset(void *opaque)
 {
     MiscState *s = opaque;
 
-    // Diagnostic register not cleared in reset
+    // Diagnostic and system control registers not cleared in reset
     s->config = s->aux1 = s->aux2 = s->mctrl = 0;
 }
 
@@ -116,15 +116,16 @@ static void slavio_misc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32
        break;
     case 0x1f00000:
        MISC_DPRINTF("Write system control %2.2x\n", val & 0xff);
-       if (val & 1)
+       if (val & 1) {
+           s->sysctrl = 0x2;
            qemu_system_reset_request();
+       }
        break;
     case 0xa000000:
        MISC_DPRINTF("Write power management %2.2x\n", val & 0xff);
 #if 0
-       // XXX: halting CPU does not work
-       raise_exception(EXCP_HLT);
-       cpu_loop_exit();
+        // XXX almost works
+        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT);
 #endif
        break;
     }
@@ -158,6 +159,7 @@ static uint32_t slavio_misc_mem_readb(void *opaque, target_phys_addr_t addr)
        break;
     case 0x1f00000:
        MISC_DPRINTF("Read system control %2.2x\n", ret);
+       ret = s->sysctrl;
        break;
     case 0xa000000:
        MISC_DPRINTF("Read power management %2.2x\n", ret);
@@ -188,6 +190,7 @@ static void slavio_misc_save(QEMUFile *f, void *opaque)
     qemu_put_8s(f, &s->aux2);
     qemu_put_8s(f, &s->diag);
     qemu_put_8s(f, &s->mctrl);
+    qemu_put_8s(f, &s->sysctrl);
 }
 
 static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id)
@@ -203,6 +206,7 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id)
     qemu_get_8s(f, &s->aux2);
     qemu_get_8s(f, &s->diag);
     qemu_get_8s(f, &s->mctrl);
+    qemu_get_8s(f, &s->sysctrl);
     return 0;
 }