Revision d0f2c4c6 hw/hpet.c
b/hw/hpet.c | ||
---|---|---|
32 | 32 |
|
33 | 33 |
//#define HPET_DEBUG |
34 | 34 |
#ifdef HPET_DEBUG |
35 |
#define dprintf printf
|
|
35 |
#define DPRINTF printf
|
|
36 | 36 |
#else |
37 |
#define dprintf(...)
|
|
37 |
#define DPRINTF(...)
|
|
38 | 38 |
#endif |
39 | 39 |
|
40 | 40 |
static HPETState *hpet_statep; |
... | ... | |
288 | 288 |
HPETState *s = (HPETState *)opaque; |
289 | 289 |
uint64_t cur_tick, index; |
290 | 290 |
|
291 |
dprintf("qemu: Enter hpet_ram_readl at %" PRIx64 "\n", addr);
|
|
291 |
DPRINTF("qemu: Enter hpet_ram_readl at %" PRIx64 "\n", addr);
|
|
292 | 292 |
index = addr; |
293 | 293 |
/*address range of all TN regs*/ |
294 | 294 |
if (index >= 0x100 && index <= 0x3ff) { |
... | ... | |
311 | 311 |
case HPET_TN_ROUTE: |
312 | 312 |
return timer->fsb >> 32; |
313 | 313 |
default: |
314 |
dprintf("qemu: invalid hpet_ram_readl\n");
|
|
314 |
DPRINTF("qemu: invalid hpet_ram_readl\n");
|
|
315 | 315 |
break; |
316 | 316 |
} |
317 | 317 |
} else { |
... | ... | |
323 | 323 |
case HPET_CFG: |
324 | 324 |
return s->config; |
325 | 325 |
case HPET_CFG + 4: |
326 |
dprintf("qemu: invalid HPET_CFG + 4 hpet_ram_readl \n");
|
|
326 |
DPRINTF("qemu: invalid HPET_CFG + 4 hpet_ram_readl \n");
|
|
327 | 327 |
return 0; |
328 | 328 |
case HPET_COUNTER: |
329 | 329 |
if (hpet_enabled()) |
330 | 330 |
cur_tick = hpet_get_ticks(); |
331 | 331 |
else |
332 | 332 |
cur_tick = s->hpet_counter; |
333 |
dprintf("qemu: reading counter = %" PRIx64 "\n", cur_tick);
|
|
333 |
DPRINTF("qemu: reading counter = %" PRIx64 "\n", cur_tick);
|
|
334 | 334 |
return cur_tick; |
335 | 335 |
case HPET_COUNTER + 4: |
336 | 336 |
if (hpet_enabled()) |
337 | 337 |
cur_tick = hpet_get_ticks(); |
338 | 338 |
else |
339 | 339 |
cur_tick = s->hpet_counter; |
340 |
dprintf("qemu: reading counter + 4 = %" PRIx64 "\n", cur_tick);
|
|
340 |
DPRINTF("qemu: reading counter + 4 = %" PRIx64 "\n", cur_tick);
|
|
341 | 341 |
return cur_tick >> 32; |
342 | 342 |
case HPET_STATUS: |
343 | 343 |
return s->isr; |
344 | 344 |
default: |
345 |
dprintf("qemu: invalid hpet_ram_readl\n");
|
|
345 |
DPRINTF("qemu: invalid hpet_ram_readl\n");
|
|
346 | 346 |
break; |
347 | 347 |
} |
348 | 348 |
} |
... | ... | |
372 | 372 |
HPETState *s = (HPETState *)opaque; |
373 | 373 |
uint64_t old_val, new_val, val, index; |
374 | 374 |
|
375 |
dprintf("qemu: Enter hpet_ram_writel at %" PRIx64 " = %#x\n", addr, value);
|
|
375 |
DPRINTF("qemu: Enter hpet_ram_writel at %" PRIx64 " = %#x\n", addr, value);
|
|
376 | 376 |
index = addr; |
377 | 377 |
old_val = hpet_ram_readl(opaque, addr); |
378 | 378 |
new_val = value; |
... | ... | |
380 | 380 |
/*address range of all TN regs*/ |
381 | 381 |
if (index >= 0x100 && index <= 0x3ff) { |
382 | 382 |
uint8_t timer_id = (addr - 0x100) / 0x20; |
383 |
dprintf("qemu: hpet_ram_writel timer_id = %#x \n", timer_id);
|
|
383 |
DPRINTF("qemu: hpet_ram_writel timer_id = %#x \n", timer_id);
|
|
384 | 384 |
HPETTimer *timer = &s->timer[timer_id]; |
385 | 385 |
|
386 | 386 |
switch ((addr - 0x100) % 0x20) { |
387 | 387 |
case HPET_TN_CFG: |
388 |
dprintf("qemu: hpet_ram_writel HPET_TN_CFG\n");
|
|
388 |
DPRINTF("qemu: hpet_ram_writel HPET_TN_CFG\n");
|
|
389 | 389 |
val = hpet_fixup_reg(new_val, old_val, HPET_TN_CFG_WRITE_MASK); |
390 | 390 |
timer->config = (timer->config & 0xffffffff00000000ULL) | val; |
391 | 391 |
if (new_val & HPET_TN_32BIT) { |
... | ... | |
399 | 399 |
|
400 | 400 |
break; |
401 | 401 |
case HPET_TN_CFG + 4: // Interrupt capabilities |
402 |
dprintf("qemu: invalid HPET_TN_CFG+4 write\n");
|
|
402 |
DPRINTF("qemu: invalid HPET_TN_CFG+4 write\n");
|
|
403 | 403 |
break; |
404 | 404 |
case HPET_TN_CMP: // comparator register |
405 |
dprintf("qemu: hpet_ram_writel HPET_TN_CMP \n");
|
|
405 |
DPRINTF("qemu: hpet_ram_writel HPET_TN_CMP \n");
|
|
406 | 406 |
if (timer->config & HPET_TN_32BIT) |
407 | 407 |
new_val = (uint32_t)new_val; |
408 | 408 |
if (!timer_is_periodic(timer) || |
... | ... | |
423 | 423 |
hpet_set_timer(timer); |
424 | 424 |
break; |
425 | 425 |
case HPET_TN_CMP + 4: // comparator register high order |
426 |
dprintf("qemu: hpet_ram_writel HPET_TN_CMP + 4\n");
|
|
426 |
DPRINTF("qemu: hpet_ram_writel HPET_TN_CMP + 4\n");
|
|
427 | 427 |
if (!timer_is_periodic(timer) || |
428 | 428 |
(timer->config & HPET_TN_SETVAL)) |
429 | 429 |
timer->cmp = (timer->cmp & 0xffffffffULL) |
... | ... | |
443 | 443 |
hpet_set_timer(timer); |
444 | 444 |
break; |
445 | 445 |
case HPET_TN_ROUTE + 4: |
446 |
dprintf("qemu: hpet_ram_writel HPET_TN_ROUTE + 4\n");
|
|
446 |
DPRINTF("qemu: hpet_ram_writel HPET_TN_ROUTE + 4\n");
|
|
447 | 447 |
break; |
448 | 448 |
default: |
449 |
dprintf("qemu: invalid hpet_ram_writel\n");
|
|
449 |
DPRINTF("qemu: invalid hpet_ram_writel\n");
|
|
450 | 450 |
break; |
451 | 451 |
} |
452 | 452 |
return; |
... | ... | |
479 | 479 |
} |
480 | 480 |
break; |
481 | 481 |
case HPET_CFG + 4: |
482 |
dprintf("qemu: invalid HPET_CFG+4 write \n");
|
|
482 |
DPRINTF("qemu: invalid HPET_CFG+4 write \n");
|
|
483 | 483 |
break; |
484 | 484 |
case HPET_STATUS: |
485 | 485 |
/* FIXME: need to handle level-triggered interrupts */ |
... | ... | |
489 | 489 |
printf("qemu: Writing counter while HPET enabled!\n"); |
490 | 490 |
s->hpet_counter = (s->hpet_counter & 0xffffffff00000000ULL) |
491 | 491 |
| value; |
492 |
dprintf("qemu: HPET counter written. ctr = %#x -> %" PRIx64 "\n",
|
|
492 |
DPRINTF("qemu: HPET counter written. ctr = %#x -> %" PRIx64 "\n",
|
|
493 | 493 |
value, s->hpet_counter); |
494 | 494 |
break; |
495 | 495 |
case HPET_COUNTER + 4: |
... | ... | |
497 | 497 |
printf("qemu: Writing counter while HPET enabled!\n"); |
498 | 498 |
s->hpet_counter = (s->hpet_counter & 0xffffffffULL) |
499 | 499 |
| (((uint64_t)value) << 32); |
500 |
dprintf("qemu: HPET counter + 4 written. ctr = %#x -> %" PRIx64 "\n",
|
|
500 |
DPRINTF("qemu: HPET counter + 4 written. ctr = %#x -> %" PRIx64 "\n",
|
|
501 | 501 |
value, s->hpet_counter); |
502 | 502 |
break; |
503 | 503 |
default: |
504 |
dprintf("qemu: invalid hpet_ram_writel\n");
|
|
504 |
DPRINTF("qemu: invalid hpet_ram_writel\n");
|
|
505 | 505 |
break; |
506 | 506 |
} |
507 | 507 |
} |
... | ... | |
568 | 568 |
int i, iomemtype; |
569 | 569 |
HPETState *s; |
570 | 570 |
|
571 |
dprintf ("hpet_init\n");
|
|
571 |
DPRINTF ("hpet_init\n");
|
|
572 | 572 |
|
573 | 573 |
s = qemu_mallocz(sizeof(HPETState)); |
574 | 574 |
hpet_statep = s; |
Also available in: Unified diff