/[dynamips]/upstream/dynamips-0.2.6-RC3/mips64_jit.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /upstream/dynamips-0.2.6-RC3/mips64_jit.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

upstream/dynamips-0.2.5/mips64_jit.c revision 1 by dpavlin, Sat Oct 6 16:01:44 2007 UTC upstream/dynamips-0.2.6-RC3/mips64_jit.c revision 4 by dpavlin, Sat Oct 6 16:06:49 2007 UTC
# Line 660  int insn_block_local_addr(insn_block_t * Line 660  int insn_block_local_addr(insn_block_t *
660     return(0);     return(0);
661  }  }
662    
663    /* Check if PC register matches the compiled block virtual address */
664    static forced_inline int insn_block_match(cpu_mips_t *cpu,insn_block_t *block)
665    {
666       m_uint64_t vpage;
667    
668       vpage = cpu->pc & ~(m_uint64_t)MIPS_MIN_PAGE_IMASK;
669       return(block->start_pc == vpage);
670    }
671    
672  /* Execute a compiled MIPS code */  /* Execute a compiled MIPS code */
673  void *insn_block_execute(cpu_mips_t *cpu)  void *insn_block_execute(cpu_mips_t *cpu)
674  {    {  
675     pthread_t timer_irq_thread;     pthread_t timer_irq_thread;
676     insn_block_t *block;     insn_block_t *block;
677     m_uint32_t phys_page;     m_uint32_t phys_page;
    int idle_count = 0;  
678     int timer_irq_check = 0;     int timer_irq_check = 0;
679    
680     if (pthread_create(&timer_irq_thread,NULL,     if (pthread_create(&timer_irq_thread,NULL,
681                        (void *)mips64_timer_irq_run,cpu))                        (void *)mips64_timer_irq_run,cpu))
682     {     {
683        fprintf(stderr,"VM '%s': unable to create Timer IRQ thread for CPU%u.\n",        fprintf(stderr,
684                  "VM '%s': unable to create Timer IRQ thread for CPU%u.\n",
685                cpu->vm->name,cpu->id);                cpu->vm->name,cpu->id);
686        cpu_stop(cpu);        cpu_stop(cpu);
687        return NULL;        return NULL;
688     }     }
689    
690     cpu->cpu_thread_running = TRUE;     cpu->cpu_thread_running = TRUE;
691    
692   start_cpu:     start_cpu:  
693       cpu->idle_count = 0;
694    
695     for(;;) {     for(;;) {
696        if (unlikely(!cpu->pc) || unlikely(cpu->state != MIPS_CPU_RUNNING))        if (unlikely(cpu->state != MIPS_CPU_RUNNING))
697           break;           break;
698    
699        /* Handle virtual idle loop */        /* Handle virtual idle loop */
700        if (unlikely(cpu->pc == cpu->idle_pc)) {        if (unlikely(cpu->pc == cpu->idle_pc)) {
701           if (++idle_count == cpu->idle_max) {           if (++cpu->idle_count == cpu->idle_max) {
702              mips64_idle_loop(cpu);              mips64_idle_loop(cpu);
703              idle_count = 0;              cpu->idle_count = 0;
704           }           }
705        }        }
706    
# Line 714  void *insn_block_execute(cpu_mips_t *cpu Line 726  void *insn_block_execute(cpu_mips_t *cpu
726        block = cpu->exec_phys_map[phys_page];        block = cpu->exec_phys_map[phys_page];
727    
728        /* No block found, compile the page */        /* No block found, compile the page */
729        if (unlikely(!block)) {        if (unlikely(!block) || unlikely(!insn_block_match(cpu,block)))
730          {
731             if (block != NULL) {
732                insn_block_free(cpu,block,TRUE);
733                cpu->exec_phys_map[phys_page] = NULL;
734             }
735    
736           block = insn_page_compile(cpu,cpu->pc);           block = insn_page_compile(cpu,cpu->pc);
737           if (unlikely(!block)) {           if (unlikely(!block)) {
738              fprintf(stderr,              fprintf(stderr,

Legend:
Removed from v.1  
changed lines
  Added in v.4

  ViewVC Help
Powered by ViewVC 1.1.26