use RT signal for /dev/rtc - restore stdin flags (Bob Barry) - cpu save fix (Johannes Schindelin)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@970 c046a42c-6fe2-441c-8c8c-71466251a162
diff --git a/vl.c b/vl.c
index 3dee9d3..2c3c72d 100644
--- a/vl.c
+++ b/vl.c
@@ -787,6 +787,35 @@
 static void host_alarm_handler(int host_signum)
 #endif
 {
+#if 0
+#define DISP_FREQ 1000
+    {
+        static int64_t delta_min = INT64_MAX;
+        static int64_t delta_max, delta_cum, last_clock, delta, ti;
+        static int count;
+        ti = qemu_get_clock(vm_clock);
+        if (last_clock != 0) {
+            delta = ti - last_clock;
+            if (delta < delta_min)
+                delta_min = delta;
+            if (delta > delta_max)
+                delta_max = delta;
+            delta_cum += delta;
+            if (++count == DISP_FREQ) {
+                printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
+                       muldiv64(delta_min, 1000000, ticks_per_sec),
+                       muldiv64(delta_max, 1000000, ticks_per_sec),
+                       muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
+                       (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
+                count = 0;
+                delta_min = INT64_MAX;
+                delta_max = 0;
+                delta_cum = 0;
+            }
+        }
+        last_clock = ti;
+    }
+#endif
     if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
                            qemu_get_clock(vm_clock)) ||
         qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
@@ -892,7 +921,8 @@
             setitimer(ITIMER_REAL, &itv, NULL);
 
             /* use the RTC */
-            sigaction(SIGIO, &act, NULL);
+            sigaction(SIGRTMIN, &act, NULL);
+            fcntl(rtc_fd, F_SETSIG, SIGRTMIN);
             fcntl(rtc_fd, F_SETFL, O_ASYNC);
             fcntl(rtc_fd, F_SETOWN, getpid());
         } else {
@@ -1184,10 +1214,12 @@
 
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
+static int old_fd0_flags;
 
 static void term_exit(void)
 {
     tcsetattr (0, TCSANOW, &oldtty);
+    fcntl(0, F_SETFL, old_fd0_flags);
 }
 
 static void term_init(void)
@@ -1196,6 +1228,7 @@
 
     tcgetattr (0, &tty);
     oldtty = tty;
+    old_fd0_flags = fcntl(0, F_GETFL);
 
     tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
                           |INLCR|IGNCR|ICRNL|IXON);
@@ -1570,6 +1603,7 @@
 
 static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
 {
+    qemu_put_be32(f, dt->selector);
     qemu_put_be32(f, (uint32_t)dt->base);
     qemu_put_be32(f, dt->limit);
     qemu_put_be32(f, dt->flags);
@@ -1577,6 +1611,7 @@
 
 static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
 {
+    dt->selector = qemu_get_be32(f);
     dt->base = (uint8_t *)qemu_get_be32(f);
     dt->limit = qemu_get_be32(f);
     dt->flags = qemu_get_be32(f);
@@ -1650,7 +1685,7 @@
     uint32_t hflags;
     uint16_t fpus, fpuc, fptag;
 
-    if (version_id != 1)
+    if (version_id != 2)
         return -EINVAL;
     for(i = 0; i < 8; i++)
         qemu_get_be32s(f, &env->regs[i]);
@@ -2683,7 +2718,7 @@
     cpu_single_env = env;
 
     register_savevm("timer", 0, 1, timer_save, timer_load, env);
-    register_savevm("cpu", 0, 1, cpu_save, cpu_load, env);
+    register_savevm("cpu", 0, 2, cpu_save, cpu_load, env);
     register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
     qemu_register_reset(main_cpu_reset, global_env);