----- Original Message -----
 Hello Dave,
 
 On Thu, 19 Apr 2012 14:44:43 -0400 (EDT)
 Dave Anderson <anderson(a)redhat.com> wrote:
 
 [snip]
 
 > I would have no problem with adding a new LIVE_DUMP flag to
 > pc->flags2, and just checking it in display_sys_stats() and
 > non_matching_kernel() as you've done below.  In dealing with
 > dumpfiles generated from snap.so, the "bt" command is pretty
 > much the only command that probably should be restricted.
 > However, I don't restrict "bt" with snap.so vmcores because
 > currently there's no magic/signature/whatever that indicates
 > what kind of dump it is.  But if you implement a new LIVE_DUMP
 > flag, I might do it there as well so we've got some consistency.
 > 
 > What do you think about that?
 
 Sounds good. So what about introducing a new macro LIVE() that
 indicates that the dump or live system is inconsistent. 
Good idea -- queued for crash-6.0.6.
I'll also put some kind of indicator in the snap.so ELF header.
Thanks,
  Dave
 
 Something like the following:
 ---
  defs.h   |    2 ++
  kernel.c |    9 +++++++--
  main.c   |    2 ++
  s390x.c  |   12 ++++++++++++
  4 files changed, 23 insertions(+), 2 deletions(-)
 
 --- a/defs.h
 +++ b/defs.h
 @@ -203,6 +203,7 @@ struct number_option {
  
  #define ACTIVE()            (pc->flags & LIVE_SYSTEM)
  #define DUMPFILE()          (!(pc->flags & LIVE_SYSTEM))
 +#define LIVE()              (pc->flags2 & LIVE_DUMP || pc->flags &
 LIVE_SYSTEM)
  #define MEMORY_SOURCES
 
(NETDUMP|KDUMP|MCLXCD|LKCD|DEVMEM|S390D|MEMMOD|DISKDUMP|XENDUMP|CRASHBUILTIN|KVMDUMP|PROC_KCORE|SADUMP)
  #define DUMPFILE_TYPES
       (DISKDUMP|NETDUMP|KDUMP|MCLXCD|LKCD|S390D|XENDUMP|KVMDUMP|SADUMP)
  #define REMOTE()            (pc->flags2 & REMOTE_DAEMON)
 @@ -446,6 +447,7 @@ struct program_context {
  #define REMOTE_DAEMON  (0x08ULL)
  #define ERASEINFO_DATA (0x10ULL)
  #define GDB_CMD_MODE   (0x20ULL)
 +#define LIVE_DUMP      (0x40ULL)
  #define FLAT_FORMAT() (pc->flags2 & FLAT)
  #define ELF_NOTES_VALID() (pc->flags2 & ELF_NOTES)
  	char *cleanup;
 --- a/kernel.c
 +++ b/kernel.c
 @@ -992,6 +992,8 @@ non_matching_kernel(void)
                          else
                                  fprintf(fp, "%s", pc->dumpfile);
                  }
 +		if (LIVE())
 +			fprintf(fp, " [LIVE DUMP]");
          }
  
  	fprintf(fp, "\n\n");
 @@ -2072,9 +2074,9 @@ else
  	}
  
  	if (active) {
 -		if (ACTIVE())
 +		if (LIVE())
  			error(FATAL,
 -			    "-a option not supported on a live system\n");
 +			    "-a option not supported on a live system or live dump\n");
  
  		if (bt->flags & BT_THREAD_GROUP)
  			error(FATAL,
 @@ -4098,6 +4100,9 @@ display_sys_stats(void)
                  		fprintf(fp, "%s", pc->dumpfile);
  		}
  
 +		if (LIVE())
 +			fprintf(fp, "  [LIVE DUMP]");
 +
  		if (NETDUMP_DUMPFILE() && is_partial_netdump())
  			fprintf(fp, "  [PARTIAL DUMP]");
  
 --- a/main.c
 +++ b/main.c
 @@ -1110,6 +1110,8 @@ dump_program_context(void)
  	if (pc->flags & LIVE_SYSTEM)
  		sprintf(&buf[strlen(buf)], "%sLIVE_SYSTEM",
  			others++ ? "|" : "");
 +	if (pc->flags2 & LIVE_DUMP)
 +		sprintf(&buf[strlen(buf)], "%sLIVE_DUMP", others++ ? "|" :
"");
  	if (pc->flags & TTY)
  		sprintf(&buf[strlen(buf)], "%sTTY", others++ ? "|" :
"");
          if (pc->flags & IN_FOREACH)
 --- a/s390x.c
 +++ b/s390x.c
 @@ -328,6 +328,17 @@ static void s390x_process_elf_notes(void
  	}
  }
  
 +static void s390x_check_live(void)
 +{
 +	unsigned long long live_magic;
 +
 +	readmem(0, KVADDR, &live_magic, sizeof(live_magic), "live_magic",
 +		RETURN_ON_ERROR | QUIET);
 +
 +	if (live_magic == 0x4c49564544554d50ULL)
 +		pc->flags2 |= LIVE_DUMP;
 +}
 +
  /*
   *  Do all necessary machine-specific setup here.  This is called
   several
   *  times during initialization.
 @@ -402,6 +413,7 @@ s390x_init(int when)
  		break;
  
  	case POST_INIT:
 +		s390x_check_live();
  		break;
  	}
  }