Commit 02ba45c5362011ce323c69f04b49fe61663a68e3

Authored by bellard
1 parent 107db443

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
Showing 1 changed file with 38 additions and 3 deletions
@@ -787,6 +787,35 @@ void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg, @@ -787,6 +787,35 @@ void CALLBACK host_alarm_handler(UINT uTimerID, UINT uMsg,
787 static void host_alarm_handler(int host_signum) 787 static void host_alarm_handler(int host_signum)
788 #endif 788 #endif
789 { 789 {
  790 +#if 0
  791 +#define DISP_FREQ 1000
  792 + {
  793 + static int64_t delta_min = INT64_MAX;
  794 + static int64_t delta_max, delta_cum, last_clock, delta, ti;
  795 + static int count;
  796 + ti = qemu_get_clock(vm_clock);
  797 + if (last_clock != 0) {
  798 + delta = ti - last_clock;
  799 + if (delta < delta_min)
  800 + delta_min = delta;
  801 + if (delta > delta_max)
  802 + delta_max = delta;
  803 + delta_cum += delta;
  804 + if (++count == DISP_FREQ) {
  805 + printf("timer: min=%lld us max=%lld us avg=%lld us avg_freq=%0.3f Hz\n",
  806 + muldiv64(delta_min, 1000000, ticks_per_sec),
  807 + muldiv64(delta_max, 1000000, ticks_per_sec),
  808 + muldiv64(delta_cum, 1000000 / DISP_FREQ, ticks_per_sec),
  809 + (double)ticks_per_sec / ((double)delta_cum / DISP_FREQ));
  810 + count = 0;
  811 + delta_min = INT64_MAX;
  812 + delta_max = 0;
  813 + delta_cum = 0;
  814 + }
  815 + }
  816 + last_clock = ti;
  817 + }
  818 +#endif
790 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL], 819 if (qemu_timer_expired(active_timers[QEMU_TIMER_VIRTUAL],
791 qemu_get_clock(vm_clock)) || 820 qemu_get_clock(vm_clock)) ||
792 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME], 821 qemu_timer_expired(active_timers[QEMU_TIMER_REALTIME],
@@ -892,7 +921,8 @@ static void init_timers(void) @@ -892,7 +921,8 @@ static void init_timers(void)
892 setitimer(ITIMER_REAL, &itv, NULL); 921 setitimer(ITIMER_REAL, &itv, NULL);
893 922
894 /* use the RTC */ 923 /* use the RTC */
895 - sigaction(SIGIO, &act, NULL); 924 + sigaction(SIGRTMIN, &act, NULL);
  925 + fcntl(rtc_fd, F_SETSIG, SIGRTMIN);
896 fcntl(rtc_fd, F_SETFL, O_ASYNC); 926 fcntl(rtc_fd, F_SETFL, O_ASYNC);
897 fcntl(rtc_fd, F_SETOWN, getpid()); 927 fcntl(rtc_fd, F_SETOWN, getpid());
898 } else { 928 } else {
@@ -1184,10 +1214,12 @@ static void term_init(void) @@ -1184,10 +1214,12 @@ static void term_init(void)
1184 1214
1185 /* init terminal so that we can grab keys */ 1215 /* init terminal so that we can grab keys */
1186 static struct termios oldtty; 1216 static struct termios oldtty;
  1217 +static int old_fd0_flags;
1187 1218
1188 static void term_exit(void) 1219 static void term_exit(void)
1189 { 1220 {
1190 tcsetattr (0, TCSANOW, &oldtty); 1221 tcsetattr (0, TCSANOW, &oldtty);
  1222 + fcntl(0, F_SETFL, old_fd0_flags);
1191 } 1223 }
1192 1224
1193 static void term_init(void) 1225 static void term_init(void)
@@ -1196,6 +1228,7 @@ static void term_init(void) @@ -1196,6 +1228,7 @@ static void term_init(void)
1196 1228
1197 tcgetattr (0, &tty); 1229 tcgetattr (0, &tty);
1198 oldtty = tty; 1230 oldtty = tty;
  1231 + old_fd0_flags = fcntl(0, F_GETFL);
1199 1232
1200 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP 1233 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1201 |INLCR|IGNCR|ICRNL|IXON); 1234 |INLCR|IGNCR|ICRNL|IXON);
@@ -1570,6 +1603,7 @@ int qemu_loadvm(const char *filename) @@ -1570,6 +1603,7 @@ int qemu_loadvm(const char *filename)
1570 1603
1571 static void cpu_put_seg(QEMUFile *f, SegmentCache *dt) 1604 static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
1572 { 1605 {
  1606 + qemu_put_be32(f, dt->selector);
1573 qemu_put_be32(f, (uint32_t)dt->base); 1607 qemu_put_be32(f, (uint32_t)dt->base);
1574 qemu_put_be32(f, dt->limit); 1608 qemu_put_be32(f, dt->limit);
1575 qemu_put_be32(f, dt->flags); 1609 qemu_put_be32(f, dt->flags);
@@ -1577,6 +1611,7 @@ static void cpu_put_seg(QEMUFile *f, SegmentCache *dt) @@ -1577,6 +1611,7 @@ static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
1577 1611
1578 static void cpu_get_seg(QEMUFile *f, SegmentCache *dt) 1612 static void cpu_get_seg(QEMUFile *f, SegmentCache *dt)
1579 { 1613 {
  1614 + dt->selector = qemu_get_be32(f);
1580 dt->base = (uint8_t *)qemu_get_be32(f); 1615 dt->base = (uint8_t *)qemu_get_be32(f);
1581 dt->limit = qemu_get_be32(f); 1616 dt->limit = qemu_get_be32(f);
1582 dt->flags = qemu_get_be32(f); 1617 dt->flags = qemu_get_be32(f);
@@ -1650,7 +1685,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) @@ -1650,7 +1685,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
1650 uint32_t hflags; 1685 uint32_t hflags;
1651 uint16_t fpus, fpuc, fptag; 1686 uint16_t fpus, fpuc, fptag;
1652 1687
1653 - if (version_id != 1) 1688 + if (version_id != 2)
1654 return -EINVAL; 1689 return -EINVAL;
1655 for(i = 0; i < 8; i++) 1690 for(i = 0; i < 8; i++)
1656 qemu_get_be32s(f, &env->regs[i]); 1691 qemu_get_be32s(f, &env->regs[i]);
@@ -2683,7 +2718,7 @@ int main(int argc, char **argv) @@ -2683,7 +2718,7 @@ int main(int argc, char **argv)
2683 cpu_single_env = env; 2718 cpu_single_env = env;
2684 2719
2685 register_savevm("timer", 0, 1, timer_save, timer_load, env); 2720 register_savevm("timer", 0, 1, timer_save, timer_load, env);
2686 - register_savevm("cpu", 0, 1, cpu_save, cpu_load, env); 2721 + register_savevm("cpu", 0, 2, cpu_save, cpu_load, env);
2687 register_savevm("ram", 0, 1, ram_save, ram_load, NULL); 2722 register_savevm("ram", 0, 1, ram_save, ram_load, NULL);
2688 qemu_register_reset(main_cpu_reset, global_env); 2723 qemu_register_reset(main_cpu_reset, global_env);
2689 2724