[Fault-injection-developer] [PATCH] fi_pf patch against 2.5.45 kernel
Status: Alpha
Brought to you by:
rustyl
From: Zhuang, L. <lou...@in...> - 2002-11-14 05:07:40
|
Any comments? Index: src/fi_intcpt/fi_pf/Makefile.am =================================================================== RCS file: /cvsroot/fault-injection/fith_core/src/fi_intcpt/fi_pf/Makefile.am,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 Makefile.am --- src/fi_intcpt/fi_pf/Makefile.am 12 Nov 2002 05:56:32 -0000 1.1. 1.1 +++ src/fi_intcpt/fi_pf/Makefile.am 14 Nov 2002 04:21:15 -0000 @@ -5,7 +5,7 @@ include $(top_srcdir)/rules.mk -INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir)/include -I$(KERNEL)/include +INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir)/include -I$(KERNEL)/include -I$(KERNEL)/arch/i386/mach-generic if DEBUG DEBUG= -DFI_DEBUG else @@ -16,7 +16,7 @@ -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS \ -c -include $(KERNEL)/include/linux/modversions.h \ $(INCLUDE) $(DEBUG) -fi_pf_o_SOURCES = pf.c pf_hooks.c pf_interface.c pf_region.c pf_in.c +fi_pf_o_SOURCES = pf.c pf_interface.c pf_region.c pf_in.c fi_pf.o$(EXEEXT): $(fi_pf_o_OBJECTS) $(LD) -r -o $@ $^ Index: src/fi_intcpt/fi_pf/fi_pf.h =================================================================== RCS file: /cvsroot/fault-injection/fith_core/src/fi_intcpt/fi_pf/fi_pf.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 fi_pf.h --- src/fi_intcpt/fi_pf/fi_pf.h 12 Nov 2002 05:56:32 -0000 1.1.1.1 +++ src/fi_intcpt/fi_pf/fi_pf.h 14 Nov 2002 04:21:15 -0000 @@ -41,17 +41,6 @@ }; /* - * Declare functions in pf_hooks.h - */ -int initialize_pf_hooks(void); -int terminate_pf_hooks(void); -int register_pf_hooks(void); -int deregister_pf_hooks(void); -int arm_pf_hooks(void); -int disarm_pf_hooks(void); - - -/* * Declare functions in pf_interface.c */ void register_pf_interface(void); @@ -85,8 +74,6 @@ /* * Declare functions in pf.c */ -int pf_do_debug(struct pt_regs * regs, unsigned long condition); -int pf_do_page_fault(struct pt_regs * regs); int pf_register(struct watchpoint wp, int id, struct iInterceptHook *hook, char *modname); int pf_unregister(int id, char *modname); int pf_corrupt(int id, __u32 dirty, void *data); Index: src/fi_intcpt/fi_pf/pf.c =================================================================== RCS file: /cvsroot/fault-injection/fith_core/src/fi_intcpt/fi_pf/pf.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 pf.c --- src/fi_intcpt/fi_pf/pf.c 12 Nov 2002 05:56:31 -0000 1.1.1.1 +++ src/fi_intcpt/fi_pf/pf.c 14 Nov 2002 04:21:15 -0000 @@ -50,8 +50,9 @@ #include <linux/slab.h> #include <asm/pgalloc.h> #include <asm/io.h> +#include <asm/tlbflush.h> -#include <linux/dprobes.h> +#include <asm/fi.h> #define PREFIX_NAME "FI_PF" #include <linux/fi/fi.h> @@ -237,19 +238,12 @@ static unsigned long crpt_mask[] = { 0x000000FF, 0x0000FFFF, 0x00FFFFFF, 0xFFFFFFFF}; -int pf_do_page_fault(struct pt_regs * regs) { - unsigned long address; +int pf_do_page_fault(struct pt_regs * regs, unsigned long address) { unsigned long cpu = smp_processor_id(); struct fi_corrupt crpt; int i; int ins_len, crpt_len; - /* - * gets the address, does not need to disallow irq, because our hook - * is before do_page_fault allows irq - */ - __asm__("movl %%cr2,%0":"=r" (address)); - pf_lock_region(); //lock it! if (pf_find_region(address)<0) { if (pf_is_removed_regions(address)) { @@ -335,7 +329,7 @@ out: /* set TF */ - regs->eflags |= EF_TF; + regs->eflags |= X86_EFLAGS_TF; /* clean page fault and tlb ONLY on this cpu */ pf_set_pte_bits(pf_reason[cpu].addr, _PAGE_PRESENT); @@ -350,7 +344,7 @@ return 0; }; -int pf_do_debug(struct pt_regs * regs, unsigned long condition) { +int pf_do_debug(unsigned long condition, struct pt_regs * regs) { unsigned long cpu = smp_processor_id(); struct fi_corrupt crpt; int ins_len, crpt_len; @@ -412,7 +406,7 @@ exit: /* clear TF */ - regs->eflags &= ~EF_TF; + regs->eflags &= ~X86_EFLAGS_TF; /* clean page fault and tlb ONLY on this cpu */ pf_clr_pte_bits(pf_reason[cpu].addr, _PAGE_PRESENT); @@ -431,40 +425,25 @@ * Initialize/Uninitialize modules */ static int __init fi_pf_init(void) { - int rv=0; - - if ((rv = initialize_pf_hooks())) { - goto err1; - } - if ((rv = register_pf_hooks())) { - goto err2; - } - if ((rv = arm_pf_hooks())) { - goto err3; - } + int rv=0; - register_pf_interface(); - - PINFO("FI Pagefault interceptor v%d.%d.%d loaded.\n", PF_MAJOR, PF_MINOR, PF_PATCH); - EXPORT_NO_SYMBOLS; - return 0; - -err3: - deregister_pf_hooks(); -err2: - terminate_pf_hooks(); -err1: - return rv; + register_pf_interface(); + fi_post_page_fault=pf_do_debug; + fi_page_fault=pf_do_page_fault; + + PINFO("FI Pagefault interceptor v%d.%d.%d loaded.\n", PF_MAJOR, PF_MINOR, PF_PATCH); + EXPORT_NO_SYMBOLS; + return 0; }; static void __exit fi_pf_cleanup(void) { - unregister_pf_interface(); - disarm_pf_hooks(); - deregister_pf_hooks(); - terminate_pf_hooks(); + fi_page_fault=NULL; + fi_post_page_fault=NULL; + unregister_pf_interface(); }; module_init(fi_pf_init); module_exit(fi_pf_cleanup); MODULE_AUTHOR("Louis Zhuang"); MODULE_DESCRIPTION("Pagefault interceptor component for FI"); +MODULE_LICENSE("GPL"); Index: src/fi_intcpt/fi_pf/pf_region.c =================================================================== RCS file: /cvsroot/fault-injection/fith_core/src/fi_intcpt/fi_pf/pf_region.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 pf_region.c --- src/fi_intcpt/fi_pf/pf_region.c 12 Nov 2002 05:56:32 -0000 1.1. 1.1 +++ src/fi_intcpt/fi_pf/pf_region.c 14 Nov 2002 04:21:15 -0000 @@ -84,16 +84,12 @@ } }; -static pte_t *get_pte(unsigned long addr) { - pgd_t *pgd; - pmd_t *pmd; - pte_t *pte; - - /* we need to change page table */ - pgd = pgd_offset_k( addr ); - pmd = pmd_offset(pgd, addr ); - pte = pte_offset(pmd, addr ); - return pte; +static pte_t *get_pte(unsigned long address) { + pgd_t *pgd = pgd_offset_k(address); + pmd_t *pmd = pmd_offset(pgd, address); + if (pmd_large(*pmd)) + return (pte_t *)pmd; + return pte_offset_kernel(pmd, address); }; /** |