Index: lib/libklib/kl_dump_4_1.c
===================================================================
RCS file: /cvsroot/lkcd/lkcd/7.X.X/lkcdutils/lib/libklib/kl_dump_4_1.c,v
retrieving revision 1.2
diff -p -u -r1.2 kl_dump_4_1.c
--- lib/libklib/kl_dump_4_1.c	23 Feb 2005 01:09:12 -0000	1.2
+++ lib/libklib/kl_dump_4_1.c	23 Mar 2006 15:03:44 -0000
@@ -188,6 +188,51 @@ int __convert_4_1_s390x_dump_header_to_n
         return(0);
 }
 
+/* __convert_4_1_s390x_dump_header_to_new()
+ */
+
+void __convert_tod_to_time(uint64_t todval, uint64_t *tv_sec, uint64_t *tv_usec)
+{
+	uint64_t sec = todval >> 12;
+
+	sec = sec / 1000000;
+	*tv_sec = sec;
+	todval = (sec * 1000000) << 12;
+	*tv_usec = ((todval * 1000) >> 12);
+}
+	
+int __convert_4_1_s390sa_dump_header_to_new(kl_dump_header_s390sa_t* old, kl_dump_header_t* new)
+{
+	uint32_t arch_id, arch_id_swap;               
+
+	arch_id = old->arch_id;
+	arch_id_swap = kl_get_swap_uint32(&arch_id);
+
+        new->magic_number  = old->magic_number;
+        new->version       = old->version;
+        new->header_size   = old->header_size;
+        new->dump_level    = old->dump_level;
+        new->page_size     = old->page_size;
+        new->memory_size   = old->memory_size;
+        new->memory_start  = old->memory_start;
+        new->memory_end    = old->memory_end;
+        new->num_dump_pages     = old->num_pages;
+	strcpy(new->panic_string,"S/390 standalone dump facility");
+	__convert_tod_to_time(old->tod, &new->time.tv_sec, &new->time.tv_usec);
+	sprintf(new->utsname_sysname,"CPU %lx", old->cpu_id);
+	if (arch_id == KL_DH_ARCH_ID_S390) {
+		strcpy(new->utsname_machine, KL_ARCH_STR_S390);
+	} else if (arch_id == KL_DH_ARCH_ID_S390X) {
+		strcpy(new->utsname_machine, KL_ARCH_STR_S390X);
+	} else if (arch_id_swap == KL_DH_ARCH_ID_S390) {
+		strcpy(new->utsname_machine, KL_ARCH_STR_S390);
+	} else if (arch_id_swap == KL_DH_ARCH_ID_S390X) {
+		strcpy(new->utsname_machine, KL_ARCH_STR_S390X);
+	}
+        new->current_task  = NULL;
+        return(0);
+}
+
 /* __convert_4_1_i386_dump_header_to_new()
  */
 
@@ -237,6 +282,32 @@ kl_dump_arch_4_1(void *dh)
 		   (((kl_dh_reg_i386_t*)dh)->dh_utsname_machine[3] == '6')){
                 dumparch = KL_ARCH_I386;
 	}
+	if (dumparch == KL_ARCH_UNKNOWN) {
+#if defined(DUMP_ARCH_S390) || defined(DUMP_ARCH_S390X)       
+		/* 
+		 * get the arch_id from the kl_dump_header_s390_t struct
+		 */
+		kl_dump_header_s390sa_t *dha;                  
+		uint32_t arch_id, arch_id_swap;               
+
+		dha = (kl_dump_header_s390sa_t *)dh;
+		arch_id = dha->arch_id;
+		arch_id_swap = kl_get_swap_uint32(&arch_id);
+		if((arch_id == KL_DH_ARCH_ID_S390) ||
+		   (arch_id_swap == KL_DH_ARCH_ID_S390) ||
+		   (arch_id == KL_DH_ARCH_ID_S390X) ||
+		   (arch_id_swap == KL_DH_ARCH_ID_S390X)) {
+			dumparch = KL_ARCH_S390SA;
+		} else {
+			/* wrong arch_id, set error code */
+			fprintf(KL_ERRORFP, "Warning: "
+				"Unknown arch_id for s390 dump: %x\n",
+				arch_id);
+		}
+#else
+		fprintf(KL_ERRORFP, "Warning: Unknown dump architecture\n");
+#endif                                                        
+	}
 	return (dumparch);
 }
 
@@ -263,9 +334,9 @@ get_dump_header_4_1(void *rdh)
 #endif
 #ifdef DUMP_ARCH_I386
 		case KL_ARCH_I386: {
-			kl_dh_reg_i386_t old_dh;
+			kl_dh_reg_i386_t *old_dh = rdh;
 
-			__convert_4_1_i386_dump_header_to_new(&old_dh,dh);
+			__convert_4_1_i386_dump_header_to_new(old_dh,dh);
 			fprintf(KL_ERRORFP,"\n\tWARNING: This is an old dump "
 				"format - asm header will not be converted\n");
 			break;
@@ -278,17 +349,25 @@ get_dump_header_4_1(void *rdh)
 #endif
 #ifdef DUMP_ARCH_S390
 		case KL_ARCH_S390: {
-			kl_dh_reg_s390_t old_dh;
+			kl_dh_reg_s390_t *old_dh = rdh;
 
-			__convert_4_1_s390_dump_header_to_new(&old_dh,dh);
+			__convert_4_1_s390_dump_header_to_new(old_dh,dh);
                 	break;
 		}
 #endif
 #ifdef DUMP_ARCH_S390X
 		case KL_ARCH_S390X: {
-			kl_dh_reg_s390x_t old_dh;
+			kl_dh_reg_s390x_t *old_dh = rdh;
+
+			__convert_4_1_s390x_dump_header_to_new(old_dh,dh);
+			break;
+		}
+#endif
+#if (defined DUMP_ARCH_S390) || (defined DUMP_ARCH_S390X)
+		case KL_ARCH_S390SA: {
+			kl_dump_header_s390sa_t *old_dh = rdh;
 
-			__convert_4_1_s390x_dump_header_to_new(&old_dh,dh);
+			__convert_4_1_s390sa_dump_header_to_new(old_dh,dh);
 			break;
 		}
 #endif
Index: lib/libklib/include/klib.h
===================================================================
RCS file: /cvsroot/lkcd/lkcd/7.X.X/lkcdutils/lib/libklib/include/klib.h,v
retrieving revision 1.3
diff -p -u -r1.3 klib.h
--- lib/libklib/include/klib.h	10 Sep 2005 07:59:57 -0000	1.3
+++ lib/libklib/include/klib.h	23 Mar 2006 15:03:44 -0000
@@ -109,6 +109,7 @@
 #define KL_ARCH_IA64_DIG        17
 #define KL_ARCH_IA64_HPSIM      18
 #define KL_ARCH_IA64_HPZX1      19
+#define KL_ARCH_S390SA          20
 
 #define KL_LIVE_SYSTEM        1000
 
