]> sourceware.org Git - systemtap.git/commitdiff
* runtime/uprobes/uprobes.c: Added static copy of
authorkenistoj <kenistoj>
Sat, 19 Jan 2008 00:24:07 +0000 (00:24 +0000)
committerkenistoj <kenistoj>
Sat, 19 Jan 2008 00:24:07 +0000 (00:24 +0000)
access_process_vm(), for kernels that don't export it.

ChangeLog
runtime/uprobes/uprobes.c

index 009436b7dcb9faf360983493b49394b0c98d36aa..59f55207607f82573ab094005b99fb920534b557 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-18  Jim Keniston  <jkenisto@us.ibm.com>
+
+       * runtime/uprobes/uprobes.c: Added static copy of
+       access_process_vm(), for kernels that don't export it.
+
 2008-01-18  Frank Ch. Eigler  <fche@elastic.org>
 
        * configure.ac, systemtap.spec.in: Update version to 0.6.1
index 5093070954ab04358507d3cffd6aaf2061338f57..005ca919b4d605cb4e064da13832eda8416566ff 100644 (file)
 
 #define MAX_SSOL_SLOTS         1024
 
+#ifdef NO_ACCESS_PROCESS_VM_EXPORT
+static int __access_process_vm(struct task_struct *tsk, unsigned long addr,
+       void *buf, int len, int write);
+#define access_process_vm __access_process_vm
+#else
 extern int access_process_vm(struct task_struct *tsk, unsigned long addr,
        void *buf, int len, int write);
+#endif
 static int utask_fake_quiesce(struct uprobe_task *utask);
 static void uprobe_release_ssol_vma(struct uprobe_process *uproc);
 
@@ -2267,5 +2273,61 @@ static void zap_uretprobe_instances(struct uprobe *u,
 }
 #endif /* CONFIG_URETPROBES */
 
+#ifdef NO_ACCESS_PROCESS_VM_EXPORT
+/*
+ * Some kernel versions export everything that uprobes.ko needs except
+ * access_process_vm, so we copied and pasted it here.  Fortunately,
+ * everything it calls is exported.
+ */
+#include <linux/pagemap.h>
+#include <asm/cacheflush.h>
+static int __access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
+{
+       struct mm_struct *mm;
+       struct vm_area_struct *vma;
+       struct page *page;
+       void *old_buf = buf;
+
+       mm = get_task_mm(tsk);
+       if (!mm)
+               return 0;
+
+       down_read(&mm->mmap_sem);
+       /* ignore errors, just check how much was sucessfully transfered */
+       while (len) {
+               int bytes, ret, offset;
+               void *maddr;
+
+               ret = get_user_pages(tsk, mm, addr, 1,
+                               write, 1, &page, &vma);
+               if (ret <= 0)
+                       break;
+
+               bytes = len;
+               offset = addr & (PAGE_SIZE-1);
+               if (bytes > PAGE_SIZE-offset)
+                       bytes = PAGE_SIZE-offset;
+
+               maddr = kmap(page);
+               if (write) {
+                       copy_to_user_page(vma, page, addr,
+                                         maddr + offset, buf, bytes);
+                       set_page_dirty_lock(page);
+               } else {
+                       copy_from_user_page(vma, page, addr,
+                                           buf, maddr + offset, bytes);
+               }
+               kunmap(page);
+               page_cache_release(page);
+               len -= bytes;
+               buf += bytes;
+               addr += bytes;
+       }
+       up_read(&mm->mmap_sem);
+       mmput(mm);
+
+       return buf - old_buf;
+}
+#endif
 #include "uprobes_arch.c"
 MODULE_LICENSE("GPL");
This page took 0.036886 seconds and 5 git commands to generate.