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

📄 flash_faults.c

📁 一个用在mips体系结构中的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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.  * *//**************************************************** * * fault injection support for flash memory system * * Author:  John Chapin   2/13/96 * Revised: Dan Teodosiu  09/09/96 * ****************************************************/#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include "sim_error.h"#include "tcl_init.h"#include "cpu_interface.h"#ifdef USE_FLASHLITE#include "mipsy_interface.h"/**** Tcl dispatch table *****//* Router tcl interface: * * router connections k         # return connections for this router, as *                              # { { router port } M ... } * router queuelen k p l        # return queue length at port on given lane * router packet k p l n        # return packet n on lane l for port p of k * router drop k p l n          # drop specified packet * router insert k p l xport PKT_rep_as_returned_by_router_packet * router severlink k p bhole   # sever specified link (black-hole) * router blockNode k           # block specified node * router powerfail k           # powerfail router * router reroute (top|bottom|left|right) # redo routing w/o using bad link * * router watch k on|off        # raise annotation when packet enqueued * * annotation set router k {    # set annotation on router k *    whatever * } *//* * magic route nodenum destnum nextport	# backdoor program MAGIC routing table bin */static int cmdConnections(Tcl_Interp *interp, int argc, char *argv[]);static int cmdQueuelen(Tcl_Interp *interp, int argc, char *argv[]);static int cmdPacket(Tcl_Interp *interp, int argc, char *argv[]);static int cmdDrop(Tcl_Interp *interp, int argc, char *argv[]);static int cmdInsertPKT(Tcl_Interp *interp, int argc, char *argv[]);static int cmdInsertVP(Tcl_Interp *interp, int argc, char *argv[]);static int cmdSeverlink(Tcl_Interp *interp, int argc, char *argv[]);static int cmdBlockNode(Tcl_Interp *interp, int argc, char *argv[]);static int cmdPowerfail(Tcl_Interp *interp, int argc, char *argv[]);static int cmdWatch(Tcl_Interp *interp, int argc, char *argv[]);static int cmdReroute(Tcl_Interp *interp, int argc, char *argv[]);static tclcmd routerCmds[] = {  {"connections",3, cmdConnections," connections routerNum"},  {"queuelen",   5, cmdQueuelen,   " queuelen routerNum portNum laneNum"},  {"packet",     6, cmdPacket,     " packet routerNum portNum laneNum pktNum"},  {"drop",       6, cmdDrop,       " drop routerNum portNum laneNum pktNum"},  {"insertPKT",  43,cmdInsertPKT,  " insertPKT routerNum portNum lane <PKT>"},  {"insertVP",   15,cmdInsertVP,   " insertVP routerNum portNum lane <VP>"},  {"severlink",  5, cmdSeverlink,  " severlink routerNum portNum bhole"},  {"blockNode",  3, cmdBlockNode,  " blockNode nodeNum"},  {"powerfail",  3, cmdPowerfail,  " powerfail routerNum"},  {"watch",      4, cmdWatch,      " watch routerNum on|off"},  {"reroute",    3, cmdReroute,    " reroute top|bottom|left|right"},  { NULL,        0, NULL,          NULL}};static int cmdMRoute(Tcl_Interp *interp, int argc, char *argv[]);static tclcmd magicCmds[] = {  {"route",      5, cmdMRoute,     " route nodenum destnum nextport"},  { NULL,        0, NULL,          NULL}};int LinkSymbolToRetrieveFlashFaultInit;void FlashFaultInit(Tcl_Interp* interp){   Tcl_CreateCommand(interp,                     "router",                     DispatchCmd,                     (ClientData)routerCmds,                     NULL);   Tcl_CreateCommand(interp,                     "magic",                     DispatchCmd,                     (ClientData)magicCmds,                     NULL);}static int cmdConnections(Tcl_Interp *interp, int argc, char *argv[]){   char* routerName = argv[2];   int routerNum, portNum, result, pn, r, done, code;   char buf[64];   if ((code = Tcl_GetInt(interp, routerName, &routerNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad router num \"", routerName, "\"", NULL);      return code;   }   for (portNum = 0, done = 0; !done; portNum++) {     switch (QueryPort(routerNum, portNum, &result)) {     case ROUTERTCL_NONE:       /* not connected */       Tcl_AppendElement(interp, "");       break;     case ROUTERTCL_ROUTER:       /* connected to router: find out which port */       for (pn = 0; ; pn++) {	 if ((code = QueryPort(result, pn, &r)) == ROUTERTCL_ROUTER &&	     r == routerNum)	   break;	 ASSERT(code == ROUTERTCL_NONE ||  /* port not connected */		code == ROUTERTCL_MAGIC || /* MAGIC port */		code == ROUTERTCL_ROUTER); /* port connected to other router */       }       sprintf(buf, "%d %d", result, pn);       Tcl_AppendElement(interp, buf);       break;     case ROUTERTCL_MAGIC:       /* connected to magic */       Tcl_AppendElement(interp, "M");       break;     case ROUTERTCL_BADPORT:       /* done all ports */       done = 1;       break;     case ROUTERTCL_BADROUTER:       Tcl_AppendResult(interp, "router ", routerName, " out of range", NULL);       return TCL_ERROR;     default:       Tcl_AppendResult(interp, "unexpected return code from QueryPort", NULL);       return TCL_ERROR;     }   }   return TCL_OK;}static int cmdQueuelen(Tcl_Interp *interp, int argc, char *argv[]){   int routerNum, portNum, laneNum, code;   char* routerName = argv[2];   char* portName = argv[3];   char* laneName = argv[4];   char buf[20];   int result;   if ((code = Tcl_GetInt(interp, routerName, &routerNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad router num \"", routerName, "\"", NULL);      return code;   }   if ((code = Tcl_GetInt(interp, portName, &portNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad port num \"", portName, "\"", NULL);      return code;   }   if ((code = Tcl_GetInt(interp, laneName, &laneNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad lane num \"", laneName, "\"", NULL);      return code;   }   switch (QueueLength(routerNum, portNum, laneNum, &result)) {   case ROUTERTCL_OK:      sprintf(buf, "%d", result);      Tcl_AppendResult(interp, buf, NULL);      return TCL_OK;   case ROUTERTCL_BADPORT:      Tcl_AppendResult(interp, "port num ", portName, " out of range", NULL);      return TCL_ERROR;   case ROUTERTCL_BADROUTER:      Tcl_AppendResult(interp, "router num ", portName, " out of range", NULL);      return TCL_ERROR;   case ROUTERTCL_BADLANE:      Tcl_AppendResult(interp, "lane num ", laneName, " out of range", NULL);      return TCL_ERROR;   default:      Tcl_AppendResult(interp, "unexpected return code from QueueLength in router queuelen", NULL);      return TCL_ERROR;   }}static int cmdDrop(Tcl_Interp *interp, int argc, char *argv[]){   int routerNum, portNum, laneNum, packetNum, code;   char* routerName = argv[2];   char* portName = argv[3];   char* laneName = argv[4];   char* packetName = argv[5];   if ((code = Tcl_GetInt(interp, routerName, &routerNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad router num \"", routerName, "\"", NULL);      return code;   }   if ((code = Tcl_GetInt(interp, portName, &portNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad port num \"", portName, "\"", NULL);      return code;   }   if ((code = Tcl_GetInt(interp, laneName, &laneNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad lane num \"", laneName, "\"", NULL);      return code;   }   if ((code = Tcl_GetInt(interp, packetName, &packetNum)) != TCL_OK) {      Tcl_AppendResult(interp, "bad packet num \"", packetName, "\"", NULL);      return code;   }   switch (DropPacket(routerNum, portNum, laneNum, packetNum)) {   case ROUTERTCL_OK:      return TCL_OK;   case ROUTERTCL_BADPORT:      Tcl_AppendResult(interp, "port num ", portName, " out of range", NULL);      return TCL_ERROR;   case ROUTERTCL_BADROUTER:      Tcl_AppendResult(interp, "router num ", routerName, " out of range", NULL);      return TCL_ERROR;   case ROUTERTCL_BADLANE:      Tcl_AppendResult(interp, "lane num ", laneName, " out of range", NULL);      return TCL_ERROR;   case ROUTERTCL_BADPACKET:      Tcl_AppendResult(interp, "packet num ", packetName, " out of range", NULL);      return TCL_ERROR;   default:      Tcl_AppendResult(interp, "unexpected return code from QueueLength in router queuelen", NULL);      return TCL_ERROR;   }}static intget_arg(Tcl_Interp* interp, char* arg_string, int* arg_val, char* msg){  int code;  if ((code = Tcl_GetInt(interp, arg_string, arg_val)) != TCL_OK)    Tcl_AppendResult(interp, msg, "\"", arg_string, "\"", NULL);  return code;}static int cmdInsertPKT(Tcl_Interp *interp, int argc, char *argv[]){  int          rn=0, pn=0, ln=0;  RouterPacket rp;  int*         hp = (int*)&rp.h;  int*         dp = (int*)rp.data;  int*         ep = (int*)&rp.errbits;  int          code, i;  if ((code = get_arg(interp, argv[2], &rn,         "bad router")) != TCL_OK ||      (code = get_arg(interp, argv[3], &pn,         "bad port"))   != TCL_OK ||      (code = get_arg(interp, argv[4], &ln,         "bad lane"))   != TCL_OK ||      (code = get_arg(interp, argv[6], hp+0,        "bad h0"))     != TCL_OK ||      (code = get_arg(interp, argv[7], hp+1,        "bad h1"))     != TCL_OK ||      (code = get_arg(interp, argv[8], hp+2,        "bad h2"))     != TCL_OK ||      (code = get_arg(interp, argv[9], hp+3,        "bad h3"))     != TCL_OK ||      (code = get_arg(interp, argv[10],ep,          "bad errbits"))!= TCL_OK)    return code;

⌨️ 快捷键说明

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