📄 flash_faults.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. * *//**************************************************** * * 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 + -