WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Manual merge.

# HG changeset patch
# User smh22@xxxxxxxxxxxxxxxxxxxx
# Node ID 0db6a59abb955be772d94ba32fe1a34a26db86da
# Parent  6a83d157a391d246dfb8bae6a936f6f8266a5818
# Parent  90f2b122fc43c72d1e4005e9278b26ba18bf1df0
Manual merge.

diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.4-xen-sparse/arch/xen/kernel/time.c
--- a/linux-2.4-xen-sparse/arch/xen/kernel/time.c       Mon Aug  1 10:45:07 2005
+++ b/linux-2.4-xen-sparse/arch/xen/kernel/time.c       Mon Aug  1 10:48:24 2005
@@ -225,21 +225,30 @@
  */
 static void __get_time_values_from_xen(void)
 {
-    do {
-        shadow_time_version = HYPERVISOR_shared_info->time_version2;
-        rmb();
-        shadow_tv.tv_sec    = HYPERVISOR_shared_info->wc_sec;
-        shadow_tv.tv_usec   = HYPERVISOR_shared_info->wc_usec;
-        shadow_tsc_stamp    = 
-            (u32)(HYPERVISOR_shared_info->tsc_timestamp >> rdtsc_bitshift);
-        shadow_system_time  = HYPERVISOR_shared_info->system_time;
-        rmb();
-    }
-    while ( shadow_time_version != HYPERVISOR_shared_info->time_version1 );
-}
-
-#define TIME_VALUES_UP_TO_DATE \
- ({ rmb(); (shadow_time_version == HYPERVISOR_shared_info->time_version2); })
+       shared_info_t           *s = HYPERVISOR_shared_info;
+       struct vcpu_time_info   *src;
+       struct shadow_time_info *dst;
+
+       src = &s->vcpu_time[smp_processor_id()];
+       dst = &per_cpu(shadow_time, smp_processor_id());
+
+       do {
+               dst->version = src->time_version2;
+               rmb();
+               dst->tsc_timestamp     = src->tsc_timestamp;
+               dst->system_timestamp  = src->system_time;
+               dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
+               dst->tsc_shift         = src->tsc_shift;
+               rmb();
+       }
+       while (dst->version != src->time_version1);
+
+       dst->tsc_to_usec_mul = dst->tsc_to_nsec_mul / 1000;
+
+       if ((shadow_tv.tv_sec != s->wc_sec) ||
+           (shadow_tv.tv_usec != s->wc_usec))
+               update_wallclock();
+}
 
 
 /*
@@ -263,6 +272,17 @@
     return (unsigned long)delta;
 }
 
+static inline int time_values_up_to_date()
+{
+       struct vcpu_time_info   *src;
+       struct shadow_time_info *dst;
+
+       src = &HYPERVISOR_shared_info->vcpu_time[smp_processor_id()];
+       dst = &per_cpu(shadow_time, smp_processor_id());
+
+       return (dst->version == src->time_version2);
+}
+
 
 /*
  * Returns the current time-of-day in UTC timeval format.
@@ -286,7 +306,7 @@
     __normalize_time(&_tv.tv_sec, &nsec);
     _tv.tv_usec += (long)nsec / 1000L;
 
-    if ( unlikely(!TIME_VALUES_UP_TO_DATE) )
+    if ( unlikely(!time_values_up_to_date()) )
     {
         /*
          * We may have blocked for a long time, rendering our calculations
diff -r 6a83d157a391 -r 0db6a59abb95 
linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Mon Aug 
 1 10:45:07 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32       Mon Aug 
 1 10:48:24 2005
@@ -18,8 +18,8 @@
 CONFIG_XEN_NETDEV_BACKEND=y
 CONFIG_XEN_BLKDEV_FRONTEND=y
 CONFIG_XEN_NETDEV_FRONTEND=y
-# CONFIG_XEN_NETDEV_GRANT_TX is not set
-# CONFIG_XEN_NETDEV_GRANT_RX is not set
+CONFIG_XEN_NETDEV_GRANT_TX=y
+ CONFIG_XEN_NETDEV_GRANT_RX=y
 # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set
 # CONFIG_XEN_BLKDEV_TAP is not set
 # CONFIG_XEN_SHADOW_MODE is not set
diff -r 6a83d157a391 -r 0db6a59abb95 
linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32
--- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32       Mon Aug 
 1 10:45:07 2005
+++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32       Mon Aug 
 1 10:48:24 2005
@@ -15,8 +15,8 @@
 CONFIG_XEN_BLKDEV_GRANT=y
 CONFIG_XEN_BLKDEV_FRONTEND=y
 CONFIG_XEN_NETDEV_FRONTEND=y
-# CONFIG_XEN_NETDEV_GRANT_TX is not set
-# CONFIG_XEN_NETDEV_GRANT_RX is not set
+CONFIG_XEN_NETDEV_GRANT_TX=y
+CONFIG_XEN_NETDEV_GRANT_RX=y
 # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set
 # CONFIG_XEN_BLKDEV_TAP is not set
 # CONFIG_XEN_SHADOW_MODE is not set
diff -r 6a83d157a391 -r 0db6a59abb95 
linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Aug  1 10:45:07 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Mon Aug  1 10:48:24 2005
@@ -90,9 +90,7 @@
 
 static int kstack_depth_to_print = 24;
 struct notifier_block *i386die_chain;
-DEFINE_SPINLOCK(die_notifier_lock);
-EXPORT_SYMBOL(die_notifier_lock);
-EXPORT_SYMBOL(i386die_chain);
+static DEFINE_SPINLOCK(die_notifier_lock);
 
 int register_die_notifier(struct notifier_block *nb)
 {
diff -r 6a83d157a391 -r 0db6a59abb95 tools/debugger/pdb/Makefile
--- a/tools/debugger/pdb/Makefile       Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/Makefile       Mon Aug  1 10:48:24 2005
@@ -33,7 +33,7 @@
 LIBS       += unix str
 
 # bc = byte-code, dc = debug byte-code
-all : dc
+all : patches dc
 
 SOURCES    += pdb_caml_xc.c 
 SOURCES    += pdb_caml_domain.c pdb_caml_process.c
@@ -50,3 +50,6 @@
 
 include $(OCAMLMAKEFILE)
 
+PATCHDIR    = ./linux-2.6-patches
+patches :
+       make -C $(PATCHDIR) patches
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-module/module.c
--- a/tools/debugger/pdb/linux-2.6-module/module.c      Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-module/module.c      Mon Aug  1 10:48:24 2005
@@ -278,14 +278,10 @@
     return err;
 }
 
-extern struct notifier_block *i386die_chain;
-extern spinlock_t die_notifier_lock;
-
 static void __exit
 pdb_terminate(void)
 {
     int err = 0;
-    unsigned long flags;
 
     printk("pdb cleanup\n");
 
@@ -305,9 +301,8 @@
 
     pdb_send_connection_status(PDB_CONNECTION_STATUS_DOWN, 0);
 
-       spin_lock_irqsave(&die_notifier_lock, flags);
-    err = notifier_chain_unregister(&i386die_chain, &pdb_exceptions_nb);
-       spin_unlock_irqrestore(&die_notifier_lock, flags);
+    /* handler for int1 & int3 */
+    err = unregister_die_notifier(&pdb_exceptions_nb);
 
        return;
 }
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/Makefile
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/Makefile     Mon Aug  1 10:48:24 2005
@@ -0,0 +1,10 @@
+XEN_ROOT   = ../../../..
+LINUX_DIR  = linux-2.6.12-xenU
+KDIR       = $(XEN_ROOT)/$(LINUX_DIR)
+PATCH_DIR  = $(CURDIR)
+
+patches : patches-done
+
+patches-done :
+       ( for i in *.patch ; do ( cd $(KDIR) ; patch -p1 < $(PATCH_DIR)/$$i || 
exit 1 ) ; done )
+       touch $@
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/i386_ksyms.patch
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/i386_ksyms.patch     Mon Aug  1 
10:48:24 2005
@@ -0,0 +1,11 @@
+diff -u linux-2.6.12/arch/xen/i386/kernel/i386_ksyms.c 
linux-2.6.12-pdb/arch/xen/i386/kernel/i386_ksyms.c
+--- linux-2.6.12/arch/xen/i386/kernel/i386_ksyms.c     2005-07-31 
22:36:50.000000000 +0100
++++ linux-2.6.12-pdb/arch/xen/i386/kernel/i386_ksyms.c 2005-08-01 
10:57:31.000000000 +0100
+@@ -172,6 +172,7 @@
+ EXPORT_SYMBOL_GPL(unset_nmi_callback);
+ 
+ EXPORT_SYMBOL(register_die_notifier);
++EXPORT_SYMBOL(unregister_die_notifier);
+ #ifdef CONFIG_HAVE_DEC_LOCK
+ EXPORT_SYMBOL(_atomic_dec_and_lock);
+ #endif
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/kdebug.patch
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/kdebug.patch Mon Aug  1 10:48:24 2005
@@ -0,0 +1,11 @@
+diff -u linux-2.6.12/include/asm-i386/kdebug.h 
linux-2.6.12-pdb/include/asm-i386/kdebug.h
+--- linux-2.6.12/include/asm-i386/kdebug.h     2005-06-17 20:48:29.000000000 
+0100
++++ linux-2.6.12-pdb/include/asm-i386/kdebug.h 2005-08-01 11:11:53.000000000 
+0100
+@@ -21,6 +21,7 @@
+    If you really want to do it first unregister - then synchronize_kernel - 
then free.
+   */
+ int register_die_notifier(struct notifier_block *nb);
++int unregister_die_notifier(struct notifier_block *nb);
+ extern struct notifier_block *i386die_chain;
+ 
+ 
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/makefile.patch
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/makefile.patch       Mon Aug  1 
10:48:24 2005
@@ -0,0 +1,12 @@
+diff -Naur linux-2.6.12/Makefile linux-2.6.12-pdb/Makefile
+--- linux-2.6.12/Makefile      2005-08-01 01:21:21.000000000 +0100
++++ linux-2.6.12-pdb/Makefile  2005-08-01 10:28:10.000000000 +0100
+@@ -508,7 +508,7 @@
+ ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+ CFLAGS                += -Os
+ else
+-CFLAGS                += -O2
++CFLAGS                += -O
+ endif
+ 
+ #Add align options if CONFIG_CC_* is not equal to 0
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/ptrace.patch
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/ptrace.patch Mon Aug  1 10:48:24 2005
@@ -0,0 +1,11 @@
+diff -u linux-2.6.12/kernel/ptrace.c linux-2.6.12-pdb/kernel/ptrace.c
+--- linux-2.6.12/kernel/ptrace.c       2005-06-17 20:48:29.000000000 +0100
++++ linux-2.6.12-pdb/kernel/ptrace.c   2005-07-22 13:23:16.000000000 +0100
+@@ -239,6 +239,7 @@
+ 
+        return buf - old_buf;
+ }
++EXPORT_SYMBOL(access_process_vm);
+ 
+ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user 
*dst, int len)
+ {
diff -r 6a83d157a391 -r 0db6a59abb95 
tools/debugger/pdb/linux-2.6-patches/traps.patch
--- /dev/null   Mon Aug  1 10:45:07 2005
+++ b/tools/debugger/pdb/linux-2.6-patches/traps.patch  Mon Aug  1 10:48:24 2005
@@ -0,0 +1,20 @@
+diff -u linux-2.6.12/arch/xen/i386/kernel/traps.c 
linux-2.6.12-pdb/arch/xen/i386/kernel/traps.c
+--- linux-2.6.12/arch/xen/i386/kernel/traps.c  2005-07-31 22:47:00.000000000 
+0100
++++ linux-2.6.12-pdb/arch/xen/i386/kernel/traps.c      2005-07-31 
22:47:32.000000000 +0100
+@@ -102,6 +102,16 @@
+       return err;
+ }
+ 
++int unregister_die_notifier(struct notifier_block *nb)
++{
++      int err = 0;
++      unsigned long flags;
++      spin_lock_irqsave(&die_notifier_lock, flags);
++      err = notifier_chain_unregister(&i386die_chain, nb);
++      spin_unlock_irqrestore(&die_notifier_lock, flags);
++      return err;
++}
++
+ static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
+ {
+       return  p > (void *)tinfo &&
diff -r 6a83d157a391 -r 0db6a59abb95 linux-2.6-xen-sparse/kernel/ptrace.c
--- a/linux-2.6-xen-sparse/kernel/ptrace.c      Mon Aug  1 10:45:07 2005
+++ /dev/null   Mon Aug  1 10:48:24 2005
@@ -1,391 +0,0 @@
-/*
- * linux/kernel/ptrace.c
- *
- * (C) Copyright 1999 Linus Torvalds
- *
- * Common interfaces for "ptrace()" which we do not want
- * to continually duplicate across every architecture.
- */
-
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/smp_lock.h>
-#include <linux/ptrace.h>
-#include <linux/security.h>
-#include <linux/signal.h>
-
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-
-/*
- * ptrace a task: make the debugger its new parent and
- * move it to the ptrace list.
- *
- * Must be called with the tasklist lock write-held.
- */
-void __ptrace_link(task_t *child, task_t *new_parent)
-{
-       if (!list_empty(&child->ptrace_list))
-               BUG();
-       if (child->parent == new_parent)
-               return;
-       list_add(&child->ptrace_list, &child->parent->ptrace_children);
-       REMOVE_LINKS(child);
-       child->parent = new_parent;
-       SET_LINKS(child);
-}
- 
-/*
- * Turn a tracing stop into a normal stop now, since with no tracer there
- * would be no way to wake it up with SIGCONT or SIGKILL.  If there was a
- * signal sent that would resume the child, but didn't because it was in
- * TASK_TRACED, resume it now.
- * Requires that irqs be disabled.
- */
-void ptrace_untrace(task_t *child)
-{
-       spin_lock(&child->sighand->siglock);
-       if (child->state == TASK_TRACED) {
-               if (child->signal->flags & SIGNAL_STOP_STOPPED) {
-                       child->state = TASK_STOPPED;
-               } else {
-                       signal_wake_up(child, 1);
-               }
-       }
-       spin_unlock(&child->sighand->siglock);
-}
-
-/*
- * unptrace a task: move it back to its original parent and
- * remove it from the ptrace list.
- *
- * Must be called with the tasklist lock write-held.
- */
-void __ptrace_unlink(task_t *child)
-{
-       if (!child->ptrace)
-               BUG();
-       child->ptrace = 0;
-       if (!list_empty(&child->ptrace_list)) {
-               list_del_init(&child->ptrace_list);
-               REMOVE_LINKS(child);
-               child->parent = child->real_parent;
-               SET_LINKS(child);
-       }
-
-       if (child->state == TASK_TRACED)
-               ptrace_untrace(child);
-}
-
-/*
- * Check that we have indeed attached to the thing..
- */
-int ptrace_check_attach(struct task_struct *child, int kill)
-{
-       int ret = -ESRCH;
-
-       /*
-        * We take the read lock around doing both checks to close a
-        * possible race where someone else was tracing our child and
-        * detached between these two checks.  After this locked check,
-        * we are sure that this is our traced child and that can only
-        * be changed by us so it's not changing right after this.
-        */
-       read_lock(&tasklist_lock);
-       if ((child->ptrace & PT_PTRACED) && child->parent == current &&
-           (!(child->ptrace & PT_ATTACHED) || child->real_parent != current)
-           && child->signal != NULL) {
-               ret = 0;
-               spin_lock_irq(&child->sighand->siglock);
-               if (child->state == TASK_STOPPED) {
-                       child->state = TASK_TRACED;
-               } else if (child->state != TASK_TRACED && !kill) {
-                       ret = -ESRCH;
-               }
-               spin_unlock_irq(&child->sighand->siglock);
-       }
-       read_unlock(&tasklist_lock);
-
-       if (!ret && !kill) {
-               wait_task_inactive(child);
-       }
-
-       /* All systems go.. */
-       return ret;
-}
-
-int ptrace_attach(struct task_struct *task)
-{
-       int retval;
-       task_lock(task);
-       retval = -EPERM;
-       if (task->pid <= 1)
-               goto bad;
-       if (task == current)
-               goto bad;
-       if (!task->mm)
-               goto bad;
-       if(((current->uid != task->euid) ||
-           (current->uid != task->suid) ||
-           (current->uid != task->uid) ||
-           (current->gid != task->egid) ||
-           (current->gid != task->sgid) ||
-           (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
-               goto bad;
-       smp_rmb();
-       if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
-               goto bad;
-       /* the same process cannot be attached many times */
-       if (task->ptrace & PT_PTRACED)
-               goto bad;
-       retval = security_ptrace(current, task);
-       if (retval)
-               goto bad;
-
-       /* Go */
-       task->ptrace |= PT_PTRACED | ((task->real_parent != current)
-                                     ? PT_ATTACHED : 0);
-       if (capable(CAP_SYS_PTRACE))
-               task->ptrace |= PT_PTRACE_CAP;
-       task_unlock(task);
-
-       write_lock_irq(&tasklist_lock);
-       __ptrace_link(task, current);
-       write_unlock_irq(&tasklist_lock);
-
-       force_sig_specific(SIGSTOP, task);
-       return 0;
-
-bad:
-       task_unlock(task);
-       return retval;
-}
-
-int ptrace_detach(struct task_struct *child, unsigned int data)
-{
-       if (!valid_signal(data))
-               return  -EIO;
-
-       /* Architecture-specific hardware disable .. */
-       ptrace_disable(child);
-
-       /* .. re-parent .. */
-       child->exit_code = data;
-
-       write_lock_irq(&tasklist_lock);
-       __ptrace_unlink(child);
-       /* .. and wake it up. */
-       if (child->exit_state != EXIT_ZOMBIE)
-               wake_up_process(child);
-       write_unlock_irq(&tasklist_lock);
-
-       return 0;
-}
-
-/*
- * Access another process' address space.
- * Source/target buffer must be kernel space, 
- * Do not walk the page table directly, use get_user_pages
- */
-
-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;
-}
-EXPORT_SYMBOL(access_process_vm);
-
-int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user 
*dst, int len)
-{
-       int copied = 0;
-
-       while (len > 0) {
-               char buf[128];
-               int this_len, retval;
-
-               this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
-               retval = access_process_vm(tsk, src, buf, this_len, 0);
-               if (!retval) {
-                       if (copied)
-                               break;
-                       return -EIO;
-               }
-               if (copy_to_user(dst, buf, retval))
-                       return -EFAULT;
-               copied += retval;
-               src += retval;
-               dst += retval;
-               len -= retval;                  
-       }
-       return copied;
-}
-
-int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long 
dst, int len)
-{
-       int copied = 0;
-
-       while (len > 0) {
-               char buf[128];
-               int this_len, retval;
-
-               this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
-               if (copy_from_user(buf, src, this_len))
-                       return -EFAULT;
-               retval = access_process_vm(tsk, dst, buf, this_len, 1);
-               if (!retval) {
-                       if (copied)
-                               break;
-                       return -EIO;
-               }
-               copied += retval;
-               src += retval;
-               dst += retval;
-               len -= retval;                  
-       }
-       return copied;
-}
-
-static int ptrace_setoptions(struct task_struct *child, long data)
-{
-       child->ptrace &= ~PT_TRACE_MASK;
-
-       if (data & PTRACE_O_TRACESYSGOOD)
-               child->ptrace |= PT_TRACESYSGOOD;
-
-       if (data & PTRACE_O_TRACEFORK)
-               child->ptrace |= PT_TRACE_FORK;
-
-       if (data & PTRACE_O_TRACEVFORK)
-               child->ptrace |= PT_TRACE_VFORK;
-
-       if (data & PTRACE_O_TRACECLONE)
-               child->ptrace |= PT_TRACE_CLONE;
-
-       if (data & PTRACE_O_TRACEEXEC)
-               child->ptrace |= PT_TRACE_EXEC;
-
-       if (data & PTRACE_O_TRACEVFORKDONE)
-               child->ptrace |= PT_TRACE_VFORK_DONE;
-
-       if (data & PTRACE_O_TRACEEXIT)
-               child->ptrace |= PT_TRACE_EXIT;
-
-       return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
-}
-
-static int ptrace_getsiginfo(struct task_struct *child, siginfo_t __user * 
data)
-{
-       siginfo_t lastinfo;
-       int error = -ESRCH;
-
-       read_lock(&tasklist_lock);
-       if (likely(child->sighand != NULL)) {
-               error = -EINVAL;
-               spin_lock_irq(&child->sighand->siglock);
-               if (likely(child->last_siginfo != NULL)) {
-                       lastinfo = *child->last_siginfo;
-                       error = 0;
-               }
-               spin_unlock_irq(&child->sighand->siglock);
-       }
-       read_unlock(&tasklist_lock);
-       if (!error)
-               return copy_siginfo_to_user(data, &lastinfo);
-       return error;
-}
-
-static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * 
data)
-{
-       siginfo_t newinfo;
-       int error = -ESRCH;
-
-       if (copy_from_user(&newinfo, data, sizeof (siginfo_t)))
-               return -EFAULT;
-
-       read_lock(&tasklist_lock);
-       if (likely(child->sighand != NULL)) {
-               error = -EINVAL;
-               spin_lock_irq(&child->sighand->siglock);
-               if (likely(child->last_siginfo != NULL)) {
-                       *child->last_siginfo = newinfo;
-                       error = 0;
-               }
-               spin_unlock_irq(&child->sighand->siglock);
-       }
-       read_unlock(&tasklist_lock);
-       return error;
-}
-
-int ptrace_request(struct task_struct *child, long request,
-                  long addr, long data)
-{
-       int ret = -EIO;
-
-       switch (request) {
-#ifdef PTRACE_OLDSETOPTIONS
-       case PTRACE_OLDSETOPTIONS:
-#endif
-       case PTRACE_SETOPTIONS:
-               ret = ptrace_setoptions(child, data);
-               break;
-       case PTRACE_GETEVENTMSG:
-               ret = put_user(child->ptrace_message, (unsigned long __user *) 
data);
-               break;
-       case PTRACE_GETSIGINFO:
-               ret = ptrace_getsiginfo(child, (siginfo_t __user *) data);
-               break;
-       case PTRACE_SETSIGINFO:
-               ret = ptrace_setsiginfo(child, (siginfo_t __user *) data);
-               break;
-       default:
-               break;
-       }
-
-       return ret;
-}

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>