Annotation of qemu/hw/mips_timer.c, revision 1.1.1.1

1.1       root        1: #include "vl.h"
                      2: 
                      3: void cpu_mips_irqctrl_init (void)
                      4: {
                      5: }
                      6: 
                      7: /* XXX: do not use a global */
                      8: uint32_t cpu_mips_get_random (CPUState *env)
                      9: {
                     10:     static uint32_t seed = 0;
                     11:     uint32_t idx;
                     12:     seed = seed * 314159 + 1;
                     13:     idx = (seed >> 16) % (MIPS_TLB_NB - env->CP0_Wired) + env->CP0_Wired;
                     14:     return idx;
                     15: }
                     16: 
                     17: /* MIPS R4K timer */
                     18: uint32_t cpu_mips_get_count (CPUState *env)
                     19: {
                     20:     return env->CP0_Count +
                     21:         (uint32_t)muldiv64(qemu_get_clock(vm_clock),
                     22:                            100 * 1000 * 1000, ticks_per_sec);
                     23: }
                     24: 
                     25: static void cpu_mips_update_count (CPUState *env, uint32_t count,
                     26:                                    uint32_t compare)
                     27: {
                     28:     uint64_t now, next;
                     29:     uint32_t tmp;
                     30: 
                     31:     tmp = count;
                     32:     if (count == compare)
                     33:         tmp++;
                     34:     now = qemu_get_clock(vm_clock);
                     35:     next = now + muldiv64(compare - tmp, ticks_per_sec, 100 * 1000 * 1000);
                     36:     if (next == now)
                     37:        next++;
                     38: #if 0
                     39:     if (logfile) {
                     40:         fprintf(logfile, "%s: 0x%08" PRIx64 " %08x %08x => 0x%08" PRIx64 "\n",
                     41:                 __func__, now, count, compare, next - now);
                     42:     }
                     43: #endif
                     44:     /* Store new count and compare registers */
                     45:     env->CP0_Compare = compare;
                     46:     env->CP0_Count =
                     47:         count - (uint32_t)muldiv64(now, 100 * 1000 * 1000, ticks_per_sec);
                     48:     /* Adjust timer */
                     49:     qemu_mod_timer(env->timer, next);
                     50: }
                     51: 
                     52: void cpu_mips_store_count (CPUState *env, uint32_t value)
                     53: {
                     54:     cpu_mips_update_count(env, value, env->CP0_Compare);
                     55: }
                     56: 
                     57: void cpu_mips_store_compare (CPUState *env, uint32_t value)
                     58: {
                     59:     cpu_mips_update_count(env, cpu_mips_get_count(env), value);
                     60:     cpu_mips_irq_request(env, 7, 0);
                     61: }
                     62: 
                     63: static void mips_timer_cb (void *opaque)
                     64: {
                     65:     CPUState *env;
                     66: 
                     67:     env = opaque;
                     68: #if 0
                     69:     if (logfile) {
                     70:         fprintf(logfile, "%s\n", __func__);
                     71:     }
                     72: #endif
                     73:     cpu_mips_update_count(env, cpu_mips_get_count(env), env->CP0_Compare);
                     74:     cpu_mips_irq_request(env, 7, 1);
                     75: }
                     76: 
                     77: void cpu_mips_clock_init (CPUState *env)
                     78: {
                     79:     env->timer = qemu_new_timer(vm_clock, &mips_timer_cb, env);
                     80:     env->CP0_Compare = 0;
                     81:     cpu_mips_update_count(env, 1, 0);
                     82: }
                     83: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.