Commit 13ab5daa86d3b802fc3a2e5959ecc8cb1aadd310
1 parent
ef792f9d
NVRAM fixes (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@815 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
37 additions
and
6 deletions
hw/m48t59.c
... | ... | @@ -24,9 +24,9 @@ |
24 | 24 | #include "vl.h" |
25 | 25 | #include "m48t59.h" |
26 | 26 | |
27 | -//#define NVRAM_DEBUG | |
27 | +//#define DEBUG_NVRAM | |
28 | 28 | |
29 | -#if defined(NVRAM_DEBUG) | |
29 | +#if defined(DEBUG_NVRAM) | |
30 | 30 | #define NVRAM_PRINTF(fmt, args...) do { printf(fmt , ##args); } while (0) |
31 | 31 | #else |
32 | 32 | #define NVRAM_PRINTF(fmt, args...) do { } while (0) |
... | ... | @@ -45,6 +45,7 @@ struct m48t59_t { |
45 | 45 | struct QEMUTimer *alrm_timer; |
46 | 46 | struct QEMUTimer *wd_timer; |
47 | 47 | /* NVRAM storage */ |
48 | + uint8_t lock; | |
48 | 49 | uint16_t addr; |
49 | 50 | uint8_t *buffer; |
50 | 51 | }; |
... | ... | @@ -152,7 +153,10 @@ static void watchdog_cb (void *opaque) |
152 | 153 | if (NVRAM->buffer[0x1FF7] & 0x80) { |
153 | 154 | NVRAM->buffer[0x1FF7] = 0x00; |
154 | 155 | NVRAM->buffer[0x1FFC] &= ~0x40; |
155 | - // reset_CPU(); | |
156 | + /* May it be a hw CPU Reset instead ? */ | |
157 | + reset_requested = 1; | |
158 | + printf("Watchdog reset...\n"); | |
159 | + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | |
156 | 160 | } else { |
157 | 161 | pic_set_irq(NVRAM->IRQ, 1); |
158 | 162 | pic_set_irq(NVRAM->IRQ, 0); |
... | ... | @@ -315,6 +319,11 @@ void m48t59_write (m48t59_t *NVRAM, uint32_t val) |
315 | 319 | } |
316 | 320 | break; |
317 | 321 | default: |
322 | + /* Check lock registers state */ | |
323 | + if (NVRAM->addr >= 0x20 && NVRAM->addr <= 0x2F && (NVRAM->lock & 1)) | |
324 | + break; | |
325 | + if (NVRAM->addr >= 0x30 && NVRAM->addr <= 0x3F && (NVRAM->lock & 2)) | |
326 | + break; | |
318 | 327 | if (NVRAM->addr < 0x1FF0 || |
319 | 328 | (NVRAM->addr > 0x1FFF && NVRAM->addr < NVRAM->size)) { |
320 | 329 | NVRAM->buffer[NVRAM->addr] = val & 0xFF; |
... | ... | @@ -394,6 +403,11 @@ uint32_t m48t59_read (m48t59_t *NVRAM) |
394 | 403 | retval = toBCD(tm.tm_year); |
395 | 404 | break; |
396 | 405 | default: |
406 | + /* Check lock registers state */ | |
407 | + if (NVRAM->addr >= 0x20 && NVRAM->addr <= 0x2F && (NVRAM->lock & 1)) | |
408 | + break; | |
409 | + if (NVRAM->addr >= 0x30 && NVRAM->addr <= 0x3F && (NVRAM->lock & 2)) | |
410 | + break; | |
397 | 411 | if (NVRAM->addr < 0x1FF0 || |
398 | 412 | (NVRAM->addr > 0x1FFF && NVRAM->addr < NVRAM->size)) { |
399 | 413 | do_read: |
... | ... | @@ -412,12 +426,18 @@ void m48t59_set_addr (m48t59_t *NVRAM, uint32_t addr) |
412 | 426 | NVRAM->addr = addr; |
413 | 427 | } |
414 | 428 | |
429 | +void m48t59_toggle_lock (m48t59_t *NVRAM, int lock) | |
430 | +{ | |
431 | + NVRAM->lock ^= 1 << lock; | |
432 | +} | |
433 | + | |
415 | 434 | /* IO access to NVRAM */ |
416 | 435 | static void NVRAM_writeb (void *opaque, uint32_t addr, uint32_t val) |
417 | 436 | { |
418 | 437 | m48t59_t *NVRAM = opaque; |
419 | 438 | |
420 | 439 | addr -= NVRAM->io_base; |
440 | + NVRAM_PRINTF("0x%08x => 0x%08x\n", addr, val); | |
421 | 441 | switch (addr) { |
422 | 442 | case 0: |
423 | 443 | NVRAM->addr &= ~0x00FF; |
... | ... | @@ -439,11 +459,20 @@ static void NVRAM_writeb (void *opaque, uint32_t addr, uint32_t val) |
439 | 459 | static uint32_t NVRAM_readb (void *opaque, uint32_t addr) |
440 | 460 | { |
441 | 461 | m48t59_t *NVRAM = opaque; |
462 | + uint32_t retval; | |
442 | 463 | |
443 | - if (addr == NVRAM->io_base + 3) | |
444 | - return m48t59_read(NVRAM); | |
464 | + addr -= NVRAM->io_base; | |
465 | + switch (addr) { | |
466 | + case 3: | |
467 | + retval = m48t59_read(NVRAM); | |
468 | + break; | |
469 | + default: | |
470 | + retval = -1; | |
471 | + break; | |
472 | + } | |
473 | + NVRAM_PRINTF("0x%08x <= 0x%08x\n", addr, retval); | |
445 | 474 | |
446 | - return 0xFF; | |
475 | + return retval; | |
447 | 476 | } |
448 | 477 | |
449 | 478 | /* Initialisation routine */ |
... | ... | @@ -467,5 +496,7 @@ m48t59_t *m48t59_init (int IRQ, uint32_t io_base, uint16_t size) |
467 | 496 | register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s); |
468 | 497 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); |
469 | 498 | s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s); |
499 | + s->lock = 0; | |
500 | + | |
470 | 501 | return s; |
471 | 502 | } | ... | ... |