124 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * systest.c -- Test code for nooks system calls
 | |
|  *
 | |
|  * Copyright (C) 2002 Mike Swift
 | |
|  *
 | |
|  * The source code in this file can be freely used, adapted,
 | |
|  * and redistributed in source or binary form, so long as an
 | |
|  * acknowledgment appears in derived source files.  
 | |
|  * No warranty is attached;
 | |
|  * we cannot take responsibility for errors or fitness for use.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #if 0
 | |
| #include <asm/unistd.h>
 | |
| #endif
 | |
| #include <string.h>
 | |
| #include <errno.h>
 | |
| 
 | |
| #define swifi_inject_fault sys_inject_fault
 | |
| 
 | |
| #include "swifi-user.h"
 | |
| #include "extra.h"
 | |
| 
 | |
| 
 | |
| #if 0
 | |
| _syscall6(long, swifi_inject_fault, 
 | |
| 	  char *, module_name,
 | |
| 	  unsigned long, faultType,
 | |
| 	  unsigned long, randSeed,
 | |
| 	  unsigned long, numFaults,
 | |
| 	  void *, result,
 | |
| 	  unsigned long, do_inject);
 | |
| #endif
 | |
| 
 | |
| int
 | |
| main(int argc, char * argv[])
 | |
| {
 | |
|   char * module_name = NULL;
 | |
|   int i;
 | |
|   long result = 0;
 | |
|   unsigned int cmd = 0;
 | |
|   unsigned long arg = 0;
 | |
|   unsigned long seed = 157;
 | |
|   swifi_result_t * res = NULL;
 | |
| 
 | |
|   if (argc < 2) {
 | |
|     goto Usage;
 | |
|   }
 | |
| 
 | |
|   for (i = 1; i < argc; i++ ) {
 | |
|     if (strcmp(argv[i], "-f") == 0) {
 | |
|       if (argc <= i+5) {
 | |
| 	goto Usage;
 | |
|       }
 | |
|       module_name = victim_exe = argv[++i];
 | |
|       sscanf(argv[++i],"%u", &victim_pid);
 | |
|       sscanf(argv[++i],"%u", &cmd);
 | |
|       sscanf(argv[++i],"%lu", &arg);
 | |
|       sscanf(argv[++i],"%lu", &seed);
 | |
|     } else {
 | |
|       printf("Unknown command %s\n", argv[i]);
 | |
|       goto Usage;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   res = malloc(arg * sizeof(swifi_result_t));
 | |
|   if (res == NULL) {
 | |
|     printf("Out of memory\n");
 | |
|     goto Cleanup;
 | |
|   }
 | |
| 
 | |
|   memset(res, 0, sizeof(res));
 | |
| 
 | |
|   /*
 | |
|   // Find out where the faults will be injected
 | |
|   */
 | |
|   
 | |
|   result = swifi_inject_fault(module_name, 
 | |
| 			      cmd,         /* fault type */
 | |
| 			      seed,           /* random seed */
 | |
| 			      arg,         /* numFaults */
 | |
| 			      res,
 | |
| 			      0);  /* don't inject now */
 | |
|   
 | |
|   for (i = 0; (i < arg) && (res[i].address != 0) ; i++) {
 | |
|     printf("Changed 0x%lx from 0x%lx to 0x%lx\n",
 | |
| 	   res[i].address,
 | |
| 	   res[i].old,
 | |
| 	   res[i].new);
 | |
|   }
 | |
|   
 | |
|   /*
 | |
|   // do the injection
 | |
|   */
 | |
|   
 | |
| 
 | |
|   result = swifi_inject_fault(module_name, 
 | |
| 			      cmd,         /* fault type */
 | |
| 			      seed,           /* random seed */
 | |
| 			      arg,         /* numFaults */
 | |
| 			      res,
 | |
| 			      1);  /* do inject now */
 | |
| 
 | |
|   printf("swifi_inject_fault returned %ld (%d)\n", result,errno);
 | |
| 
 | |
| 
 | |
| 
 | |
|  Cleanup:
 | |
|   if (res != NULL) {
 | |
|     free(res);
 | |
|   }
 | |
|   return(0);
 | |
| 
 | |
|  Usage:
 | |
|   printf("Usage: %s -f module_name pid fault-type fault-count seed\n", argv[0]);
 | |
|   goto Cleanup;
 | |
| }
 | |
| 
 | |
| 
 | 
