[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);
};
/**
|