File crash-sles9-time.patch of Package crash

From: Alan Tyson <atyson@hp.com>
Subject: [PATCH] Fix "uptime" and "ps -t" for SLES9
References: 352836

This patch adds a quirk for SLES9 jiffies initialisation and corrects the time
data in "uptime" and "ps -t" command.


Acked-by: Bernhard Walle <bwalle@suse.de>

---
 defs.h   |    8 ++++++++
 kernel.c |    9 ++++++++-
 task.c   |   11 +++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)

--- a/defs.h
+++ b/defs.h
@@ -539,6 +539,7 @@ struct kernel_table {
 	ulong p2m_mfn_cache_hits;
 	ulong p2m_page_cache_hits;
 	ulong relocate;
+	int is_suse_kernel;
 };
 
 /*
@@ -4434,6 +4435,13 @@ extern struct lkcd_environment *lkcd;
 
 #endif  /* LKCD_COMMON */
 
+
+/*
+ * SUSE specific
+ */
+#define is_SLES9() \
+	((THIS_KERNEL_VERSION == LINUX(2,6,5)) && kt->is_suse_kernel)
+
 /*
  *  gdb_interface.c
  */
--- a/kernel.c
+++ b/kernel.c
@@ -167,6 +167,12 @@ kernel_init()
 
 	verify_version();
 
+	/*
+	 * check if we have a suse kernel (this is the module supported
+	 * patch of agruen@suse.de
+	 */
+	kt->is_suse_kernel = symbol_exists("unsupported");
+
 	if (symbol_exists("__per_cpu_offset")) {
 		if (LKCD_KERNTYPES())
 			i = get_cpus_possible();
@@ -3596,7 +3602,7 @@ get_uptime(char *buf, ulonglong *j64p)
 
 	if (symbol_exists("jiffies_64")) {
 		get_symbol_data("jiffies_64", sizeof(ulonglong), &jiffies_64);
-		if (THIS_KERNEL_VERSION >= LINUX(2,6,0)) {
+		if (THIS_KERNEL_VERSION >= LINUX(2,6,0) && !is_SLES9()) {
 			wrapped = (jiffies_64 & 0xffffffff00000000ULL);
 			if (wrapped) {
 				wrapped -= 0x100000000ULL;
@@ -4028,6 +4034,7 @@ dump_kernel_table(int verbose)
 		fprintf(fp, "(%ld%%)\n", kt->p2m_page_cache_hits * 100 / kt->p2m_pages_searched);
 	else
 		fprintf(fp, "\n");
+	fprintf(fp, "         is_suse_kernel: %ld\n", kt->is_suse_kernel);
 }
 
 /*
--- a/task.c
+++ b/task.c
@@ -3350,6 +3350,12 @@ start_time_timespec(void)
 	default:
 		break;
 	}
+	/* SLES9 stores start_time in nanoseconds, so set TIMESPEC in order */
+	/* to do the right calculations in convert_start_time               */
+	if (is_SLES9()) {
+		tt->flags |= TIMESPEC;
+		return TRUE;
+	}
 
 	tt->flags |= NO_TIMESPEC;
 
@@ -3382,6 +3388,11 @@ convert_start_time(ulonglong start_time,
 	ulong tmp1, tmp2;
 	ulonglong wrapped;
 
+	/* SLES9's start_time is neither jiffies nor a timespec.  It's ns */
+	if (is_SLES9()) {
+		start_time = start_time / 1000000000;
+	}
+
         switch(tt->flags & (TIMESPEC | NO_TIMESPEC))
         {
         case TIMESPEC:
openSUSE Build Service is sponsored by