This patch fixes two bugs in cuda emulation:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 23 Apr 2005 18:16:54 +0000 (18:16 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sat, 23 Apr 2005 18:16:54 +0000 (18:16 +0000)
- the CUDA timer is always triggered twice, with current code
- SET_TIME command is supposed to send back a 7 bytes packet
(Jocelyn Mayer)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1380 c046a42c-6fe2-441c-8c8c-71466251a162

hw/cuda.c

index b196862..7eea042 100644 (file)
--- a/hw/cuda.c
+++ b/hw/cuda.c
@@ -178,17 +178,20 @@ static int64_t get_next_irq_time(CUDATimer *s, int64_t current_time)
     /* current counter value */
     d = muldiv64(current_time - s->load_time, 
                  CUDA_TIMER_FREQ, ticks_per_sec);
-    if (d <= s->counter_value) {
+    if (d < s->counter_value) {
         next_time = s->counter_value + 1;
-    } else {
-        base = ((d - s->counter_value) / s->latch);
+    } else
+    {
+        base = ((d - s->counter_value + 1) / s->latch);
         base = (base * s->latch) + s->counter_value;
         next_time = base + s->latch;
     }
+#if 0
 #ifdef DEBUG_CUDA
     printf("latch=%d counter=%lld delta_next=%lld\n", 
            s->latch, d, next_time - d);
 #endif
+#endif
     next_time = muldiv64(next_time, ticks_per_sec, CUDA_TIMER_FREQ) + 
         s->load_time;
     if (next_time <= current_time)
@@ -505,6 +508,7 @@ static void cuda_receive_packet(CUDAState *s,
         cuda_send_packet_to_host(s, obuf, 2);
         break;
     case CUDA_GET_TIME:
+    case CUDA_SET_TIME:
         /* XXX: add time support ? */
         ti = time(NULL) + RTC_OFFSET;
         obuf[0] = CUDA_PACKET;
@@ -516,7 +520,6 @@ static void cuda_receive_packet(CUDAState *s,
         obuf[6] = ti;
         cuda_send_packet_to_host(s, obuf, 7);
         break;
-    case CUDA_SET_TIME:
     case CUDA_FILE_SERVER_FLAG:
     case CUDA_SET_DEVICE_LIST:
     case CUDA_SET_AUTO_RATE: