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

📄 options.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
字号:
/* FRV simulator memory option handling.   Copyright (C) 1999, 2000 Free Software Foundation, Inc.   Contributed by Red Hat.This file is part of GDB, the GNU debugger.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public License alongwith this program; if not, write to the Free Software Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */#define WANT_CPU frvbf#define WANT_CPU_FRVBF#include "sim-main.h"#include "sim-assert.h"#include "sim-options.h"#ifdef HAVE_STRING_H#include <string.h>#else#ifdef HAVE_STRINGS_H#include <strings.h>#endif#endif#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif/* FRV specific command line options. */enum {  OPTION_FRV_DATA_CACHE = OPTION_START,  OPTION_FRV_INSN_CACHE,  OPTION_FRV_PROFILE_CACHE,  OPTION_FRV_PROFILE_PARALLEL,  OPTION_FRV_TIMER,  OPTION_FRV_MEMORY_LATENCY};static DECLARE_OPTION_HANDLER (frv_option_handler);const OPTION frv_options[] ={  { {"profile", optional_argument, NULL, 'p'},      'p', "on|off", "Perform profiling",      frv_option_handler },  { {"data-cache", optional_argument, NULL, OPTION_FRV_DATA_CACHE },      '\0', "WAYS[,SETS[,LINESIZE]]", "Enable data cache",      frv_option_handler },  { {"insn-cache", optional_argument, NULL, OPTION_FRV_INSN_CACHE },      '\0', "WAYS[,SETS[,LINESIZE]]", "Enable instruction cache",      frv_option_handler },  { {"profile-cache", optional_argument, NULL, OPTION_FRV_PROFILE_CACHE },      '\0', "on|off", "Profile caches",      frv_option_handler },  { {"profile-parallel", optional_argument, NULL, OPTION_FRV_PROFILE_PARALLEL },      '\0', "on|off", "Profile parallelism",      frv_option_handler },  { {"timer", required_argument, NULL, OPTION_FRV_TIMER },      '\0', "CYCLES,INTERRUPT", "Set Interrupt Timer",      frv_option_handler },  { {"memory-latency", required_argument, NULL, OPTION_FRV_MEMORY_LATENCY },      '\0', "CYCLES", "Set Latency of memory",      frv_option_handler },  { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }};static char *parse_size (char *chp, address_word *nr_bytes){  /* <nr_bytes> */  *nr_bytes = strtoul (chp, &chp, 0);  return chp;}static address_wordcheck_pow2 (address_word value, char *argname, char *optname, SIM_DESC sd){  if ((value & (value - 1)) != 0)    {      sim_io_eprintf (sd, "%s argument to %s must be a power of 2\n",		      argname, optname);      return 0; /* will enable default value.  */    }  return value;}static voidparse_cache_option (SIM_DESC sd, char *arg, char *cache_name, int is_data_cache){  int i;  address_word ways = 0, sets = 0, linesize = 0;  if (arg != NULL)    {      char *chp = arg;      /* parse the arguments */      chp = parse_size (chp, &ways);      ways = check_pow2 (ways, "WAYS", cache_name, sd);      if (*chp == ',')	{	  chp = parse_size (chp + 1, &sets);	  sets = check_pow2 (sets, "SETS", cache_name, sd);	  if (*chp == ',')	    {	      chp = parse_size (chp + 1, &linesize);	      linesize = check_pow2 (linesize, "LINESIZE", cache_name, sd);	    }	}    }  for (i = 0; i < MAX_NR_PROCESSORS; ++i)    {      SIM_CPU *current_cpu = STATE_CPU (sd, i);      FRV_CACHE *cache = is_data_cache ? CPU_DATA_CACHE (current_cpu)	                               : CPU_INSN_CACHE (current_cpu);      cache->ways = ways;      cache->sets = sets;      cache->line_size = linesize;      frv_cache_init (current_cpu, cache);    }}static SIM_RCfrv_option_handler (SIM_DESC sd, sim_cpu *current_cpu, int opt,		    char *arg, int is_command){  switch (opt)    {    case 'p' :      if (! WITH_PROFILE)	sim_io_eprintf (sd, "Profiling not compiled in, `-p' ignored\n");      else	{	  unsigned mask = PROFILE_USEFUL_MASK;	  if (WITH_PROFILE_CACHE_P)	    mask |= (1 << PROFILE_CACHE_IDX);	  if (WITH_PROFILE_PARALLEL_P)	    mask |= (1 << PROFILE_PARALLEL_IDX);	  return set_profile_option_mask (sd, "profile", mask, arg);	}      break;    case OPTION_FRV_DATA_CACHE:      parse_cache_option (sd, arg, "data_cache", 1/*is_data_cache*/);      return SIM_RC_OK;    case OPTION_FRV_INSN_CACHE:      parse_cache_option (sd, arg, "insn_cache", 0/*is_data_cache*/);      return SIM_RC_OK;    case OPTION_FRV_PROFILE_CACHE:      if (WITH_PROFILE_CACHE_P)	return sim_profile_set_option (sd, "-cache", PROFILE_CACHE_IDX, arg);      else	sim_io_eprintf (sd, "Cache profiling not compiled in, `--profile-cache' ignored\n");      break;    case OPTION_FRV_PROFILE_PARALLEL:      if (WITH_PROFILE_PARALLEL_P)	{	  unsigned mask	    = (1 << PROFILE_MODEL_IDX) | (1 << PROFILE_PARALLEL_IDX);	  return set_profile_option_mask (sd, "-parallel", mask, arg);	}      else	sim_io_eprintf (sd, "Parallel profiling not compiled in, `--profile-parallel' ignored\n");      break;    case OPTION_FRV_TIMER:      {	char *chp = arg;	address_word cycles, interrupt;	chp = parse_size (chp, &cycles);	if (chp == arg)	  {	    sim_io_eprintf (sd, "Cycle count required for --timer\n");	    return SIM_RC_FAIL;	  }	if (*chp != ',')	  {	    sim_io_eprintf (sd, "Interrupt number required for --timer\n");	    return SIM_RC_FAIL;	  }	chp = parse_size (chp + 1, &interrupt);	if (interrupt < 1 || interrupt > 15)	  {	    sim_io_eprintf (sd, "Interrupt number for --timer must be greater than 0 and less that 16\n");	    return SIM_RC_FAIL;	  }	frv_interrupt_state.timer.enabled = 1;	frv_interrupt_state.timer.value = cycles;	frv_interrupt_state.timer.current = 0;	frv_interrupt_state.timer.interrupt =	  FRV_INTERRUPT_LEVEL_1 + interrupt - 1;      }      return SIM_RC_OK;    case OPTION_FRV_MEMORY_LATENCY:      {	int i;	char *chp = arg;	address_word cycles;	chp = parse_size (chp, &cycles);	if (chp == arg)	  {	    sim_io_eprintf (sd, "Cycle count required for --memory-latency\n");	    return SIM_RC_FAIL;	  }	for (i = 0; i < MAX_NR_PROCESSORS; ++i)	  {	    SIM_CPU *current_cpu = STATE_CPU (sd, i);	    FRV_CACHE *insn_cache = CPU_INSN_CACHE (current_cpu);	    FRV_CACHE *data_cache = CPU_DATA_CACHE (current_cpu);	    insn_cache->memory_latency = cycles;	    data_cache->memory_latency = cycles;	  }      }      return SIM_RC_OK;    default:      sim_io_eprintf (sd, "Unknown FRV option %d\n", opt);      return SIM_RC_FAIL;    }  return SIM_RC_FAIL;}

⌨️ 快捷键说明

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