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-ia64-devel

[Xen-ia64-devel] [patch 12/12] Kexec: Implement elf_core_save_regs()

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [patch 12/12] Kexec: Implement elf_core_save_regs()
From: Simon Horman <horms@xxxxxxxxxxxx>
Date: Thu, 27 Sep 2007 17:17:26 +0900
Cc: Alex Williamson <alex.williamson@xxxxxx>
Delivery-date: Thu, 27 Sep 2007 01:30:55 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20070927073101.163912627@xxxxxxxxxxxx>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: quilt/0.46-1
Implement elf_core_save_regs() by porting (un #ifdefing)
ia64_elf_core_copy_regs() from Linux.

This ommits the calls to ia64_get_user_rbs_end() and ia64_sync_user_rbs()
in do_copy_task_regs(). Supplying them would seem to involve a reasonably
involved ammount of porting. I'm really not sure that its neccessary.

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
Index: xen-unstable.hg/xen/arch/ia64/linux-xen/process-linux-xen.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/process-linux-xen.c    
2007-08-20 11:38:06.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/process-linux-xen.c 2007-08-20 
12:32:09.000000000 +0900
@@ -13,6 +13,7 @@
 #include <xen/symbols.h>
 #include <xen/smp.h>
 #include <xen/sched.h>
+#include <asm/elf.h>
 #include <asm/uaccess.h>
 #include <asm/processor.h>
 #include <asm/ptrace.h>
@@ -542,6 +543,8 @@ copy_thread (int nr, unsigned long clone
        return retval;
 }
 
+#endif /* !XEN */
+
 static void
 do_copy_task_regs (struct task_struct *task, struct unw_frame_info *info, void 
*arg)
 {
@@ -559,10 +562,14 @@ do_copy_task_regs (struct task_struct *t
        unw_get_sp(info, &sp);
        pt = (struct pt_regs *) (sp + 16);
 
+#ifndef XEN
+       /* FIXME: Is this needed by XEN when it makes its crash notes
+        * during kdump? */
        urbs_end = ia64_get_user_rbs_end(task, pt, &cfm);
 
        if (ia64_sync_user_rbs(task, info->sw, pt->ar_bspstore, urbs_end) < 0)
                return;
+#endif /* !XEN */
 
        ia64_peek(task, info->sw, urbs_end, (long) ia64_rse_rnat_addr((long *) 
urbs_end),
                  &ar_rnat);
@@ -614,6 +621,8 @@ do_copy_task_regs (struct task_struct *t
        unw_get_ar(info, UNW_AR_SSD, &dst[56]);
 }
 
+#ifndef XEN
+
 void
 do_dump_task_fpu (struct task_struct *task, struct unw_frame_info *info, void 
*arg)
 {
@@ -635,12 +644,16 @@ do_dump_task_fpu (struct task_struct *ta
                memcpy(dst + 32, task->thread.fph, 96*16);
 }
 
+#endif /* !XEN */
+
 void
 do_copy_regs (struct unw_frame_info *info, void *arg)
 {
        do_copy_task_regs(current, info, arg);
 }
 
+#ifndef XEN
+
 void
 do_dump_fpu (struct unw_frame_info *info, void *arg)
 {
@@ -662,12 +675,16 @@ dump_task_regs(struct task_struct *task,
        return 1;
 }
 
+#endif /* !XEN */
+
 void
 ia64_elf_core_copy_regs (struct pt_regs *pt, elf_gregset_t dst)
 {
        unw_init_running(do_copy_regs, dst);
 }
 
+#ifndef XEN
+
 int
 dump_task_fpu (struct task_struct *task, elf_fpregset_t *dst)
 {
Index: xen-unstable.hg/xen/include/asm-ia64/elf.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/elf.h     2007-08-20 
11:38:06.000000000 +0900
+++ xen-unstable.hg/xen/include/asm-ia64/elf.h  2007-08-20 12:00:01.000000000 
+0900
@@ -1,8 +1,6 @@
 #ifndef __IA64_ELF_H__
 #define __IA64_ELF_H__
 
-#include <xen/lib.h>       /* for printk() used in stub */
-
 typedef struct {
     unsigned long r1;
     unsigned long r2;
@@ -20,14 +18,29 @@ typedef struct {
     unsigned long ar_ssd;
 } ELF_Gregset;
 
-typedef struct {
-    unsigned long dummy;
-} crash_xen_core_t;
+/*
+ * elf_gregset_t contains the application-level state in the following order:
+ *     r0-r31
+ *     NaT bits (for r0-r31; bit N == 1 iff rN is a NaT)
+ *     predicate registers (p0-p63)
+ *     b0-b7
+ *     ip cfm psr
+ *     ar.rsc ar.bsp ar.bspstore ar.rnat
+ *     ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec ar.csd ar.ssd
+ */
+#define ELF_NGREG      128 /* we really need just 72,
+                            * but let's leave some headroom */
+
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+typedef elf_gregset_t crash_xen_core_t;
+
+extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst);
 
 static inline void elf_core_save_regs(ELF_Gregset *core_regs, 
                                       crash_xen_core_t *xen_core_regs)
 {
-    printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__);
+    ia64_elf_core_copy_regs(NULL, *xen_core_regs);
 }
 
 #endif /* __IA64_ELF_H__ */

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


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

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