⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stats.c

📁 一个用在mips体系结构中的操作系统
💻 C
字号:
/* * Copyright (C) 1996-1998 by the Board of Trustees *    of Leland Stanford Junior University. *  * This file is part of the SimOS distribution.  * See LICENSE file for terms of the license.  * *//**************************************************************** * stats.c *  * $Author: bosch $ * $Date: 1998/02/10 00:31:00 $ *****************************************************************/#include <stdio.h>#include <sys/time.h>#include <bstring.h>#include <sys/resource.h>#include "embra.h"#include "stats.h"#include "clock.h"#include "hw_events.h"#include "debug.h"#define GETSTATS/* print sim speed to log */#define GET_SPEED 250/* specify the frequency of speed prints to the log (base=250). */#define GET_SPEED_FREQU 250#undef CHECKMMU#define STAT(_x) (em_stats._x)/* real time for simulator speed evaluation */static struct timeval stime, etime, newstime;static uint64 oldtotalIcount=0,                totalIcount,                oldtotalCycles=0,                totalCycles,                oldcpu0cycles=0;static long secondsRun;static int cpu;/* Scale factor for hi-res timer */static double s_per_tick;/* Assembly callout Stuff */  int virt_qc_i_misses;  int virt_qc_d_excl_misses;  int virt_qc_d_shared_misses;stats_t em_stats;SimTime embraInstrCount[SIM_MAXCPUS];SimTime embraLastCount[SIM_MAXCPUS];SimTime embraTotalInstructions;void Dump_QC_Counters( int cpuNum){   if( embra.emode == EMBRA_PAGE ) {     EMBRA_INSTR_COUNT_EVENT(cpuNum,                             EmbraCpuCycleCount(cpuNum) - embraLastCount[cpuNum]);     embraLastCount[cpuNum] = EmbraCpuCycleCount(cpuNum);   } else {     embraInstrCount[cpuNum] += EMP[cpuNum].Sihit_count;          EMBRA_INSTR_COUNT_EVENT(cpuNum,EMP[cpuNum].Sihit_count);     EMBRA_REF_COUNT_EVENT(cpuNum,EMP[cpuNum].Sdhit_count);     EMP[cpuNum].Sdhit_count = 0;     EMP[cpuNum].Sihit_count = 0;   }}SimTime EmbraCpuInstrCount(int cpuNum){   return embraInstrCount[cpuNum] + EMP[cpuNum].Sihit_count;}void Stat_Init( void ){#ifdef notdef   s_per_tick = Hw_Counter_Cycleval()/(1000.0*1000.0*1000.0*1000.0);#endif                               }/* Floating point function called via backdoor */  void Print_Recent_Stats( int cpuNum ){  struct timeval t;  gettimeofday(&t);  CPUPrint("\n");  if( embra.MPinUP ) {     int i;     for(i = 0; i < TOTAL_CPUS; i++) {        Dump_QC_Counters(i);        CPUPrint("EM_CPU %d Cycle %lld PC 0x%llx RA 0x%llx Proc %s\n",                 i, EMP[i].cycleCount, (Reg64)EMP[i].PC, (Reg64)EMP[i].R[31],                 "foo" );     }  } else {     Dump_QC_Counters(cpuNum);     CPUPrint("EM_CPU %d Cycle %lld PC 0x%llx RA 0x%llx Proc %s\n",              cpuNum, EMP[cpuNum].cycleCount, (Reg64)EMP[cpuNum].PC,              (Reg64)EMP[cpuNum].R[31],              "foo");  }  CPUPrint("EM_B Usec %lld Bdr %lldr/%lldur/%dc\n",            (int64)t.tv_sec*1000*1000+t.tv_usec,           STAT( backdoor_ref ),           STAT( backdoor_unaltered_ref ),           STAT( backdoor_calls )     );  CPUPrint("EM_T Tran %.3fs/%db/%di  TC %dt/%di/%dk/%df KF %di/%dd/%db\n",           ( (double)( s_per_tick * STAT( trans_timer.ticks ) ) ),           STAT( translations ),           STAT( trans_instrs ),           STAT( tc_flushes ),           STAT( icache_coherence),           STAT( kern_cacheflush_tc_flush ),           STAT( tc_filled ),           STAT( kern_I_cacheflush ),           STAT( kern_D_cacheflush ),           STAT( kern_ID_cacheflush )     );  CPUPrint("EM_C0 EXC %d INT %d MOD %d RS %d/%d WS %d/%d  SYS %d\n",           STAT( exceptions ),           STAT( exception_type[0][0] ),           STAT( exception_type[0][1] ),           STAT( exception_type[0][2] ),           STAT( exception_type[1][2] ),           STAT( exception_type[0][3] ),           STAT( exception_type[1][3] ),           STAT( exception_type[0][8] )     );  CPUPrint("EM_CH Invk/bncd %u/%u (k/spec) %u/%u (usr/smpg) %u/%u smln %u\n",           STAT( chain_invocations ),           STAT( chain_bounced ),           STAT( chain_known_chains ),           STAT( chain_spec_chains ),           STAT( chain_user_chains ),           STAT( chain_samepg_chains ),           STAT( chain_sameln_chains )     );#ifdef GET_QC  if( embra.emode == EMBRA_CACHE ) {     CPUPrint("EM_QC V/P(i/s/x) %lld %lld %lld %lld %lld %lld\n",              STAT(vqc_i_misses),              STAT(vqc_d_shared_misses),              STAT(vqc_d_excl_misses),              STAT(pqc_i_misses),              STAT(pqc_d_shared_misses),              STAT(pqc_d_excl_misses)        );  } else {     CPUPrint("EM_MMU (i/s/x) %lld %lld %lld\n",              STAT(pqc_i_misses),              STAT(pqc_d_shared_misses),              STAT(pqc_d_excl_misses)        );  }#endif#ifdef GET_REG_USAGE  CPUPrint("Reg Use  0:%d 1:%d  2:%d  3:%d   4:%d   5:%d   6:%d   7:%d   8>:%d\n",		 STAT( reg_usage[0] ),		 STAT( reg_usage[1] ),		 STAT( reg_usage[2] ),		 STAT( reg_usage[3] ),		 STAT( reg_usage[4] ),		 STAT( reg_usage[5] ),		 STAT( reg_usage[6] ),		 STAT( reg_usage[7] ),		 STAT( reg_usage[8] ) + STAT( reg_usage[9] ) +		 STAT( reg_usage[10] ) + STAT( reg_usage[11] ) +		 STAT( reg_usage[12] ) + STAT( reg_usage[13] ) +		 STAT( reg_usage[14] ) + STAT( reg_usage[15] ) +		 STAT( reg_usage[16] ) + STAT( reg_usage[17] ) +		 STAT( reg_usage[18] ) + STAT( reg_usage[19] ) +		 STAT( reg_usage[20] ) + STAT( reg_usage[21] ) +		 STAT( reg_usage[22] ) + STAT( reg_usage[23] ) +		 STAT( reg_usage[24] ) + STAT( reg_usage[25] ) +		 STAT( reg_usage[26] ) + STAT( reg_usage[27] ) +		 STAT( reg_usage[28] ) + STAT( reg_usage[29] ) +		 STAT( reg_usage[30] ) + STAT( reg_usage[31] ) +		 STAT( reg_usage[32] ) 	);#endif#ifdef BB_HISTOGRAM  CPUPrint("EM_BB 16   %d   %d   %d   %d   %d   %d   %d   %d   %d   %d\n",		 STAT( bb_sizes[0] ),		 STAT( bb_sizes[1] ),		 STAT( bb_sizes[2] ),		 STAT( bb_sizes[3] ),		 STAT( bb_sizes[4] ),		 STAT( bb_sizes[5] ),		 STAT( bb_sizes[6] ),		 STAT( bb_sizes[7] ),		 STAT( bb_sizes[8] ),		 STAT( bb_sizes[9] )	);  CPUPrint("EM_DEC 4   %d   %d   %d   %d   %d   %d   %d   %d   %d   %d\n",		 STAT( dec_bb_sizes[0] ),		 STAT( dec_bb_sizes[1] ),		 STAT( dec_bb_sizes[2] ),		 STAT( dec_bb_sizes[3] ),		 STAT( dec_bb_sizes[4] ),		 STAT( dec_bb_sizes[5] ),		 STAT( dec_bb_sizes[6] ),		 STAT( dec_bb_sizes[7] ),		 STAT( dec_bb_sizes[8] ),		 STAT( dec_bb_sizes[9] )	);#endif  CPUPrint("EM_PCTC(in/ct/lk/ms/bms)ne(lk/ms) %d %.3f%% %d %.3f%% %.3f%%  %d %.3f%%\n",           STAT( pc_tc_insert ),           100.0*STAT( pc_tc_conflicts )/(float)STAT( pc_tc_insert ),           STAT( pc_tc_lookup ),           100.0*STAT( pc_tc_lookup_misses )/(float)STAT( pc_tc_lookup ),           100.0*STAT( pc_tc_bdoor_misses )/(float)STAT( pc_tc_lookup ),           STAT(ne_pc_tc_lookup),           100.0*STAT(ne_pc_tc_lookup_misses)/(float)STAT(ne_pc_tc_lookup)           );  /*   * Print speed stats    */    {     static SimTime prevTotalInstr=0;     double diff = EmbraTimeDiff();     int i;     SimTime totalInstr=0;     if (embra.emode==EMBRA_PAGE) {         totalInstr = TOTAL_CPUS * EmbraCpuCycleCount(0);     } else {         for (i=0;i<TOTAL_CPUS;i++) {           totalInstr += embraInstrCount[i];        }     }     if (diff >0) {         CPUPrint("EM_KIPS %10lld cycles %1.3f seconds %5.0f KIPS \n",                 EmbraCpuCycleCount(0),                 diff,                 (totalInstr-prevTotalInstr) / diff / 1000 );     } else {        CPUPrint("EM_KIPS %10lld inf KIPS \n",EmbraCpuCycleCount(0));     }     prevTotalInstr = totalInstr;  }         CPUPrint("EM_X\n");  CPUPrint("\n");}/* This should not be needed, but for some reason the indys seg fault *//* on readin g the timer */#define NO_HW_COUNTER/*****Support for the hi-res timer as exported by simhwtimer.h *****/int hw_counter_start( HW_counter* count ){#ifndef NO_HW_COUNTER     count->current = Hw_Counter_Read();#endif  count->on = 1;  return 0;}int hw_counter_stop( HW_counter* count ){  if( count->on )        {#ifndef NO_HW_COUNTER             count->ticks += ( Hw_Counter_Read() - count->current );#endif          count->on = 0;          return 1;        }  return 0;}int hw_counter_reset( HW_counter* count ){  count->ticks = 0LL;  return 0;}double EmbraTimeDiff(void){   static int init=0;   static struct timeval old;   struct timeval new;   double diff;      gettimeofday(&new,NULL);   if (init) {      diff=new.tv_sec - old.tv_sec;       diff += 0.000001 * (new.tv_usec - old.tv_usec);   } else {       diff= 0;   }   init = 1;   old = new;   return diff;}     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -