int Simulator::simulate(){ load_i_cache(); print_i_cache(); int i = 0; while(true){ cout << "CLK: "<<m_clk<<endl; multi_fetch(); multi_decode(); dispatch(); multi_execute(); complete_instr(); process_rs(); print_reg_file(); if (!retire_instr()) { // clean up store buffer break; } process_store_buffer(); next_clock_cycle(); } print_d_cache(); printf("clk cycles = %lld\n",m_clk + 1); printf("CPI = %f\n",1.0*(m_clk + 1)/num_ins_executed); // printf("Stalls = %lld\n",num_stalls - 5); // printf("Control Stalls = %lld\n",num_control_stalls); // printf("RAW Stalls = %lld\n",num_stalls - 5 - num_control_stalls); return 1; }
void show_regs(struct pt_regs *regs) { struct task_struct *tsk = current; struct callee_regs *cregs; /* * generic code calls us with preemption disabled, but some calls * here could sleep, so re-enable to avoid lockdep splat */ preempt_enable(); print_task_path_n_nm(tsk); show_regs_print_info(KERN_INFO); show_ecr_verbose(regs); pr_info("[EFA ]: 0x%08lx\n[BLINK ]: %pS\n[ERET ]: %pS\n", current->thread.fault_address, (void *)regs->blink, (void *)regs->ret); if (user_mode(regs)) show_faulting_vma(regs->ret); /* faulting code, not data */ pr_info("[STAT32]: 0x%08lx", regs->status32); #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" #ifdef CONFIG_ISA_ARCOMPACT pr_cont(" : %2s%2s%2s%2s%2s%2s%2s\n", (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE), STS_BIT(regs, A2), STS_BIT(regs, A1), STS_BIT(regs, E2), STS_BIT(regs, E1)); #else pr_cont(" : %2s%2s%2s%2s\n", STS_BIT(regs, IE), (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE)); #endif pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", regs->bta, regs->sp, regs->fp); pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", regs->lp_start, regs->lp_end, regs->lp_count); /* print regs->r0 thru regs->r12 * Sequential printing was generating horrible code */ print_reg_file(&(regs->r0), 0); /* If Callee regs were saved, display them too */ cregs = (struct callee_regs *)current->thread.callee_reg; if (cregs) show_callee_regs(cregs); preempt_disable(); }
void show_regs(struct pt_regs *regs) { struct task_struct *tsk = current; struct callee_regs *cregs; char *buf; buf = (char *)__get_free_page(GFP_TEMPORARY); if (!buf) return; print_task_path_n_nm(tsk, buf); show_regs_print_info(KERN_INFO); show_ecr_verbose(regs); pr_info("[EFA ]: 0x%08lx\n[BLINK ]: %pS\n[ERET ]: %pS\n", current->thread.fault_address, (void *)regs->blink, (void *)regs->ret); if (user_mode(regs)) show_faulting_vma(regs->ret, buf); /* faulting code, not data */ pr_info("[STAT32]: 0x%08lx", regs->status32); #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" #ifdef CONFIG_ISA_ARCOMPACT pr_cont(" : %2s%2s%2s%2s%2s%2s%2s\n", (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE), STS_BIT(regs, A2), STS_BIT(regs, A1), STS_BIT(regs, E2), STS_BIT(regs, E1)); #else pr_cont(" : %2s%2s%2s%2s\n", STS_BIT(regs, IE), (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE)); #endif pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", regs->bta, regs->sp, regs->fp); pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", regs->lp_start, regs->lp_end, regs->lp_count); /* print regs->r0 thru regs->r12 * Sequential printing was generating horrible code */ print_reg_file(&(regs->r0), 0); /* If Callee regs were saved, display them too */ cregs = (struct callee_regs *)current->thread.callee_reg; if (cregs) show_callee_regs(cregs); free_page((unsigned long)buf); }
static void show_callee_regs(struct callee_regs *cregs) { print_reg_file(&(cregs->r13), 13); }