PROG= swifi
SRCS= systest.c fault_model.c extra.c db_sym.c db_disasm.c \
db_access.c read_nlist.c
-CPPFLAGS+= -DCONFIG_SWIFI
+MAN=
+
DPADD+= ${LIBELF}
LDADD+= -lelf
-MAN=
.include <bsd.prog.mk>
* Instruction disassembler.
*/
-#if 0
-#include <linux/kernel.h>
-#endif
#include "ddb.h"
#include "db_access.h"
result = db_get_value((loc), (size), (is_signed)); \
(loc) += (size);
-/*static db_addr_t
-// db_disasm_esc __P((db_addr_t loc, int inst, int short_addr,
-// int size, const char *seg));
-//static void db_print_address __P((const char *seg, int size,
-// struct i_addr *addrp));
-*/
static db_addr_t
db_read_address __P((db_addr_t loc, int short_addr,
int regmodrm, struct i_addr *addrp));
* Author: David B. Golub, Carnegie Mellon University
* Date: 7/90
*/
-#if 0
-//#include <sys/param.h>
-//#include <sys/systm.h>
-#endif
-#if 0
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/kallsyms.h>
-#endif
#include "ddb.h"
#include "db_sym.h"
#include "swifi.h"
#ifndef MAXNOSYMTABS
#define MAXNOSYMTABS 3 /* mach, ux, emulator */
#endif
-#if 0
-
-static db_symtab_t db_symtabs[MAXNOSYMTABS] = {{0,},};
-static int db_nsymtab = 0;
-
-static db_symtab_t *db_last_symtab;
-
-static db_sym_t db_lookup __P(( char *symstr));
-static char *db_qualify __P((db_sym_t sym, char *symtabname));
-static boolean_t db_symbol_is_ambiguous __P((db_sym_t sym));
-static boolean_t db_line_at_pc __P((db_sym_t, char **, int *,
- db_expr_t));
-
-/*
- * Add symbol table, with given name, to list of symbol tables.
- */
-void
-db_add_symbol_table(start, end, name, ref)
- char *start;
- char *end;
- char *name;
- char *ref;
-{
- if (db_nsymtab >= MAXNOSYMTABS) {
- printk ("No slots left for %s symbol table", name);
- panic ("db_sym.c: db_add_symbol_table");
- }
-
- db_symtabs[db_nsymtab].start = start;
- db_symtabs[db_nsymtab].end = end;
- db_symtabs[db_nsymtab].name = name;
- db_symtabs[db_nsymtab].private = ref;
- db_nsymtab++;
-}
-
-/*
- * db_qualify("vm_map", "ux") returns "unix:vm_map".
- *
- * Note: return value points to static data whose content is
- * overwritten by each call... but in practice this seems okay.
- */
-static char *
-db_qualify(sym, symtabname)
- db_sym_t sym;
- register char *symtabname;
-{
- char *symname;
- static char tmp[256];
-
- db_symbol_values(sym, &symname, 0);
- strcpy(tmp,symtabname);
- strcat(tmp,":");
- strcat(tmp,symname);
- return tmp;
-}
-
-
-boolean_t
-db_eqname(src, dst, c)
- char *src;
- char *dst;
- char c;
-{
- if (!strcmp(src, dst))
- return (TRUE);
- if (src[0] == c)
- return (!strcmp(src+1,dst));
- return (FALSE);
-}
-
-boolean_t
-db_value_of_name(name, valuep)
- char *name;
- db_expr_t *valuep;
-{
- db_sym_t sym;
-
- sym = db_lookup(name);
- if (sym == DB_SYM_NULL)
- return (FALSE);
- db_symbol_values(sym, &name, valuep);
- return (TRUE);
-}
-
-
-/*
- * Lookup a symbol.
- * If the symbol has a qualifier (e.g., ux:vm_map),
- * then only the specified symbol table will be searched;
- * otherwise, all symbol tables will be searched.
- */
-static db_sym_t
-db_lookup(symstr)
- char *symstr;
-{
- db_sym_t sp;
- register int i;
- int symtab_start = 0;
- int symtab_end = db_nsymtab;
- register char *cp;
-
- /*
- * Look for, remove, and remember any symbol table specifier.
- */
- for (cp = symstr; *cp; cp++) {
- if (*cp == ':') {
- *cp = '\0';
- for (i = 0; i < db_nsymtab; i++) {
- if (! strcmp(symstr, db_symtabs[i].name)) {
- symtab_start = i;
- symtab_end = i + 1;
- break;
- }
- }
- *cp = ':';
- if (i == db_nsymtab) {
- db_error("invalid symbol table name");
- }
- symstr = cp+1;
- }
- }
-
- /*
- * Look in the specified set of symbol tables.
- * Return on first match.
- */
- for (i = symtab_start; i < symtab_end; i++) {
- sp = X_db_lookup(&db_symtabs[i], symstr);
- if (sp) {
- db_last_symtab = &db_symtabs[i];
- return sp;
- }
- }
- return 0;
-}
-
-/*
- * Does this symbol name appear in more than one symbol table?
- * Used by db_symbol_values to decide whether to qualify a symbol.
- */
-static boolean_t db_qualify_ambiguous_names = FALSE;
-
-static boolean_t
-db_symbol_is_ambiguous(sym)
- db_sym_t sym;
-{
- char *sym_name;
- register int i;
- register
- boolean_t found_once = FALSE;
-
- if (!db_qualify_ambiguous_names)
- return FALSE;
-
- db_symbol_values(sym, &sym_name, 0);
- for (i = 0; i < db_nsymtab; i++) {
- if (X_db_lookup(&db_symtabs[i], sym_name)) {
- if (found_once)
- return TRUE;
- found_once = TRUE;
- }
- }
- return FALSE;
-}
-
-/*
- * Find the closest symbol to val, and return its name
- * and the difference between val and the symbol found.
- */
-db_sym_t
-db_search_symbol( val, strategy, offp)
- register db_addr_t val;
- db_strategy_t strategy;
- db_expr_t *offp;
-{
- register
- unsigned int diff;
- unsigned int newdiff;
- register int i;
- db_sym_t ret = DB_SYM_NULL, sym;
-
- newdiff = diff = ~0;
- db_last_symtab = 0;
- for (i = 0; i < db_nsymtab; i++) {
- sym = X_db_search_symbol(&db_symtabs[i], val, strategy, &newdiff);
- if (newdiff < diff) {
- db_last_symtab = &db_symtabs[i];
- diff = newdiff;
- ret = sym;
- }
- }
- *offp = diff;
- return ret;
-}
-
-/*
- * Return name and value of a symbol
- */
-void
-db_symbol_values(sym, namep, valuep)
- db_sym_t sym;
- char **namep;
- db_expr_t *valuep;
-{
- db_expr_t value;
-
- if (sym == DB_SYM_NULL) {
- *namep = 0;
- return;
- }
-
- X_db_symbol_values(sym, namep, &value);
- if (db_symbol_is_ambiguous(sym))
- *namep = db_qualify(sym, db_last_symtab->name);
- if (valuep)
- *valuep = value;
-}
-
-
-/*
- * Print a the closest symbol to value
- *
- * After matching the symbol according to the given strategy
- * we print it in the name+offset format, provided the symbol's
- * value is close enough (eg smaller than db_maxoff).
- * We also attempt to print [filename:linenum] when applicable
- * (eg for procedure names).
- *
- * If we could not find a reasonable name+offset representation,
- * then we just print the value in hex. Small values might get
- * bogus symbol associations, e.g. 3 might get some absolute
- * value like _INCLUDE_VERSION or something, therefore we do
- * not accept symbols whose value is "small" (and use plain hex).
- */
-
-
-void
-db_printsym(off, strategy)
- db_expr_t off;
- db_strategy_t strategy;
-{
- db_expr_t d;
- char *filename;
- char *name;
- db_expr_t value;
- int linenum;
- db_sym_t cursym;
-
- cursym = db_search_symbol(off, strategy, &d);
- db_symbol_values(cursym, &name, &value);
- if (name == 0)
- value = off;
- if (value >= DB_SMALL_VALUE_MIN && value <= DB_SMALL_VALUE_MAX) {
- printk("0x%x", off);
- return;
- }
- if (name == 0 || d >= db_maxoff) {
- printk("0x%x", off);
- return;
- }
- printk("%s", name);
- if (d)
- printk("+0x%x", d);
- if (strategy == DB_STGY_PROC) {
- // if (db_line_at_pc(cursym, &filename, &linenum, off))
- // printk(" [%s:%d]", filename, linenum);
- }
-}
-
-#endif
unsigned int db_maxoff = 0x10000;
unsigned long modAddr = 0;
found=1;
break;
- } else if(type==NOP_FAULT) {
+ } else if(type==NOP_FAULT || type==STOP_FAULT) {
/* 5b) nop*: replace instruction with nop */
if(cur_value> off) {
found=1;
if (d) printk("+0x%x", d);
printk(" @ %x, ", value);
printk("instr @ %x, len=%d, ", off, *instr_len);
-#if 0
- // db_disasm(prev_value, FALSE);
-#endif
}
return off;
} else {
return 0;
}
}
-
-#if 0
-static boolean_t
-db_line_at_pc( sym, filename, linenum, pc)
- db_sym_t sym;
- char **filename;
- int *linenum;
- db_expr_t pc;
-{
- return X_db_line_at_pc( db_last_symtab, sym, filename, linenum, pc);
-}
-
-int
-db_sym_numargs(sym, nargp, argnames)
- db_sym_t sym;
- int *nargp;
- char **argnames;
-{
- return X_db_sym_numargs(db_last_symtab, sym, nargp, argnames);
-}
-
-#endif
static struct nlist *exe_nlist;
static int exe_nlist_n;
-/* unsigned long __get_free_page(int type) { assert(0); } */
-/* void *kmalloc(size_t size, int type) { assert(0); } */
-void free_page(unsigned long page) { assert(0); }
-/* void kfree(void *mem) { assert(0); } */
-void vfree(void *mem) { assert(0); }
-
-size_t strncpy_from_user(char *addr, const char *user_name, size_t size)
-{ assert(0); return 0; }
-
-/* void lock_kernel(void) { assert(0); } */
-/* void unlock_kernel(void) { assert(0); } */
-/* void __asm__(char *str) { assert(0); } */
-
-extern void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot)
-{ assert(0); return NULL; }
-
-#if 0
-void kallsyms_sections(void *infop,
- int (*fp)(void *token, const char *modname, const char *secname,
- ElfW(Addr) secstart, ElfW(Addr) secend, ElfW(Word) secflags))
-{ assert(0); }
-#endif
-
-unsigned long __generic_copy_to_user(void *x, const void *y, unsigned long z)
-{ assert(0); return -1; }
-unsigned long __generic_copy_from_user(void *x, const void *y, unsigned long z)
-{ assert(0); return -1; }
-
-/* void read_lock(struct lock *lock) { assert(0); } */
-/* void read_unlock(struct lock *lock) { assert(0); } */
-void udelay(unsigned long usecs) { assert(0); }
-int copy_to_user(void * result_record, void *res, size_t size)
-{
- memcpy(result_record, res, size);
- return 0;
-}
-
-void panic(char *str) { assert(0); }
-
void printk(char *fmt, ...)
{
va_list ap;
above= &exe_nlist[i];
}
}
-#if 0
- if (below)
- {
- printf("found '%s' at 0x%x\n", below->n_name, below->n_value);
- }
- if (above)
- {
- printf("found '%s' at 0x%x\n", above->n_name, above->n_value);
- }
-#endif
btext |= TRAP_BIT;
etext |= TRAP_BIT;
return 1;
}
-struct module *module_list;
-struct task_struct *task_list;
-struct lock tasklist_lock;
-
unsigned long text_read_ul(void *addr)
{
int i;
#include <string.h>
#include <sys/types.h>
-#if 0
-struct module
-{
- struct module *next;
- char *name;
-};
-extern struct module *module_list;
-#endif
-
-struct thread
-{
- unsigned long esp;
-};
-
-struct task_struct
-{
- struct thread thread;
- struct task_struct *next;
-};
-
-unsigned long __get_free_page(int type);
-void *kmalloc(size_t size, int type);
-#define GFP_KERNEL 1
-void free_page(unsigned long page);
-void kfree(void *mem);
-void vfree(void *mem);
-
-size_t strncpy_from_user(char *addr, const char *user_name, size_t size);
-
-void lock_kernel(void);
-void unlock_kernel(void);
-
-/* void __asm__(char *str); */
-
-#define for_each_task(t) for(t= task_list; t; t=t->next)
-extern struct task_struct *task_list;
-
-typedef struct { int foo; } pgprot_t;
-extern void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot);
-
#define ElfW(type) Elf_ ## type
typedef unsigned long Elf_Addr;
typedef unsigned long Elf_Word;
int (*fp)(void *token, const char *modname, const char *secname,
ElfW(Addr) secstart, ElfW(Addr) secend, ElfW(Word) secflags));
-unsigned long __generic_copy_to_user(void *, const void *, unsigned long);
-unsigned long __generic_copy_from_user(void *, const void *, unsigned long);
-
-struct lock { int dummy; };
-extern struct lock tasklist_lock;
-void read_lock(struct lock *lock);
-void read_unlock(struct lock *lock);
-
-void udelay(unsigned long usecs);
-
-int copy_to_user(void * result_record, void *res, size_t size);
-
-void panic(char *str);
-
-#define PAGE_SIZE (0x1000)
-#define PAGE_MASK (0x0fff)
-#define PAGE_OFFSET 0 /* What does this do? */
-#define TASK_SIZE 0 /* What does this do? */
-
void printk(char *fmt, ...);
#include "ddb.h"
*
* 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
+ * acknowledgment appears in derived source files. No warranty
+ * is attached; we cannot take responsibility for errors or
* fitness for use.
*
*/
/*
* Fault injector for testing the usefulness of NOOKS
- *
+ *
* Adapted from the SWIFI tools used by Wee Teck Ng to evaluate the RIO
* file cache at the University of Michigan
- *
+ *
*/
-/*
- * This tool can inject faults into modules, whether they are loaded into a
+/*
+ * This tool can inject faults into modules, whether they are loaded into a
* nook or loaded into the kernel (for comparison testing).
- *
+ *
* There are several classes of faults emulated:
* - Corruption of text
* - corruption
* - incorrect source/destination (corrupted)
* - remove jmp or rep instruction
* - change address computation for memory access (not stack)
- * - change termination condition for loop (change repeat to repeat
- * -while equal, change condition to !condition
- - remove instructions loading registers from arguments (ebp+x)
- *
- * - Corruption of stack
- * - Corruption of heap
- * - copy overruns
- * - use after free
+ * - change termination condition for loop (change repeat to repeat
+ * while equal, change condition to !condition)
+ * - remove instructions loading registers from arguments (ebp+x)
*/
-#if 0
-#include <linux/kernel.h>
-#include <linux/kallsyms.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/smp_lock.h>
-#include <asm/uaccess.h>
-#include <asm/delay.h>
-#include <asm/page.h>
-#endif
+#include <stdio.h>
+#include <assert.h>
+
#include "ddb.h"
#include "db_sym.h"
#include "swifi.h"
#include "extra.h"
-#include <assert.h>
-#define CRASH_INTERVAL 8192
-#define FI_MASK 0xfff
-#define P50 0x3fffffff /* 50% of max rand */
-#define P94 0x7851eb84 /* 94% of max rand */
-#define NOP 0x90
-
-unsigned long randomSeed=0; /* random number */
-unsigned long injectFault=1; /* inject fault ? */
-unsigned long diskTest=0; /* run disk test instead of rio */
-unsigned long faultInjected=0; /* has fault been injected? */
-unsigned long crashInterval=0; /* interval between injecting fault */
-unsigned long crashCount=0; /* number of times fault is injected */
-unsigned long faultType;
-unsigned long numFaults;
-char *crashAddr=0; /* track current malloc */
-int crashToggle=1;
-int text_fault(char *mod_name, pswifi_result_t res);
-int stack_fault(pswifi_result_t res);
-int heap_fault(pswifi_result_t res);
-int direct_fault(int fault_address, int fault_content, pswifi_result_t res);
-int direct_fault1(int fault_address, int fault_content, pswifi_result_t res);
-int while1(void);
-
-int *testVA;
-
-#if 0
-#define PDEBUG(fmt, args...) \
-do { \
- printk( KERN_ALERT "SWIFI: " fmt, ## args); \
-} while (0)
-#else
-#include <stdio.h>
#define PDEBUG(args) /* (printf args) */
-#endif
-
-#define inline
-
-#ifdef CONFIG_SWIFI
-#if 0
-static inline long
-get_mod_name(const char *user_name, char **buf)
-{
- unsigned long page;
- long retval;
-
- page = __get_free_page(GFP_KERNEL);
- if (!page)
- return -ENOMEM;
+#define NOP 0x90
- retval = strncpy_from_user((char *)page, user_name, PAGE_SIZE);
- if (retval > 0) {
- if (retval < PAGE_SIZE) {
- *buf = (char *)page;
- return retval;
- }
- retval = -ENAMETOOLONG;
- } else if (!retval)
- retval = -EINVAL;
+static int text_fault(int type, unsigned long btext, unsigned long text_size);
- free_page(page);
- return retval;
-}
+static int randomFaults[] = {
+ TEXT_FAULT,
+ NOP_FAULT,
+ SRC_FAULT,
+ DST_FAULT,
+ PTR_FAULT,
+ LOOP_FAULT,
+ INTERFACE_FAULT
+};
-static inline void
-put_mod_name(char *buf)
+void
+swifi_inject_fault(char * module_name,
+ unsigned long faultType,
+ unsigned long randomSeed,
+ unsigned long numFaults)
{
- free_page((unsigned long)buf);
-}
-#endif
-
-long
-sys_inject_fault(char * module_name,
- unsigned long argFaultType,
- unsigned long argRandomSeed,
- unsigned long argNumFaults,
- pswifi_result_t result_record,
- unsigned long argInjectFault)
-{
- int result = 0;
- unsigned long fault_address = 0;
- unsigned long fault_data = 0 ;
- char * kern_name = NULL;
-#if 0
- struct module * mod = NULL;
- int found = 0;
-#endif
- pswifi_result_t res = NULL;
-
- if (argNumFaults > SWIFI_MAX_FAULTS) {
- result = -E2BIG;
- goto Cleanup;
- }
- res = (pswifi_result_t) malloc((1+argNumFaults) * sizeof(swifi_result_t));
- if (res == NULL) {
- result = -ENOMEM;
- goto Cleanup;
- }
- memset(res, 0, (1 + argNumFaults) * sizeof(swifi_result_t));
-
- /*
- // Capture the name of the module from usermode
- */
-
-#if 0
- result = get_mod_name(module_name, &kern_name);
- if (result < 0) {
- goto Cleanup;
- }
-#endif
-
- kern_name= module_name;
-
-
+ unsigned long btext, etext, text_size;
+ int type;
-
-#if 0
- lock_kernel();
-
- for (mod = module_list; mod ; mod = mod->next) {
- if (strcmp(kern_name, mod->name) == 0) {
- found = 1;
- break;
- }
- }
- unlock_kernel();
- if (!found) {
- result = -ENOENT;
- goto Cleanup;
- }
-#endif
-
- numFaults = argNumFaults;
- faultType = argFaultType;
- randomSeed = argRandomSeed;
- injectFault = argInjectFault;
-
-
- if(faultType>=DISK_TEST) {
- faultType=faultType-DISK_TEST;
- diskTest=1;
- }
- if(faultType==STATS) {
-#if 0
- extern long time_vmp, n_vmp;
- extern long time_pmp, n_pmp;
-
- PDEBUG("# vm_map_protect=%ld, total cycle=%ld\n", n_vmp, time_vmp);
- PDEBUG("# pmap_protect=%ld, total cycle=%ld\n", n_pmp, time_pmp);
- n_vmp=0; time_vmp=0;
- n_pmp=0; time_pmp=0;
-#endif
- } else if (faultType == DIRECT_FAULT) {
- fault_address = numFaults;
- fault_data = randomSeed;
- PDEBUG(("sys inject fault, type %ld, addr=%lx, flip bit%lx\n",
- faultType, fault_address, fault_data));
- } else if (faultType == DIRECT_FAULT1) {
- fault_address = numFaults;
- fault_data = randomSeed;
- PDEBUG(("sys inject fault, type %ld, addr=%lx, zero bytes %lx\n",
- faultType, fault_address, fault_data));
- } else {
- PDEBUG(("sys inject fault, type %ld, seed=%ld, fault=%ld\n",
- faultType, randomSeed, numFaults));
- }
- faultInjected=1;
-
- srandom(randomSeed);
- /* set warm reboot, leave RAM unchanged
- * 0 : don't inject fault
- * 1 : run POST, wipe out memory
- * 2 : don't test memory
- * 3 : don't change memory (doesn't work)
- * 4 : don't sync registry
- */
-
/* default number of faults is 5 */
- if(numFaults<=0 || numFaults>100) numFaults=5;
-
- switch(faultType)
- {
- case TEXT_FAULT:
- result = text_fault(module_name, res);
- break;
- case STACK_FAULT:
- result = stack_fault(res);
- break;
- case HEAP_FAULT:
- result = heap_fault(res);
- break;
- case INIT_FAULT:
- case NOP_FAULT:
- case DST_FAULT:
- case SRC_FAULT:
- case BRANCH_FAULT:
- case PTR_FAULT:
- case LOOP_FAULT:
- case INTERFACE_FAULT:
- case IRQ_FAULT:
- result = text_fault(module_name, res);
- break;
- case FREE_FAULT:
- case BCOPY_FAULT:
- case SYNC_FAULT:
- case ALLOC_FAULT:
- crashInterval=CRASH_INTERVAL; /* interval between crash */
- break;
- case MEM_LEAK_FAULT:
- crashToggle=0;
- crashInterval=CRASH_INTERVAL; /* interval between crash */
- break;
- case PANIC_FAULT:
- panic("testing panic");
- result = 0;
- break;
- /* case WP_FAULT: page_reg_fault(random()); break; */
- case DIRECT_FAULT:
- {
- direct_fault(fault_address, fault_data, res);
- break;
- }
- case DIRECT_FAULT1:
- {
- result = direct_fault1(fault_address, fault_data, res);
-
- break;
- }
- /* case PAGE_REG_DUMP: rio_dump(); break; */
- case WHILE1_FAULT:
- {
-
- result = while1();
-
- break;
- }
- /* case CPU_RESET_FAULT: cpu_reset(); break; */;
- case COW_FAULT:
- {
- /* test writing to kernel text. freebsd currently do a COW on a
- * write to kernel text.
- */
- unsigned long *addr1, *addr2;
-
- addr1 = (unsigned long *) 0xf0212000;
- addr2 = (unsigned long *) 0xf0212010;
- PDEBUG(("%p=%lx, %p=%lx\n", addr1, *addr1, addr2, *addr2));
- /*
- __asm__ ("movl $0xf0212000, %eax\n\t" \
- "movl $6, 0(%eax)\n\t" \
- "movl $6, 4(%eax)\n\t");
- */
- /* Not implemented on MINIX */
- assert(0);
- addr1 = (unsigned long *) 0xf0212000;
- addr2 = (unsigned long *) 0xf0212010;
- PDEBUG(("after injecting fault\n"));
- PDEBUG(("%p=%lx, %p=%lx\n", addr1, *addr1, addr2, *addr2));
- result = 0;
- break;
- }
-
- case DEBUGGER_FAULT:
- PDEBUG(("Debugger fault"));
- /*
- __asm__ ("movl %cr4, %ecx\n\t" \
- "movl $42, %ecx; .byte 0x0f, 0x32\n\t" \
- "movl $377, %ecx; .byte 0x0f, 0x32\n\t");
- */
- /* Not implemented on MINIX */
- assert(0);
- result = 0;
- break;
- default: PDEBUG(("unknown fault type %ld\n", faultType)); break;
- }
- if (copy_to_user(result_record, res, argNumFaults * sizeof(swifi_result_t))) {
- result = -EFAULT;
- }
- Cleanup:
-#if 0
- if (kern_name != NULL) {
- put_mod_name(kern_name);
- }
-#endif
- if (res != NULL) {
- free(res);
- }
-
- return (result);
-}
-
-int while1(void)
-{
- int i=0;
-
- PDEBUG(("entering into while 1 loop\n"));
- while(1) {
- udelay(20000);
- PDEBUG(("delay %4d secs, cpl=0x%x, ipend=0x%x\n", i+=5, 20, 30));
- if(i>(100 * 2500))
- break;
- }
- return(0);
-}
-
-
-int direct_fault(int fault_address, int fault_content, pswifi_result_t res)
-{
- unsigned long *addr;
- int flip_bit=0;
-
+ if (numFaults == 0) numFaults = 5;
- addr = (unsigned long *) (PAGE_OFFSET + fault_address);
-
- PDEBUG(("%p:0x%lx => ", addr, *addr));
-
- flip_bit = 1 << fault_content;
+ srandom(randomSeed);
- res[0].address = (unsigned long) addr;
- res[0].old = *addr;
- res[0].new = (*addr) ^ flip_bit;
+ load_nlist(module_name, &btext, &etext);
- if (injectFault) {
- *addr = (*addr) ^ flip_bit;
- }
- PDEBUG(("%lx\n", *addr));
- return(0);
-}
+ text_size = etext - btext;
-int direct_fault1(int fault_address, int fault_content, pswifi_result_t res)
-{
- unsigned long *addr, data;
+ PDEBUG(("text=%lx-%lx, size=%lx\n", btext, etext, text_size));
+ while (numFaults) {
+ if ((type = faultType) == RANDOM_FAULT)
+ type = randomFaults[random() %
+ (sizeof(randomFaults) / sizeof(randomFaults[0]))];
- addr = (unsigned long *) (PAGE_OFFSET + fault_address);
-
- PDEBUG(("%p:%lx => ", addr, *addr));
-
-
- data = *addr;
- if(fault_content==1) {
- data = data & 0xffffff00;
- data = data | 0x00000090;
- } else if(fault_content==2) {
- data = data & 0xffff0000;
- data = data | 0x00009090;
- } else if(fault_content==3) {
- data = data & 0xff000000;
- data = data | 0x00909090;
- } else if(fault_content==4) {
- data = 0x90909090;
- }
- res[0].address = (unsigned long) addr;
- res[0].old = *addr;
- res[0].new = data;
- if (injectFault) {
- *addr = data;
+ if (text_fault(type, btext, text_size))
+ numFaults--;
}
-
- PDEBUG(("%lx\n", *addr));
-
-
- return(0);
}
-
-
-
-/*
-#include <linux/sched.h>
-*/
-
-#define MAX_NUM_TASKS 20
-
-struct task_struct *
-find_task(void)
+static int text_fault(int type, unsigned long btext, unsigned long text_size)
{
- struct task_struct * task = NULL, *result = NULL ;
- int i,j;
- i = 1 + (random() % MAX_NUM_TASKS);
- j = i;
-
-
- do {
-#if 0
- read_lock(&tasklist_lock);
-#endif
- for_each_task(task) {
- if (--i == 0) {
- result = task;
- break;
- }
- }
-#if 0
- read_unlock(&tasklist_lock);
-#endif
- } while ((i > 0) && (i != j));
+ unsigned long *addr, taddr;
+ int j, flip_bit, len, prefix;
+ unsigned char *c;
- return(result);
-}
+ /* inject faults into text space */
-int
-stack_fault(pswifi_result_t res)
-{
- unsigned long *addr, size, taddr;
- int flip_bit=0;
- int count=0;
- struct task_struct *task = NULL;
+ addr = (unsigned long *)
+ (btext + ((unsigned long) (random()&~0xf) % text_size));
- while(count < numFaults) {
- task = find_task();
- if (task == NULL) {
- return(-1);
- }
+ /* now the tricky part */
- size = (unsigned long) task + TASK_SIZE - task->thread.esp;
+ taddr=(unsigned long) addr;
+ if (type != TEXT_FAULT) {
+ addr = (unsigned long *) find_faulty_instr(taddr, type, &len);
+ /* do it over again if we can't find the right instruction */
+ if (!addr || !len)
+ return FALSE;
+ }
- PDEBUG(("stack range=%lx-%lx\n",
- (unsigned long) task->thread.esp,
- (unsigned long) task + TASK_SIZE));
+ PDEBUG(("target addr=%lx, instr addr=%p, %lx=>", taddr, addr,
+ text_read_ul(addr)));
- addr = (unsigned long *) ((long) task->thread.esp +
- (random()&~0x3)%size);
- taddr=(unsigned long) addr;
+ switch (type) {
+ case TEXT_FAULT:
flip_bit = random() & 0x1f;
- PDEBUG(("%lx:%lx flip bit %d => ", taddr, *addr, flip_bit));
+ PDEBUG(("flip bit %d => ", flip_bit));
flip_bit = 1 << flip_bit;
- res[count].address = taddr;
- res[count].old = *addr;
- res[count].new = (*addr) ^ flip_bit;
- if (injectFault) {
- *addr = ((*addr)^flip_bit);
- }
- PDEBUG(("%lx\n", *addr));
- count++;
- }
- return(0);
-}
+ text_write_ul(addr, text_read_ul(addr)^flip_bit);
+ break;
-/*
-// Instead of dealing with heaps directly, we look at the area cache of pages
-// and vm pages and find an address there.
-*/
-
-
-int heap_fault(pswifi_result_t res)
-{
-#ifdef notdef
- unsigned long *addr, taddr;
- int flip_bit=0;
- int count=0;
- unsigned long flags;
- struct list_head *next;
-
- addr = (unsigned long *) (map->address + (random()&~0xf)%map->size);
-
- taddr=(unsigned long) addr;
- flip_bit = random() & 0x1f;
- PDEBUG("heap range=%lx-%lx ", map->address, map->address + map->size);
- PDEBUG("%lx:%lx flip bit %d => ", taddr, *addr, flip_bit);
- flip_bit = 1 << flip_bit;
- res[count].address = taddr;
- res[count].old = *addr;
- res[count].new = (*addr) ^ flip_bit;
-
- if (injectFault) {
- *addr = ((*addr)^flip_bit);
- }
- PDEBUG("%lx\n", *addr);
- count++;
- } while (count < numFaults);
-#endif
- return(-1);
-
-}
+ case NOP_FAULT:
+ case INIT_FAULT:
+ case BRANCH_FAULT:
+ case INTERFACE_FAULT:
+ case IRQ_FAULT:
+ c = (unsigned char *) addr;
+ for (j = 0; j < len; j++) {
+ /* replace these bytes with NOP (*c=NOP) */
+ text_write_ub(c, NOP);
-unsigned long
-do_fault_copy_from_user (void *kaddr, const void *udaddr, unsigned long len,
- unsigned long (* copy_fn) (void *, const void *, unsigned long))
-{
- unsigned int prob, i=0;
-
- if ( faultInjected && (faultType==BCOPY_FAULT) ) {
-
- if (++crashCount == crashInterval) {
-
- crashCount=0;
- prob = random();
- crashInterval = CRASH_INTERVAL + (random() & FI_MASK);
-
- if (prob < P50) { /* corrupt 1 QW */
- i=1;
- } else if (prob < P94) { /* corrupt 2 - 1024 QW */
- i = prob & 0x3fe;
- while(!i) {
- i = random() & 0x3fe;
- }
- } else { /* corrupt 2-4 pages */
- i= prob & 0xc00;
- while(!i) {
- i = random() & 0xc00;
- }
- }
- PDEBUG(("copyin: %p to %p, len=%ld overrun=%d, Intvl=%ld, inj=%ld\n",
- udaddr, kaddr, len, i, crashInterval, faultInjected));
- if (faultInjected++ <numFaults) {
- len += i;
- } else {
- faultInjected = 0;
- }
- i = 1;
+ c++;
}
- return(copy_fn(kaddr, udaddr, len));
- } else {
- return(copy_fn(kaddr, udaddr, len));
- }
-}
-unsigned long
-do_fault_copy_to_user(void *udaddr, const void *kaddr, unsigned long len,
- unsigned long (* copy_fn) (void *,
- const void *,
- unsigned long))
-{
- unsigned int prob, i=0;
-
- if( faultInjected && (faultType==BCOPY_FAULT) ){
- crashCount++;
- if (crashCount == crashInterval) {
- crashCount=0;
- prob = random();
- crashInterval = CRASH_INTERVAL + (random() & FI_MASK);
-
- if ( prob < P50) { /* corrupt 1 QW */
- i=1;
- } else if(prob < P94) { /* corrupt 2 - 1024 QW */
- i = prob & 0x3fe;
- while (!i) {
- i = random() & 0x3fe;
- }
- } else {
- i = prob & 0xc00;
- while(!i) {
- i = random() & 0xc00;
- }
+ break;
+
+ case DST_FAULT:
+ case SRC_FAULT:
+ /* skip thru the prefix and opcode, and flip bits in following bytes */
+ c=(unsigned char *) addr;
+ do {
+ switch (text_read_ub(c)) {
+ case 0x66: case 0x67: case 0x26: case 0x36:
+ case 0x2e: case 0x3e: case 0x64: case 0x65:
+ case 0xf0: case 0xf2: case 0xf3:
+ prefix = 1;
+ break;
+ default:
+ prefix = 0;
+ break;
}
- PDEBUG(("copyout: %p to %p, len=%ld overrun=%d, Intvl=%ld, inj=%ld\n",
- kaddr, udaddr, len, i, crashInterval, faultInjected));
- if (faultInjected++ <numFaults) {
- len+=i;
- } else {
- faultInjected = 0;
+ if (prefix) {
+ c++;
}
- i=1;
+ } while (prefix);
+ if(text_read_ub(c)>=0xd8 && text_read_ub(c)<=0xdf) {
+ /* don't mess with fp instruction, yet */
+ PDEBUG(("floating point instruction, bailing out\n"));
+ return FALSE;
}
- return(copy_fn(udaddr, kaddr, len));
- } else
- return(copy_fn(udaddr, kaddr, len));
-}
-
-
-unsigned long
-swifi___generic_copy_from_user (void *kaddr, void *udaddr, unsigned long len)
-{
- return(do_fault_copy_from_user(kaddr,
- udaddr,
- len,
- __generic_copy_from_user));
-}
-
-unsigned long
-swifi___generic_copy_to_user(void *udaddr, void *kaddr, unsigned long len)
-{
- return(do_fault_copy_to_user(udaddr,
- kaddr,
- len,
- __generic_copy_to_user));
-}
-
-
-
-void *
-swifi_memcpy_fn (void *to, void *from, size_t len)
-{
- unsigned int prob, i=0;
-
- if( faultInjected && (faultType==BCOPY_FAULT) ) {
- crashCount++;
- if (crashCount == crashInterval) {
- crashCount=0;
- prob = random();
- crashInterval = CRASH_INTERVAL + (random() & FI_MASK);
-
- if (prob < P50) { /* corrupt 1 QW */
- i=1;
- } else if (prob < P94) { /* corrupt 2 - 1024 QW */
- i= prob & 0x3fe;
- while(!i) {
- i = random() & 0x3fe;
- }
- } else { /* corrupt 2-4 pages */
- i=prob&0xc00;
- while(!i) {
- i = random() & 0xc00;
- }
- }
-
- PDEBUG(("memcpy: %p to %p, len=%d overrun=%d, Intvl=%ld, inj=%ld\n",
- from, to, len, i, crashInterval, faultInjected));
- if(faultInjected++ <numFaults) len+=i;
- else faultInjected=0;
- i=1;
+ if(text_read_ub(c)==0x0f) {
+ c++;
}
- return(memcpy(to, from, len));
- } else
- return(memcpy(to, from, len));
-}
-
-
-void *
-swifi_memmove_fn (void *to, void *from, size_t len)
-{
- unsigned int prob, i=0;
-
- if( faultInjected && (faultType==BCOPY_FAULT) ) {
- crashCount++;
- if (crashCount == crashInterval) {
- crashCount=0;
- prob = random();
- crashInterval = CRASH_INTERVAL + (random() & FI_MASK);
-
- if (prob < P50) { /* corrupt 1 QW */
- i=1;
- } else if (prob < P94) { /* corrupt 2 - 1024 QW */
- i= prob & 0x3fe;
- while(!i) {
- i = random() & 0x3fe;
- }
- } else { /* corrupt 2-4 pages */
- i=prob&0xc00;
- while(!i) {
- i = random() & 0xc00;
- }
- }
-
- PDEBUG(("memmove: %p to %p, len=%d overrun=%d, Intvl=%ld, inj=%ld\n",
- from, to, len, i, crashInterval, faultInjected));
- if(faultInjected++ <numFaults) len+=i;
- else faultInjected=0;
- i=1;
+ if(text_read_ub(c)==0x0f) {
+ c++;
}
- return(memmove(to, from, len));
- } else
- return(memmove(to, from, len));
-}
-
-
-void *
-memmove_fn(void *to, void *from, size_t len)
-{
- return(memmove(to, from, len));
-}
-
-
-
-void *
-memcpy_fn(void *to, void *from, size_t len)
-{
- return(memcpy(to, from, len));
-}
-
-
-
-
-void
-do_fault_kfree(void *addr, void (* kfree_fn)(const void *))
-{
- if(addr == crashAddr) {
- crashAddr=0;
- }
- if (faultInjected && (faultType==FREE_FAULT ||
- faultType==MEM_LEAK_FAULT)) {
- crashCount++;
- if(crashCount>=crashInterval) {
-
- /* alternate between premature freeing and non-free */
- if(crashToggle) {
- if(crashAddr) {
- PDEBUG(("malloc : freeing %p prematurely\n",
- crashAddr));
- kfree_fn(crashAddr);
- kfree_fn(addr);
- crashAddr=0;
- crashToggle=0;
- crashCount=0;
- crashInterval = CRASH_INTERVAL + (random()&FI_MASK);
- if (faultInjected++ > numFaults) {
- faultInjected=0;
- }
- }
- } else {
- PDEBUG(("free: don't free %p\n", addr));
- if(faultInjected++ > numFaults) {
- faultInjected=0;
- }
- if(faultType==FREE_FAULT) {
- crashToggle=1;
- }
- crashCount=0;
- crashInterval = CRASH_INTERVAL + (random()&FI_MASK);
- }
+ c++;
+ len = len-((long) c - (long) addr);
+ if (len == 0)
+ {
+ PDEBUG(("text_fault: len = %d\n", len));
+ return FALSE;
}
- } else {
- kfree_fn(addr);
- }
-}
-
-#if 0
-void
-swifi_kfree(const void *addr)
-{
- do_fault_kfree((void *) addr, kfree);
-}
-#endif
+ flip_bit = random() % (len*8);
+ PDEBUG(("flip bit %d (len=%d) => ", flip_bit, len));
+ for(j=0; j<len; j++) {
+ /* go to the right byte */
+ if(flip_bit<8) {
+ flip_bit = 1 << flip_bit;
+ text_write_ub(c, (text_read_ub(c)^flip_bit));
-void do_vfree(const void * addr)
-{
- vfree((void *) addr);
-}
-
-
-void
-swifi_vfree(void *addr)
-{
- do_fault_kfree(addr, do_vfree);
-}
-
-
-
-
-void *
-do_fault_kmalloc(size_t size,
- int flags,
- void * (* kmalloc_fn)(size_t size, int flags))
-{
- if (faultInjected && (faultType==ALLOC_FAULT)) {
- crashCount++;
- if(crashCount>=crashInterval) {
- PDEBUG(("kmalloc : returning null\n"));
- crashCount=0;
- crashInterval = CRASH_INTERVAL + (random()&FI_MASK);
- if (faultInjected++ > numFaults) {
- faultInjected=0;
- return(NULL);
+ j=len;
}
-
+ c++;
+ flip_bit = flip_bit-8;
}
- }
- return(kmalloc_fn(size, flags));
-}
+ break;
-
-#if 0
-void *
-swifi_kmalloc(size_t size, int flags)
-{
- return(do_fault_kmalloc(size, flags, kmalloc));
-}
-#endif
-
-
-
-void * do_fault_vmalloc(unsigned long size,
- int gfp_mask,
- pgprot_t prot,
- void * (*vmalloc_fn)(unsigned long size,
- int gfp_mask,
- pgprot_t prot))
-{
- if (faultInjected && (faultType==ALLOC_FAULT)) {
- crashCount++;
- if(crashCount>=crashInterval) {
- PDEBUG(("vmalloc : returning null\n"));
- crashCount=0;
- crashInterval = CRASH_INTERVAL + (random()&FI_MASK);
- if (faultInjected++ > numFaults) {
- faultInjected=0;
- return(NULL);
+ case PTR_FAULT:
+ /* 5f) ptr: if instruction has regmodrm byte (i_has_modrm),
+ * flip 1 bit in lower byte (0x0f) or any bit in following
+ * bytes (sib, imm or disp).
+ */
+ c=(unsigned char *) addr;
+ do {
+ switch (text_read_ub(c)) {
+ case 0x66: case 0x67: case 0x26: case 0x36:
+ case 0x2e: case 0x3e: case 0x64: case 0x65:
+ case 0xf0: case 0xf2: case 0xf3:
+ prefix = 1;
+ break;
+ default:
+ prefix = 0;
+ break;
}
-
+ if (prefix) {
+ c++;
+ }
+ } while (prefix);
+ if(text_read_ub(c)>=0xd8 && text_read_ub(c)<=0xdf) {
+ /* don't mess with fp instruction, yet */
+ PDEBUG(("floating point instruction, bailing out\n"));
+ return FALSE;
}
- }
- return(vmalloc_fn(size, gfp_mask, prot));
-}
-
-void *
-swifi___vmalloc(unsigned long size, int gfp_mask, pgprot_t prot)
-{
- return(do_fault_vmalloc(size, gfp_mask, prot, __vmalloc));
-}
-
-
-
-#if 0
-typedef struct section_callback {
- const char * module_name;
- const char * section_name;
- unsigned long sec_start;
- unsigned long sec_end;
-} section_callback_t;
-
-static int
-text_section_callback(void *token,
- const char *modname,
- const char *secname,
- ElfW(Addr) secstart,
- ElfW(Addr) secend,
- ElfW(Word) secflags)
-{
- section_callback_t * info = (section_callback_t *) token;
-
- if ((strcmp(modname, info->module_name) == 0) &&
- (strcmp(secname, info->section_name) == 0)) {
- info->sec_start = secstart;
- info->sec_end = secend;
- return(1);
- }
- return(0);
-}
-#endif
-
-
-int text_fault(char *mod_name, pswifi_result_t res)
-{
- unsigned long *addr, text_size, offset, page, taddr;
- unsigned long btext, etext;
-
- int count, flip_bit=0, len, rc;
- unsigned char *c;
-#if 0
- struct module * module;
- section_callback_t info;
-#endif
-
-#define MAX_NUM_MODULES 10
-
- /* inject faults into text space */
-
- for(count=0; count<numFaults; count++) {
- int i = 1 + (random() % MAX_NUM_MODULES);
- int j = i;
-#if 0
- module = mod;
-#endif
-
-#if 0
- info.module_name = module->name;
- info.module_name = "<module-name>";
- info.section_name = ".text";
-
- kallsyms_sections(&info, text_section_callback);
- if (info.sec_start == 0 ) {
- return(-1);
+ if(text_read_ub(c)==0x0f) {
+ c++;
}
-#endif
-
- load_nlist(mod_name, &btext, &etext);
-
-#if 0
- btext = info.sec_start;
- etext = info.sec_end;
-#endif
- text_size = etext - btext;
-
- PDEBUG(("text=%lx-%lx, size=%lx\n", btext, etext, text_size));
-
- addr = (unsigned long *)
- (btext + ((unsigned long) (random()&~0xf) % text_size));
-
- /* now the tricky part */
-
- taddr=(unsigned long) addr;
- if( faultType==INIT_FAULT ||
- faultType==NOP_FAULT ||
- faultType==DST_FAULT ||
- faultType==SRC_FAULT ||
- faultType==BRANCH_FAULT ||
- faultType==PTR_FAULT ||
- faultType==LOOP_FAULT ||
- faultType==INTERFACE_FAULT ||
- faultType==IRQ_FAULT ) {
- addr = (unsigned long *) find_faulty_instr(taddr, faultType, &len);
- /* do it over again if we can't find the right instruction */
- if(!addr || !len ) {
- i--;
- continue;
- }
+ if(text_read_ub(c)==0x0f) {
+ c++;
}
+ c++;
+ len = len-((long) c - (long) addr);
+ flip_bit = random() % (len*8-4);
+ PDEBUG(("flip bit %d (len=%d) => ", flip_bit, len));
-printf("len = %d\n", len);
+ /* mod/rm byte is special */
- PDEBUG(("target addr=%lx, instr addr=%p, %lx=>", taddr, addr,
- text_read_ul(addr)));
-
- offset = (unsigned long) addr&PAGE_MASK;
- page = (unsigned long) addr&~PAGE_MASK;
-
- /* it doesn't matter what we used here to unprotect page,
- * as this routine will not be in production code.
- */
-
- res[count].address = taddr;
- res[count].old = text_read_ul(addr);
- res[count].new = text_read_ul(addr);
-
- if (faultType==TEXT_FAULT) {
-
- flip_bit = random() & 0x1f;
- PDEBUG(("flip bit %d => ", flip_bit));
+ if (flip_bit < 4) {
flip_bit = 1 << flip_bit;
- res[count].new = text_read_ul(addr) ^ flip_bit;
-
- if (injectFault) {
- text_write_ul(addr, text_read_ul(addr)^flip_bit);
- }
+ text_write_ub(c, text_read_ub(c)^flip_bit);
+ }
+ c++;
+ flip_bit=flip_bit-4;
- } else if (faultType==NOP_FAULT ||
- faultType==INIT_FAULT ||
- faultType==BRANCH_FAULT ||
- faultType==INTERFACE_FAULT ||
- faultType==IRQ_FAULT) {
- c = (unsigned char *) addr;
+ for(j=1; j<len; j++) {
+ /* go to the right byte */
+ if (flip_bit<8) {
+ flip_bit = 1 << flip_bit;
- for (j = 0; j < len; j++) {
- /* replace these bytes with NOP (*c=NOP) */
- if (j < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[j] = NOP;
- }
- if (injectFault) {
- text_write_ub(c, NOP);
- }
+ text_write_ub(c, text_read_ub(c)^flip_bit);
- c++;
- }
- } else if (faultType==DST_FAULT || faultType==SRC_FAULT) {
- /* skip thru the prefix and opcode, and flip bits in following bytes */
- int prefix;
- c=(unsigned char *) addr;
- do {
- switch (text_read_ub(c)) {
- case 0x66: case 0x67: case 0x26: case 0x36:
- case 0x2e: case 0x3e: case 0x64: case 0x65:
- case 0xf0: case 0xf2: case 0xf3:
- prefix = 1;
- break;
- default:
- prefix = 0;
- break;
- }
- if (prefix) {
- c++;
- }
- } while (prefix);
- if(text_read_ub(c)>=0xd8 && text_read_ub(c)<=0xdf) {
- /* don't mess with fp instruction, yet.
- * but there shouldn't be any fp instr in kernel.
- */
- PDEBUG(("floating point instruction, bailing out\n"));
- i--;
- continue;
- } else if(text_read_ub(c)==0x0f) {
- c++;
- }
- if(text_read_ub(c)==0x0f) {
- c++;
+ j=len;
}
c++;
- len = len-((long) c - (long) addr);
- if (len == 0)
- {
- printf("tex_fault: len = %d\n", len);
- count--;
- continue;
- }
-if (len == 0)
-{
- int i;
-
- printf(
- "text_fault: bad length at address %p, c = %p, fault type %ld\n",
- addr, c, faultType);
- printf("bytes:");
- for (i= 0; i<16; i++)
- printf(" 0x%02x", text_read_ub((char *)addr+i));
- printf("\n");
- abort();
- *(int *)-4 = 0;
-}
- flip_bit = random() % (len*8);
- PDEBUG(("flip bit %d (len=%d) => ", flip_bit, len));
- for(j=0; j<len; j++) {
- /* go to the right byte */
- if(flip_bit<8) {
- flip_bit = 1 << flip_bit;
-
- if (j < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[j] =
- (text_read_ub(c) ^ flip_bit);
- }
-
-
- if (injectFault) {
- text_write_ub(c, (text_read_ub(c)^flip_bit));
- }
+ flip_bit = flip_bit-8;
+ }
- j=len;
- }
- c++;
- flip_bit = flip_bit-8;
- }
- } else if(faultType==PTR_FAULT) {
- /* 5f) ptr: if instruction has regmodrm byte (i_has_modrm),
- * flip 1 bit in lower byte (0x0f) or any bit in following
- * bytes (sib, imm or disp).
+ break;
+
+ case LOOP_FAULT:
+ c=(unsigned char *) addr;
+ /* replace rep with repe, and vice versa */
+ if(text_read_ub(c)==0xf3) {
+ text_write_ub(c, 0xf2);
+ } else if(text_read_ub(c)==0xf2) {
+ text_write_ub(c, 0xf3);
+ } else if( (text_read_ub(c)&0xf0)==0x70 ) {
+ /* if we've jxx imm8 instruction,
+ * incl even byte instruction, eg jo (70) to jno (71)
+ * decl odd byte instruction, eg jnle (7f) to jle (7e)
*/
- int prefix;
- c=(unsigned char *) addr;
- do {
- switch (text_read_ub(c)) {
- case 0x66: case 0x67: case 0x26: case 0x36:
- case 0x2e: case 0x3e: case 0x64: case 0x65:
- case 0xf0: case 0xf2: case 0xf3:
- prefix = 1;
- break;
- default:
- prefix = 0;
- break;
- }
- if (prefix) {
- c++;
- }
- } while (prefix);
- if(text_read_ub(c)>=0xd8 && text_read_ub(c)<=0xdf) {
- /* don't mess with fp instruction, yet */
- PDEBUG(("floating point instruction, bailing out\n"));
- i--;
- continue;
- } else if(text_read_ub(c)==0x0f) {
- c++;
- }
- if(text_read_ub(c)==0x0f) {
- c++;
+ if(text_read_ub(c)%2 == 0) {
+ text_write_ub(c, text_read_ub(c)+1);
+ } else {
+ text_write_ub(c, text_read_ub(c)-1);
}
+ } else if(text_read_ub(c)==0x66 || text_read_ub(c)==0x67) {
+ /* override prefix */
c++;
- len = len-((long) c - (long) addr);
- flip_bit = random() % (len*8-4);
- PDEBUG(("flip bit %d (len=%d) => ", flip_bit, len));
-
- /* mod/rm byte is special */
-
- if (flip_bit < 4) {
- flip_bit = 1 << flip_bit;
-
- rc = c - (unsigned char *) addr;
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = text_read_ub(c) ^ flip_bit;
-
- }
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)^flip_bit);
- }
-
- }
- c++;
- flip_bit=flip_bit-4;
-
- for(j=1; j<len; j++) {
- /* go to the right byte */
- if (flip_bit<8) {
- flip_bit = 1 << flip_bit;
-
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] =
- text_read_ub(c) ^ flip_bit;
-
- }
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)^flip_bit);
- }
-
- j=len;
- }
- c++;
- flip_bit = flip_bit-8;
+ } else if(text_read_ub(c++)==0xf && (text_read_ub(c)&0xf0)==0x80 ) {
+ /* if we've jxx imm16/32 instruction,
+ * incl even byte instruction, eg jo (80) to jno (81)
+ * decl odd byte instruction, eg jnle (8f) to jle (8e)
+ */
+ if(text_read_ub(c)%2 == 0) {
+ text_write_ub(c, text_read_ub(c)+1);
+ } else {
+ text_write_ub(c, text_read_ub(c)-1);
}
- } else if(faultType==LOOP_FAULT) {
- c=(unsigned char *) addr;
- /* replace rep with repe, and vice versa */
- if(text_read_ub(c)==0xf3) {
- if (j < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[j] = NOP;
- }
-
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = 0xf2;
-
- }
- if (injectFault) {
- text_write_ub(c, 0xf2);
- }
- } else if(text_read_ub(c)==0xf2) {
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = 0xf3;
-
- }
- if (injectFault) {
- text_write_ub(c, 0xf3);
- }
- } else if( (text_read_ub(c)&0xf0)==0x70 ) {
- /* if we've jxx imm8 instruction,
- * incl even byte instruction, eg jo (70) to jno (71)
- * decl odd byte instruction, eg jnle (7f) to jle (7e)
- */
- if(text_read_ub(c)%2 == 0) {
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = text_read_ub(c) + 1;
-
- }
+ }
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)+1);
- }
- } else {
+ break;
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = text_read_ub(c) - 1;
-
- }
+ case STOP_FAULT:
+ text_write_ub(addr, BKPT_INST);
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)-1);
- }
- }
- } else if(text_read_ub(c)==0x66 || text_read_ub(c)==0x67) {
- /* override prefix */
- c++;
- } else if(text_read_ub(c++)==0xf && (text_read_ub(c)&0xf0)==0x80 ) {
- /* if we've jxx imm16/32 instruction,
- * incl even byte instruction, eg jo (80) to jno (81)
- * decl odd byte instruction, eg jnle (8f) to jle (8e)
- */
- if(text_read_ub(c)%2 == 0) {
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = text_read_ub(c) + 1;
-
- }
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)+1);
- }
- } else {
- rc = (c - (unsigned char *) addr);
- if (rc < sizeof(unsigned long)) {
- ((unsigned char *) &res[count].new)[rc] = text_read_ub(c) -1;
-
- }
+ break;
- if (injectFault) {
- text_write_ub(c, text_read_ub(c)-1);
- }
- }
- }
-
- }
- PDEBUG(("%lx\n", text_read_ul(addr)));
+ default:
+ assert(0);
}
- return(0);
-}
-
-#else /* CONFIG_SWIFI */
-
-long
-sys_inject_fault(char * module_name,
- unsigned long argFaultType,
- unsigned long argRandomSeed,
- unsigned long argNumFaults,
- pswifi_result_t result_record,
- unsigned long do_inject)
-{
- return(0);
+ return TRUE;
}
-
-#endif /* CONFIG_SWIFI */
+++ /dev/null
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)random.c 8.1 (Berkeley) 6/10/93
- */
-
-#include "ddb.h"
-
-static unsigned long randseed = 1;
-
-void
-srandom(seed)
- unsigned long seed;
-{
- randseed = seed;
-}
-
-/*
- * Pseudo-random number generator for randomizing the profiling clock,
- * and whatever else we might use it for. The result is uniform on
- * [0, 2^31 - 1].
- */
-unsigned long
-random()
-{
- register long x, hi, lo, t;
-
- /*
- * Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1).
- * From "Random number generators: good ones are hard to find",
- * Park and Miller, Communications of the ACM, vol. 31, no. 10,
- * October 1988, p. 1195.
- */
- x = randseed;
- hi = x / 127773;
- lo = x % 127773;
- t = 16807 * lo - 2836 * hi;
- if (t <= 0)
- t += 0x7fffffff;
- randseed = t;
- return (t);
-}
+++ /dev/null
-diff -ruN linux/arch/i386/kernel/entry.S linux-nonooks/arch/i386/kernel/entry.S
---- linux/arch/i386/kernel/entry.S 2002-02-25 14:37:53.000000000 -0500
-+++ linux-nonooks/arch/i386/kernel/entry.S 2005-01-12 15:30:51.000000000 -0500
-@@ -635,6 +635,61 @@
- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lremovexattr */
- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-
-+#ifdef CONFIG_SWIFI
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 240 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 245 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 250 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 255 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 260 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 265 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 270 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 275 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 280 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_ni_syscall) /* 285 reserved for fremovexattr */
-+ .long SYMBOL_NAME(sys_inject_fault)
-+#endif /* CONFIG_SWIFI */
-+
- .rept NR_syscalls-(.-sys_call_table)/4
- .long SYMBOL_NAME(sys_ni_syscall)
- .endr
-+
-+
-diff -ruN linux/config-swifi linux-nonooks/config-swifi
---- linux/config-swifi 1969-12-31 19:00:00.000000000 -0500
-+++ linux-nonooks/config-swifi 2005-01-12 15:10:12.000000000 -0500
-@@ -0,0 +1,911 @@
-+#
-+# Automatically generated by make menuconfig: don't edit
-+#
-+CONFIG_X86=y
-+CONFIG_ISA=y
-+# CONFIG_SBUS is not set
-+CONFIG_UID16=y
-+
-+#
-+# Code maturity level options
-+#
-+CONFIG_EXPERIMENTAL=y
-+
-+#
-+# Loadable module support
-+#
-+CONFIG_MODULES=y
-+# CONFIG_MODVERSIONS is not set
-+CONFIG_KMOD=y
-+
-+#
-+# Processor type and features
-+#
-+# CONFIG_M386 is not set
-+# CONFIG_M486 is not set
-+# CONFIG_M586 is not set
-+# CONFIG_M586TSC is not set
-+# CONFIG_M586MMX is not set
-+# CONFIG_M686 is not set
-+CONFIG_MPENTIUMIII=y
-+# CONFIG_MPENTIUM4 is not set
-+# CONFIG_MK6 is not set
-+# CONFIG_MK7 is not set
-+# CONFIG_MELAN is not set
-+# CONFIG_MCRUSOE is not set
-+# CONFIG_MWINCHIPC6 is not set
-+# CONFIG_MWINCHIP2 is not set
-+# CONFIG_MWINCHIP3D is not set
-+# CONFIG_MCYRIXIII is not set
-+CONFIG_X86_WP_WORKS_OK=y
-+CONFIG_X86_INVLPG=y
-+CONFIG_X86_CMPXCHG=y
-+CONFIG_X86_XADD=y
-+CONFIG_X86_BSWAP=y
-+CONFIG_X86_POPAD_OK=y
-+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_X86_L1_CACHE_SHIFT=5
-+CONFIG_X86_TSC=y
-+CONFIG_X86_GOOD_APIC=y
-+CONFIG_X86_PGE=y
-+CONFIG_X86_USE_PPRO_CHECKSUM=y
-+# CONFIG_TOSHIBA is not set
-+# CONFIG_I8K is not set
-+CONFIG_MICROCODE=y
-+CONFIG_X86_MSR=y
-+CONFIG_X86_CPUID=y
-+CONFIG_NOHIGHMEM=y
-+# CONFIG_HIGHMEM4G is not set
-+# CONFIG_HIGHMEM64G is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_MTRR=y
-+# CONFIG_SMP is not set
-+# CONFIG_X86_UP_APIC is not set
-+# CONFIG_X86_UP_IOAPIC is not set
-+
-+#
-+# General setup
-+#
-+CONFIG_NET=y
-+CONFIG_PCI=y
-+# CONFIG_PCI_GOBIOS is not set
-+# CONFIG_PCI_GODIRECT is not set
-+CONFIG_PCI_GOANY=y
-+CONFIG_PCI_BIOS=y
-+CONFIG_PCI_DIRECT=y
-+CONFIG_PCI_NAMES=y
-+CONFIG_EISA=y
-+# CONFIG_MCA is not set
-+CONFIG_HOTPLUG=y
-+
-+#
-+# PCMCIA/CardBus support
-+#
-+# CONFIG_PCMCIA is not set
-+
-+#
-+# PCI Hotplug Support
-+#
-+# CONFIG_HOTPLUG_PCI is not set
-+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
-+# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_SYSCTL=y
-+CONFIG_KCORE_ELF=y
-+# CONFIG_KCORE_AOUT is not set
-+CONFIG_BINFMT_AOUT=y
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_PM=y
-+# CONFIG_ACPI is not set
-+CONFIG_APM=y
-+# CONFIG_APM_IGNORE_USER_SUSPEND is not set
-+# CONFIG_APM_DO_ENABLE is not set
-+CONFIG_APM_CPU_IDLE=y
-+# CONFIG_APM_DISPLAY_BLANK is not set
-+CONFIG_APM_RTC_IS_GMT=y
-+# CONFIG_APM_ALLOW_INTS is not set
-+# CONFIG_APM_REAL_MODE_POWER_OFF is not set
-+
-+#
-+# Memory Technology Devices (MTD)
-+#
-+# CONFIG_MTD is not set
-+
-+#
-+# Parallel port support
-+#
-+CONFIG_PARPORT=y
-+CONFIG_PARPORT_PC=y
-+CONFIG_PARPORT_PC_CML1=y
-+# CONFIG_PARPORT_SERIAL is not set
-+# CONFIG_PARPORT_PC_FIFO is not set
-+# CONFIG_PARPORT_PC_SUPERIO is not set
-+# CONFIG_PARPORT_AMIGA is not set
-+# CONFIG_PARPORT_MFC3 is not set
-+# CONFIG_PARPORT_ATARI is not set
-+# CONFIG_PARPORT_GSC is not set
-+# CONFIG_PARPORT_SUNBPP is not set
-+# CONFIG_PARPORT_OTHER is not set
-+CONFIG_PARPORT_1284=y
-+
-+#
-+# Plug and Play configuration
-+#
-+CONFIG_PNP=y
-+CONFIG_ISAPNP=y
-+
-+#
-+# Block devices
-+#
-+CONFIG_BLK_DEV_FD=y
-+# CONFIG_BLK_DEV_XD is not set
-+# CONFIG_PARIDE is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_NBD=y
-+# CONFIG_BLK_DEV_RAM is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+
-+#
-+# Multi-device support (RAID and LVM)
-+#
-+# CONFIG_MD is not set
-+# CONFIG_BLK_DEV_MD is not set
-+# CONFIG_MD_LINEAR is not set
-+# CONFIG_MD_RAID0 is not set
-+# CONFIG_MD_RAID1 is not set
-+# CONFIG_MD_RAID5 is not set
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_BLK_DEV_LVM is not set
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+CONFIG_NETLINK_DEV=y
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_FILTER=y
-+CONFIG_UNIX=y
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+# CONFIG_IP_PNP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_INET_ECN=y
-+CONFIG_SYN_COOKIES=y
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_CONNTRACK is not set
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
-+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
-+# CONFIG_IPV6 is not set
-+CONFIG_KHTTPD=m
-+# CONFIG_ATM is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_LLC is not set
-+# CONFIG_NET_DIVERT is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_FASTROUTE is not set
-+# CONFIG_NET_HW_FLOWCONTROL is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Telephony Support
-+#
-+# CONFIG_PHONE is not set
-+# CONFIG_PHONE_IXJ is not set
-+# CONFIG_PHONE_IXJ_PCMCIA is not set
-+
-+#
-+# ATA/IDE/MFM/RLL support
-+#
-+CONFIG_IDE=y
-+
-+#
-+# IDE, ATA and ATAPI Block devices
-+#
-+CONFIG_BLK_DEV_IDE=y
-+# CONFIG_BLK_DEV_HD_IDE is not set
-+# CONFIG_BLK_DEV_HD is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+CONFIG_IDEDISK_MULTI_MODE=y
-+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
-+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
-+# CONFIG_BLK_DEV_IDEDISK_IBM is not set
-+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
-+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
-+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
-+# CONFIG_BLK_DEV_IDEDISK_WD is not set
-+# CONFIG_BLK_DEV_COMMERIAL is not set
-+# CONFIG_BLK_DEV_TIVO is not set
-+# CONFIG_BLK_DEV_IDECS is not set
-+CONFIG_BLK_DEV_IDECD=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+CONFIG_BLK_DEV_CMD640=y
-+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-+CONFIG_BLK_DEV_ISAPNP=y
-+CONFIG_BLK_DEV_RZ1000=y
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_SHARE_IRQ=y
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+CONFIG_BLK_DEV_ADMA=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_IDEDMA_PCI_AUTO=y
-+CONFIG_BLK_DEV_IDEDMA=y
-+# CONFIG_IDEDMA_PCI_WIP is not set
-+# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
-+CONFIG_BLK_DEV_AEC62XX=y
-+CONFIG_AEC62XX_TUNING=y
-+CONFIG_BLK_DEV_ALI15X3=y
-+# CONFIG_WDC_ALI15X3 is not set
-+CONFIG_BLK_DEV_AMD74XX=y
-+# CONFIG_AMD74XX_OVERRIDE is not set
-+CONFIG_BLK_DEV_CMD64X=y
-+CONFIG_BLK_DEV_CY82C693=y
-+CONFIG_BLK_DEV_CS5530=y
-+CONFIG_BLK_DEV_HPT34X=y
-+# CONFIG_HPT34X_AUTODMA is not set
-+CONFIG_BLK_DEV_HPT366=y
-+CONFIG_BLK_DEV_PIIX=y
-+CONFIG_PIIX_TUNING=y
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_PDC202XX=y
-+# CONFIG_PDC202XX_BURST is not set
-+CONFIG_PDC202XX_FORCE=y
-+CONFIG_BLK_DEV_SVWKS=y
-+CONFIG_BLK_DEV_SIS5513=y
-+CONFIG_BLK_DEV_SLC90E66=y
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_IDE_CHIPSETS is not set
-+CONFIG_IDEDMA_AUTO=y
-+# CONFIG_IDEDMA_IVB is not set
-+# CONFIG_DMA_NONPCI is not set
-+CONFIG_BLK_DEV_IDE_MODES=y
-+# CONFIG_BLK_DEV_ATARAID is not set
-+# CONFIG_BLK_DEV_ATARAID_PDC is not set
-+# CONFIG_BLK_DEV_ATARAID_HPT is not set
-+
-+#
-+# SCSI support
-+#
-+# CONFIG_SCSI is not set
-+
-+#
-+# Fusion MPT device support
-+#
-+# CONFIG_FUSION is not set
-+# CONFIG_FUSION_BOOT is not set
-+# CONFIG_FUSION_ISENSE is not set
-+# CONFIG_FUSION_CTL is not set
-+# CONFIG_FUSION_LAN is not set
-+
-+#
-+# IEEE 1394 (FireWire) support (EXPERIMENTAL)
-+#
-+# CONFIG_IEEE1394 is not set
-+
-+#
-+# I2O device support
-+#
-+# CONFIG_I2O is not set
-+# CONFIG_I2O_PCI is not set
-+# CONFIG_I2O_BLOCK is not set
-+# CONFIG_I2O_LAN is not set
-+# CONFIG_I2O_SCSI is not set
-+# CONFIG_I2O_PROC is not set
-+
-+#
-+# Network device support
-+#
-+CONFIG_NETDEVICES=y
-+
-+#
-+# ARCnet devices
-+#
-+# CONFIG_ARCNET is not set
-+CONFIG_DUMMY=m
-+# CONFIG_BONDING is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_ETHERTAP is not set
-+# CONFIG_NET_SB1000 is not set
-+
-+#
-+# Ethernet (10 or 100Mbit)
-+#
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_SUNLANCE is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNBMAC is not set
-+# CONFIG_SUNQE is not set
-+# CONFIG_SUNGEM is not set
-+CONFIG_NET_VENDOR_3COM=y
-+# CONFIG_EL1 is not set
-+# CONFIG_EL2 is not set
-+# CONFIG_ELPLUS is not set
-+# CONFIG_EL16 is not set
-+# CONFIG_EL3 is not set
-+# CONFIG_3C515 is not set
-+# CONFIG_ELMC is not set
-+# CONFIG_ELMC_II is not set
-+CONFIG_VORTEX=m
-+CONFIG_LANCE=m
-+# CONFIG_NET_VENDOR_SMC is not set
-+# CONFIG_NET_VENDOR_RACAL is not set
-+# CONFIG_AT1700 is not set
-+# CONFIG_DEPCA is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_NET_ISA is not set
-+CONFIG_NET_PCI=y
-+CONFIG_PCNET32=m
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_AC3200 is not set
-+# CONFIG_APRICOT is not set
-+# CONFIG_CS89x0 is not set
-+CONFIG_TULIP=m
-+# CONFIG_TULIP_MWI is not set
-+# CONFIG_TULIP_MMIO is not set
-+# CONFIG_DE4X5 is not set
-+# CONFIG_DGRS is not set
-+# CONFIG_DM9102 is not set
-+CONFIG_EEPRO100=m
-+# CONFIG_LNE390 is not set
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_NE3210 is not set
-+# CONFIG_ES3210 is not set
-+# CONFIG_8139CP is not set
-+# CONFIG_8139TOO is not set
-+# CONFIG_8139TOO_PIO is not set
-+# CONFIG_8139TOO_TUNE_TWISTER is not set
-+# CONFIG_8139TOO_8129 is not set
-+# CONFIG_8139_NEW_RX_RESET is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_VIA_RHINE_MMIO is not set
-+# CONFIG_WINBOND_840 is not set
-+# CONFIG_NET_POCKET is not set
-+
-+#
-+# Ethernet (1000 Mbit)
-+#
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_MYRI_SBUS is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PLIP is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+
-+#
-+# Wireless LAN (non-hamradio)
-+#
-+# CONFIG_NET_RADIO is not set
-+
-+#
-+# Token Ring devices
-+#
-+# CONFIG_TR is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_RCPCI is not set
-+# CONFIG_SHAPER is not set
-+
-+#
-+# Wan interfaces
-+#
-+# CONFIG_WAN is not set
-+
-+#
-+# Amateur Radio support
-+#
-+# CONFIG_HAMRADIO is not set
-+
-+#
-+# IrDA (infrared) support
-+#
-+# CONFIG_IRDA is not set
-+
-+#
-+# ISDN subsystem
-+#
-+# CONFIG_ISDN is not set
-+
-+#
-+# Old CD-ROM drivers (not SCSI, not IDE)
-+#
-+# CONFIG_CD_NO_IDESCSI is not set
-+
-+#
-+# Input core support
-+#
-+CONFIG_INPUT=m
-+CONFIG_INPUT_KEYBDEV=m
-+CONFIG_INPUT_MOUSEDEV=m
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_EVDEV=m
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_SERIAL=y
-+CONFIG_SERIAL_CONSOLE=y
-+CONFIG_SERIAL_EXTENDED=y
-+CONFIG_SERIAL_MANY_PORTS=y
-+CONFIG_SERIAL_SHARE_IRQ=y
-+# CONFIG_SERIAL_DETECT_IRQ is not set
-+CONFIG_SERIAL_MULTIPORT=y
-+# CONFIG_HUB6 is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_UNIX98_PTY_COUNT=2048
-+CONFIG_PRINTER=m
-+CONFIG_LP_CONSOLE=y
-+CONFIG_PPDEV=y
-+
-+#
-+# I2C support
-+#
-+# CONFIG_I2C is not set
-+
-+#
-+# Mice
-+#
-+CONFIG_BUSMOUSE=m
-+CONFIG_ATIXL_BUSMOUSE=m
-+CONFIG_LOGIBUSMOUSE=m
-+CONFIG_MS_BUSMOUSE=m
-+CONFIG_MOUSE=y
-+CONFIG_PSMOUSE=y
-+CONFIG_82C710_MOUSE=m
-+CONFIG_PC110_PAD=m
-+
-+#
-+# Joysticks
-+#
-+# CONFIG_INPUT_GAMEPORT is not set
-+# CONFIG_INPUT_NS558 is not set
-+# CONFIG_INPUT_LIGHTNING is not set
-+# CONFIG_INPUT_PCIGAME is not set
-+# CONFIG_INPUT_CS461X is not set
-+# CONFIG_INPUT_EMU10K1 is not set
-+# CONFIG_INPUT_SERIO is not set
-+# CONFIG_INPUT_SERPORT is not set
-+# CONFIG_INPUT_ANALOG is not set
-+# CONFIG_INPUT_A3D is not set
-+# CONFIG_INPUT_ADI is not set
-+# CONFIG_INPUT_COBRA is not set
-+# CONFIG_INPUT_GF2K is not set
-+# CONFIG_INPUT_GRIP is not set
-+# CONFIG_INPUT_INTERACT is not set
-+# CONFIG_INPUT_TMDC is not set
-+# CONFIG_INPUT_SIDEWINDER is not set
-+# CONFIG_INPUT_IFORCE_USB is not set
-+# CONFIG_INPUT_IFORCE_232 is not set
-+# CONFIG_INPUT_WARRIOR is not set
-+# CONFIG_INPUT_MAGELLAN is not set
-+# CONFIG_INPUT_SPACEORB is not set
-+# CONFIG_INPUT_SPACEBALL is not set
-+# CONFIG_INPUT_STINGER is not set
-+# CONFIG_INPUT_DB9 is not set
-+# CONFIG_INPUT_GAMECON is not set
-+# CONFIG_INPUT_TURBOGRAFX is not set
-+# CONFIG_QIC02_TAPE is not set
-+
-+#
-+# Watchdog Cards
-+#
-+# CONFIG_WATCHDOG is not set
-+CONFIG_INTEL_RNG=m
-+# CONFIG_NVRAM is not set
-+CONFIG_RTC=y
-+CONFIG_DTLK=y
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_SONYPI is not set
-+
-+#
-+# Ftape, the floppy tape device driver
-+#
-+# CONFIG_FTAPE is not set
-+CONFIG_AGP=m
-+CONFIG_AGP_INTEL=y
-+CONFIG_AGP_I810=y
-+CONFIG_AGP_VIA=y
-+CONFIG_AGP_AMD=y
-+CONFIG_AGP_SIS=y
-+CONFIG_AGP_ALI=y
-+CONFIG_AGP_SWORKS=y
-+CONFIG_DRM=y
-+# CONFIG_DRM_OLD is not set
-+CONFIG_DRM_NEW=y
-+CONFIG_DRM_TDFX=y
-+CONFIG_DRM_R128=m
-+CONFIG_DRM_RADEON=m
-+CONFIG_DRM_I810=m
-+CONFIG_DRM_MGA=m
-+# CONFIG_DRM_SIS is not set
-+# CONFIG_MWAVE is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_QUOTA=y
-+CONFIG_AUTOFS_FS=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_REISERFS_FS=m
-+# CONFIG_REISERFS_CHECK is not set
-+CONFIG_REISERFS_PROC_INFO=y
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_ADFS_FS_RW is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FAT_FS=m
-+CONFIG_MSDOS_FS=m
-+# CONFIG_UMSDOS_FS is not set
-+CONFIG_VFAT_FS=m
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+CONFIG_TMPFS=y
-+CONFIG_RAMFS=m
-+CONFIG_ISO9660_FS=y
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_NTFS_FS is not set
-+# CONFIG_NTFS_RW is not set
-+# CONFIG_HPFS_FS is not set
-+CONFIG_PROC_FS=y
-+# CONFIG_DEVFS_FS is not set
-+# CONFIG_DEVFS_MOUNT is not set
-+# CONFIG_DEVFS_DEBUG is not set
-+CONFIG_DEVPTS_FS=y
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_QNX4FS_RW is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_EXT2_FS=y
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UDF_FS is not set
-+# CONFIG_UDF_RW is not set
-+# CONFIG_UFS_FS is not set
-+# CONFIG_UFS_FS_WRITE is not set
-+
-+#
-+# Network File Systems
-+#
-+# CONFIG_CODA_FS is not set
-+# CONFIG_INTERMEZZO_FS is not set
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_ROOT_NFS is not set
-+CONFIG_NFSD=y
-+CONFIG_NFSD_V3=y
-+CONFIG_SUNRPC=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_SMB_FS=m
-+# CONFIG_SMB_NLS_DEFAULT is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_NCPFS_PACKET_SIGNING is not set
-+# CONFIG_NCPFS_IOCTL_LOCKING is not set
-+# CONFIG_NCPFS_STRONG is not set
-+# CONFIG_NCPFS_NFS_NS is not set
-+# CONFIG_NCPFS_OS2_NS is not set
-+# CONFIG_NCPFS_SMALLDOS is not set
-+# CONFIG_NCPFS_NLS is not set
-+# CONFIG_NCPFS_EXTRAS is not set
-+CONFIG_ZISOFS_FS=y
-+CONFIG_ZLIB_FS_INFLATE=y
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_BSD_DISKLABEL=y
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+CONFIG_SMB_NLS=y
-+CONFIG_NLS=y
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=m
-+CONFIG_NLS_CODEPAGE_737=m
-+CONFIG_NLS_CODEPAGE_775=m
-+CONFIG_NLS_CODEPAGE_850=m
-+CONFIG_NLS_CODEPAGE_852=m
-+CONFIG_NLS_CODEPAGE_855=m
-+CONFIG_NLS_CODEPAGE_857=m
-+CONFIG_NLS_CODEPAGE_860=m
-+CONFIG_NLS_CODEPAGE_861=m
-+CONFIG_NLS_CODEPAGE_862=m
-+CONFIG_NLS_CODEPAGE_863=m
-+CONFIG_NLS_CODEPAGE_864=m
-+CONFIG_NLS_CODEPAGE_865=m
-+CONFIG_NLS_CODEPAGE_866=m
-+CONFIG_NLS_CODEPAGE_869=m
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+CONFIG_NLS_CODEPAGE_874=m
-+CONFIG_NLS_ISO8859_8=m
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ISO8859_1=m
-+CONFIG_NLS_ISO8859_2=m
-+CONFIG_NLS_ISO8859_3=m
-+CONFIG_NLS_ISO8859_4=m
-+CONFIG_NLS_ISO8859_5=m
-+CONFIG_NLS_ISO8859_6=m
-+CONFIG_NLS_ISO8859_7=m
-+CONFIG_NLS_ISO8859_9=m
-+CONFIG_NLS_ISO8859_13=m
-+CONFIG_NLS_ISO8859_14=m
-+CONFIG_NLS_ISO8859_15=m
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+
-+#
-+# Console drivers
-+#
-+CONFIG_VGA_CONSOLE=y
-+CONFIG_VIDEO_SELECT=y
-+CONFIG_MDA_CONSOLE=m
-+
-+#
-+# Frame-buffer support
-+#
-+CONFIG_FB=y
-+CONFIG_DUMMY_CONSOLE=y
-+# CONFIG_FB_RIVA is not set
-+# CONFIG_FB_CLGEN is not set
-+# CONFIG_FB_PM2 is not set
-+# CONFIG_FB_CYBER2000 is not set
-+CONFIG_FB_VESA=y
-+CONFIG_FB_VGA16=m
-+# CONFIG_FB_HGA is not set
-+CONFIG_VIDEO_SELECT=y
-+CONFIG_FB_MATROX=m
-+CONFIG_FB_MATROX_MILLENIUM=y
-+CONFIG_FB_MATROX_MYSTIQUE=y
-+CONFIG_FB_MATROX_G100=y
-+# CONFIG_FB_MATROX_G450 is not set
-+CONFIG_FB_MATROX_MULTIHEAD=y
-+CONFIG_FB_ATY=m
-+CONFIG_FB_ATY_GX=y
-+CONFIG_FB_ATY_CT=y
-+CONFIG_FB_RADEON=m
-+CONFIG_FB_ATY128=m
-+# CONFIG_FB_SIS is not set
-+# CONFIG_FB_3DFX is not set
-+# CONFIG_FB_VOODOO1 is not set
-+# CONFIG_FB_TRIDENT is not set
-+# CONFIG_FB_VIRTUAL is not set
-+# CONFIG_FBCON_ADVANCED is not set
-+CONFIG_FBCON_CFB8=y
-+CONFIG_FBCON_CFB16=y
-+CONFIG_FBCON_CFB24=y
-+CONFIG_FBCON_CFB32=y
-+CONFIG_FBCON_VGA_PLANES=m
-+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
-+# CONFIG_FBCON_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+
-+#
-+# Sound
-+#
-+CONFIG_SOUND=m
-+# CONFIG_SOUND_BT878 is not set
-+# CONFIG_SOUND_CMPCI is not set
-+CONFIG_SOUND_EMU10K1=m
-+# CONFIG_MIDI_EMU10K1 is not set
-+# CONFIG_SOUND_FUSION is not set
-+# CONFIG_SOUND_CS4281 is not set
-+# CONFIG_SOUND_ES1370 is not set
-+CONFIG_SOUND_ES1371=m
-+# CONFIG_SOUND_ESSSOLO1 is not set
-+# CONFIG_SOUND_MAESTRO is not set
-+# CONFIG_SOUND_MAESTRO3 is not set
-+CONFIG_SOUND_ICH=m
-+# CONFIG_SOUND_RME96XX is not set
-+# CONFIG_SOUND_SONICVIBES is not set
-+# CONFIG_SOUND_TRIDENT is not set
-+# CONFIG_SOUND_MSNDCLAS is not set
-+# CONFIG_SOUND_MSNDPIN is not set
-+# CONFIG_SOUND_VIA82CXXX is not set
-+# CONFIG_MIDI_VIA82CXXX is not set
-+CONFIG_SOUND_OSS=m
-+# CONFIG_SOUND_TRACEINIT is not set
-+CONFIG_SOUND_DMAP=y
-+# CONFIG_SOUND_AD1816 is not set
-+# CONFIG_SOUND_SGALAXY is not set
-+# CONFIG_SOUND_ADLIB is not set
-+# CONFIG_SOUND_ACI_MIXER is not set
-+CONFIG_SOUND_CS4232=m
-+# CONFIG_SOUND_SSCAPE is not set
-+# CONFIG_SOUND_GUS is not set
-+# CONFIG_SOUND_VMIDI is not set
-+# CONFIG_SOUND_TRIX is not set
-+# CONFIG_SOUND_MSS is not set
-+# CONFIG_SOUND_MPU401 is not set
-+# CONFIG_SOUND_NM256 is not set
-+# CONFIG_SOUND_MAD16 is not set
-+# CONFIG_SOUND_PAS is not set
-+# CONFIG_PAS_JOYSTICK is not set
-+# CONFIG_SOUND_PSS is not set
-+CONFIG_SOUND_SB=m
-+# CONFIG_SOUND_AWE32_SYNTH is not set
-+# CONFIG_SOUND_WAVEFRONT is not set
-+# CONFIG_SOUND_MAUI is not set
-+# CONFIG_SOUND_YM3812 is not set
-+# CONFIG_SOUND_OPL3SA1 is not set
-+# CONFIG_SOUND_OPL3SA2 is not set
-+# CONFIG_SOUND_YMFPCI is not set
-+# CONFIG_SOUND_YMFPCI_LEGACY is not set
-+# CONFIG_SOUND_UART6850 is not set
-+# CONFIG_SOUND_AEDSP16 is not set
-+# CONFIG_SOUND_TVMIXER is not set
-+
-+#
-+# USB support
-+#
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_BANDWIDTH is not set
-+CONFIG_USB_LONG_TIMEOUT=y
-+CONFIG_USB_UHCI=m
-+CONFIG_USB_UHCI_ALT=m
-+CONFIG_USB_OHCI=m
-+# CONFIG_USB_AUDIO is not set
-+CONFIG_USB_BLUETOOTH=y
-+# CONFIG_USB_STORAGE is not set
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_HP8200e is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+CONFIG_USB_HID=m
-+CONFIG_USB_HIDDEV=y
-+# CONFIG_USB_KBD is not set
-+# CONFIG_USB_MOUSE is not set
-+CONFIG_USB_WACOM=m
-+# CONFIG_USB_DC2XX is not set
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_SCANNER is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_HPUSBSCSI is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_CDCETHER is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_USB_USS720 is not set
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+# CONFIG_USB_SERIAL_GENERIC is not set
-+# CONFIG_USB_SERIAL_BELKIN is not set
-+# CONFIG_USB_SERIAL_WHITEHEAT is not set
-+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-+# CONFIG_USB_SERIAL_EMPEG is not set
-+# CONFIG_USB_SERIAL_FTDI_SIO is not set
-+# CONFIG_USB_SERIAL_VISOR is not set
-+# CONFIG_USB_SERIAL_IPAQ is not set
-+# CONFIG_USB_SERIAL_IR is not set
-+# CONFIG_USB_SERIAL_EDGEPORT is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-+# CONFIG_USB_SERIAL_KEYSPAN is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-+# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-+# CONFIG_USB_SERIAL_MCT_U232 is not set
-+# CONFIG_USB_SERIAL_KLSI is not set
-+# CONFIG_USB_SERIAL_PL2303 is not set
-+# CONFIG_USB_SERIAL_CYBERJACK is not set
-+# CONFIG_USB_SERIAL_XIRCOM is not set
-+# CONFIG_USB_SERIAL_OMNINET is not set
-+# CONFIG_USB_RIO500 is not set
-+
-+#
-+# Bluetooth support
-+#
-+# CONFIG_BLUEZ is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_HIGHMEM is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_IOVIRT is not set
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_DEBUG_SPINLOCK is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_KDB is not set
-+# CONFIG_KDB_MODULES is not set
-+CONFIG_KALLSYMS=y
-+CONFIG_FRAME_POINTER=y
-+CONFIG_SWIFI=y
-+CONFIG_NOOKS=y
+++ /dev/null
-/*
- * swifi-ksyms.c -- exported symbols for wrappers od system functions
- *
- * Copyright (C) 2003 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 <linux/kernel.h>
-#include <linux/module.h>
-#include "swifi.h"
-
-
-EXPORT_SYMBOL(sys_inject_fault);
-
-EXPORT_SYMBOL(swifi_memmove_fn);
-EXPORT_SYMBOL(swifi_memcpy_fn);
-EXPORT_SYMBOL(memmove_fn);
-EXPORT_SYMBOL(memcpy_fn);
-EXPORT_SYMBOL(swifi_kfree);
-EXPORT_SYMBOL(swifi_vfree);
-EXPORT_SYMBOL(swifi_kmalloc);
-EXPORT_SYMBOL(swifi___vmalloc);
-EXPORT_SYMBOL(swifi___generic_copy_from_user);
-EXPORT_SYMBOL(swifi___generic_copy_to_user);
-
-
+++ /dev/null
-#ifndef _SWIFI_USER_H
-#define _SWIFI_USER_H
-
-
-#define TEXT_FAULT 0
-#define STACK_FAULT 1
-#define HEAP_FAULT 2
-#define INIT_FAULT 3
-#define NOP_FAULT 4
-#define DST_FAULT 5
-#define SRC_FAULT 6
-#define BRANCH_FAULT 7
-#define PTR_FAULT 8
-#define FREE_FAULT 9
-#define BCOPY_FAULT 10
-#define SYNC_FAULT 11
-#define LOOP_FAULT 12
-#define MEM_LEAK_FAULT 13
-#define INTERFACE_FAULT 14
-#define DIRECT_FAULT 15
-#define DIRECT_FAULT1 16
-#define STATS 17
-#define WP_FAULT 19
-#define PANIC_FAULT 20
-#define WHILE1_FAULT 21
-#define DEBUGGER_FAULT 22
-#define CPU_RESET_FAULT 23
-#define PAGE_REG_DUMP 24
-#define COW_FAULT 25
-#define IRQ_FAULT 26
-#define ALLOC_FAULT 27
-#define DISK_TEST 100
-
-
-#define SWIFI_MAX_FAULTS 1000
-
-typedef struct swifi_result {
- unsigned long address;
- unsigned long old;
- unsigned long new;
-} swifi_result_t, *pswifi_result_t;
-
-long
-sys_inject_fault(char * module,
- unsigned long argFaultType,
- unsigned long argRandomSeed,
- unsigned long argNumFaults,
- pswifi_result_t result_record,
- unsigned long argInjectFault);
-
-
-#endif /* _SWIFI_USER_H */
-
-#ifndef _LINUX_SWIFI_H
-#define _LINUX_SWIFI_H
+#ifndef _SWIFI_H
+#define _SWIFI_H
#include <stdlib.h>
-#include "swifi-user.h"
-
-long
-swifi_inject_fault(char * nook_name,
- unsigned long faultType,
- unsigned long randSeed,
- unsigned long numFaults,
- void * results,
- unsigned long do_inject);
-
-
-long
-sys_inject_fault(char * module,
- unsigned long argFaultType,
- unsigned long argRandomSeed,
- unsigned long argNumFaults,
- pswifi_result_t result_record,
- unsigned long argInjectFault);
-
-void
-swifi_kfree(const void *addr);
-
+#define TEXT_FAULT 0
+#define INIT_FAULT 3
+#define NOP_FAULT 4
+#define DST_FAULT 5
+#define SRC_FAULT 6
+#define BRANCH_FAULT 7
+#define PTR_FAULT 8
+#define LOOP_FAULT 12
+#define INTERFACE_FAULT 14
+#define IRQ_FAULT 26
+#define STOP_FAULT 50
+#define RANDOM_FAULT 99
void
-swifi_vfree(void *addr);
-
-
-void *
-swifi_memmove_fn(void *to, void *from, size_t len);
-
-
-void *
-swifi_memcpy_fn(void *to, void *from, size_t len);
-
-
-void *
-memmove_fn(void *to, void *from, size_t len);
-
-void *
-memcpy_fn(void *to, void *from, size_t len);
-
-unsigned long
-swifi___generic_copy_from_user (void *kaddr, void *udaddr, unsigned long len);
-
-unsigned long
-swifi___generic_copy_to_user(void *udaddr, void *kaddr, unsigned long len);
-
-
-void *
-swifi_kmalloc(size_t size, int flags);
-
-
-#if 0
-void *
-swifi___vmalloc(unsigned long size, int gfp_mask, pgprot_t prot);
-#endif
-
-#endif /* _LINUX_SWIFI_H */
+swifi_inject_fault(char * module,
+ unsigned long faultType,
+ unsigned long randomSeed,
+ unsigned long numFaults);
+#endif /* _SWIFI_H */
*
* 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.
+ * 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 "swifi.h"
#include "extra.h"
+void
+usage(char *name)
+{
+ printf("Usage: %s -f module_name pid fault-type fault-count seed\n", name);
-#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
+ exit(EXIT_FAILURE);
+}
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;
+ usage(argv[0]);
}
for (i = 1; i < argc; i++ ) {
if (strcmp(argv[i], "-f") == 0) {
if (argc <= i+5) {
- goto Usage;
+ usage(argv[0]);
}
module_name = victim_exe = argv[++i];
sscanf(argv[++i],"%u", &victim_pid);
sscanf(argv[++i],"%lu", &seed);
} else {
printf("Unknown command %s\n", argv[i]);
- goto Usage;
+ usage(argv[0]);
}
}
- size_t ressize = arg * sizeof(swifi_result_t);
- res = malloc(ressize);
- if (res == NULL) {
- printf("Out of memory\n");
- goto Cleanup;
- }
-
- memset(res, 0, ressize);
-
- /*
- // 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 */
+ /* Do the injection. */
+ swifi_inject_fault(module_name,
+ cmd, /* fault type */
+ seed, /* random seed */
+ arg); /* numFaults */
- 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;
+ return EXIT_SUCCESS;
}
-
-
#!/bin/sh
pid=`ps ax | grep fxp | grep usr.sbin | sed 's,^[ ]*,,;s,[ ].*,,`
echo "pid = $pid"
-./swifi -f /usr/build/drivers/fxp/fxp $pid 26 100 4
+swifi -f /usr/build/drivers/fxp/fxp $pid 26 100 4
#!/bin/sh
pid=`ps ax | grep fxp | grep usr.sbin | sed 's,^[ ]*,,;s,[ ].*,,`
echo "pid = $pid"
-./swifi -f /usr/build/drivers/fxp/fxp $pid 8 100 4
+swifi -f /usr/build/drivers/fxp/fxp $pid 8 100 4
Generate random numbers
*/
-#define _POSIX_SOURCE
-
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
sleep 10
done
echo pid = $pid
- ./swifi -f $EXE $pid $1 $2 $3 >/tmp/out
+ swifi -f $EXE $pid $1 $2 $3 >/tmp/out
sleep 1
kill -0 $pid &&
echo "driver survived, params: test $1, count $2, seed $3" ||
sleep 1
done
echo pid = $pid
- ./swifi -f /usr/build/drivers/dp8390/dp8390 $pid $1 $2 $3 >/tmp/out
+ swifi -f /usr/build/drivers/dp8390/dp8390 $pid $1 $2 $3 >/tmp/out
sleep 5
kill -0 $pid &&
echo "driver failed to die, params: test $1, count $2, seed $3"
sleep 10
done
echo pid = $pid
- ./swifi -f $EXE $pid $1 $2 $3 >/tmp/out
+ swifi -f $EXE $pid $1 $2 $3 >/tmp/out
sleep 1
kill -0 $pid &&
echo "driver failed to die, params: test $1, count $2, seed $3"
;;
nop) type_arg=4
;;
-random)
+random)
;;
*)
usage
kill -1 `ps ax | grep syslogd | grep -v grep |
sed 's,^[ ]*,,;s,[ ].*,,'`
-./run_t1 $count $type `expr $run \* 1000` 2>&1 |
+./run_t1 $count $type `expr $run \* 1000` 2>&1 |
tee results/1.$type.$run.out
cp $LOGFILE results/1.$type.$run.log
sleep 10
done
echo pid = $pid
- ./swifi -f $EXE $pid $1 $2 $3 >/tmp/out
+ swifi -f $EXE $pid $1 $2 $3 >/tmp/out
sleep 1
fault_blocks=`expr $fault_blocks + 1`
- if kill -0 $pid
+ if kill -0 $pid
then
if [ $dont_connect -eq 0 ]
then
;;
nop) type_arg=4
;;
-random)
+random)
;;
*)
usage
kill -1 `ps ax | grep syslogd | grep -v grep |
sed 's,^[ ]*,,;s,[ ].*,,'`
-./run_t2 $count $type `expr $run \* 1000` 2>&1 |
+./run_t2 $count $type `expr $run \* 1000` 2>&1 |
tee results/2.$type.$run.out
cp $LOGFILE results/2.$type.$run.log
Open a TCP connection
*/
-#define _POSIX_C_SOURCE 2
-
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <net/gen/socket.h>
#include <net/gen/tcp.h>
#include <net/gen/tcp_io.h>
+#include <arpa/inet.h>
#define BUF_SIZE 10240
nwio_tcpcl_t tcpcl;
nwio_tcpopt_t tcpopt;
- if (!inet_aton(hostname, &addr))
+ if (!inet_aton(hostname, (struct in_addr *)&addr))
{
he= gethostbyname(hostname);
if (he == NULL)
tcpcl.nwtcl_flags= 0;
if (ioctl(tcpfd, NWIOTCPCONN, &tcpcl) == -1)
{
- fatal("unable to connect to %s:%u: %s", inet_ntoa(addr),
+ fatal("unable to connect to %s:%u: %s",
+ inet_ntoa(*(struct in_addr *)&addr),
ntohs(tcpconf.nwtc_remport), strerror(errno));
}
fatal("error reading from TCP conn.: %s",
strerror(errno));
}
- s= r;
+ s= r;
for (o= 0; o<s; o += r)
{
r= write(1, buf+o, s-o);
fatal("error reading from stdin: %s",
strerror(s_errno));
}
- s= r;
+ s= r;
for (o= 0; o<s; o += r)
{
r= write(tcpfd, buf+o, s-o);