si_testr.c 4.61 KB

/*************************************************************************
 *
 *  File: si_testr.c
 *
 *  This file contains then main routine for BCP SI iosim tests for
 *  the random test env.
 *
 */
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>

#include "../iomap.h"
#include "../iotest.h"
#include "../sim.h"
#include "../simipc.h"
#include "../bcptestsi.h"
#include "../trace.h"
#include "../bcp_util.h"
#include "../bcptest.h"


/***********************************************************************
 * Extern definitions
 */
extern  void IoTestAll(int testid, char* arg1, char* arg2, int seed);
extern   int IoCmd(int code, int data);


/***********************************************************************
 * Macro definitions
 */
#define TEST_CMD_FILE   "all.tst"
#define OPTARG      "d:0:t:s:qh"


/***********************************************************************
 * Global definitions
 */
int             IpcFd = -1;
unsigned long   Dflags;
char           *CmdFile = TEST_CMD_FILE;
FILE           *LogFp, *CmdFp;
int             ConfigRdramV = 0;
int             NumberStallCycles = 0;


/***********************************************************************
 * Local static definitions
 */
//static FILE     *dumpFp = NULL;

static void     usage(void);
//static void     convertTst2C(char *);


int
main(int argc, char **argv)
{

    int c, testid=0, seed=0, req_quit=0;
    char    *file;
    FILE    *fp = NULL;

    extern char *optarg;
    extern int optind, opterr, optopt;

    char *arg[2] = {0,0};
    int i;

    optind = 1;
    Dflags = 0;
    LogFp  = stderr;

    while ((c = getopt(argc, argv, OPTARG)) != EOF) {
        switch (c) {
            case 'd': { /* Debug flag */
                Dflags = strtoul(optarg, NULL, 16);
                printf("Debug flag=0x%08lx\n", Dflags);
                break;
            }
            case 'o': { /* Log file */
                file = optarg;
                printf("Log file = %s\n", file);
                if ((fp = fopen(file, "w+")) == NULL) {
                    printf("Unable to open log: %s\n",
                        file);
                }
                else
                    LogFp = fp;
                break;
            }
            case 't': { /* id of test to run */
                testid = strtoul(optarg,NULL,10);
                printf("testid=%d\n", testid);
                break;
            }
            case 's': { /* seed that overrides any other method of getting seed */
                seed = strtoul(optarg,NULL,16);
                printf("seed=0x%08x\n", seed);
                break;
            }
            case 'q': { /* shut down simulator on exit */
                req_quit=1;
                printf("shut down simulator on exit\n");
                break;
            }
            case 'h': { /* Help */
                usage();
                exit(0);
            }
            default:
                break;
        }
    }  /* while */

    if ( (argc-optind-1) > (int)(sizeof arg/sizeof arg[0]) ) {
        usage();
        exit(1);
    }

    for(i=0; optind<argc;  ++i,++optind) {
        arg[i] = argv[optind];
    }

    ExceptionHandlerInit();
    IpcInit(NULL);
    FindServer();
    do_keep_alive_socket(1);
    IoTestAll(testid,arg[0],arg[1],seed);

    if (fp)
        fclose(fp);

    if (IpcFd != -1)
        IpcClose(IpcFd);

    do_keep_alive_socket(0);

    /* exit simulator */
    if(req_quit)
        IoCmd(REQ_QUIT, 0);

    exit(0);

}


void IoTestAll(int testid, char* arg1, char* arg2, int seed)
{
    int i, ret, errCount;

    i = errCount = 0;
    i++;
    ret = SiTestRandEnv(testid, arg1, arg2, seed);
    if (ret == -1 || errorTotal) errCount++;
    fprintf(LogFp,
        "\n\n SiTestRandEnv(%d, 0, 0, %#08x) -> %s\n\n",
        testid, seed, errCount ? "Failed":"Passed");

    fprintf(LogFp,
    "\n***** THE END (total test = %d, error count = %d) *****\n\n",
        i, errCount);
}


static void
usage(void)
{
    printf("Usage: si_testr <options> [test_arg1] [test_arg2]\n");
    printf("  test_arg1 and test_arg2 are test specific (default NULL)");
    printf("   -o <log_file>\n");
    printf("   -t <testid>\n");
    printf("         Decimal number identifying test to run\n");
    printf("         Default is testid==0\n");
    printf("   -s <seed>\n");
    printf("         Hex seed that overrides default method of getting seed\n");
    printf("         Only used if <seed> is non-zero\n");
    printf("   -d <debug_flags in hex>\n");
    printf("   -q\n");
    printf("         Shut down the simulator on exit\n");
}