{ bfd_set_error (bfd_error_no_memory); return NULL; }
return NULL;
cisco_core_file_p (abfd)     bfd *abfd;{  char buf[4];  unsigned int crashinfo_offset;  struct crashinfo_external crashinfo;  int nread;  unsigned int rambase;  sec_ptr asect;  struct stat statbuf;  if (bfd_seek (abfd, CRASH_INFO, SEEK_SET) != 0)    return NULL;  nread = bfd_read (buf, 1, 4, abfd);  if (nread != 4)    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_wrong_format);      return NULL;    }  crashinfo_offset = bfd_get_32 (abfd, buf);  if (bfd_seek (abfd, crashinfo_offset, SEEK_SET) != 0)    return NULL;  nread = bfd_read (&crashinfo, 1, sizeof (crashinfo), abfd);  if (nread != sizeof (crashinfo))    {      if (bfd_get_error () != bfd_error_system_call)	bfd_set_error (bfd_error_wrong_format);      return NULL;    }  if (bfd_stat (abfd, &statbuf) < 0)    {      bfd_set_error (bfd_error_system_call);      return NULL;    }  if (bfd_get_32 (abfd, crashinfo.magic) != CRASH_MAGIC)    {      bfd_set_error (bfd_error_wrong_format);      return NULL;    }  switch (bfd_get_32 (abfd, crashinfo.version))    {    case 0:      bfd_set_error (bfd_error_wrong_format);      return NULL;    case 1:      rambase = 0;      break;    default:    case 2:      rambase = bfd_get_32 (abfd, crashinfo.rambase);      break;    }  /* OK, we believe you.  You're a core file.  */  abfd->tdata.cisco_core_data =    ((struct cisco_core_struct *)     bfd_zmalloc (sizeof (struct cisco_core_struct)));  if (abfd->tdata.cisco_core_data == NULL)    {      bfd_set_error (bfd_error_no_memory);      return NULL;    }  switch ((crashreason) bfd_get_32 (abfd, crashinfo.reason))    {    case CRASH_REASON_NOTCRASHED:      /* Crash file probably came from write core.  */      abfd->tdata.cisco_core_data->sig = 0;      break;    case CRASH_REASON_CORRUPT:      /* The crash context area was corrupt -- proceed with caution.	 We have no way of passing this information back to the caller.  */      abfd->tdata.cisco_core_data->sig = 0;      break;    case CRASH_REASON_EXCEPTION:      /* Crash occured due to CPU exception.  */      /* This is 68k-specific; for MIPS we'll need to interpret	 cpu_vector differently based on the target configuration	 (since CISCO core files don't seem to have the processor	 encoded in them).  */      switch (bfd_get_32 (abfd, crashinfo.cpu_vector))	{	   /* bus error           */	case 2 : abfd->tdata.cisco_core_data->sig = SIGBUS; break;	   /* address error       */	case 3 : abfd->tdata.cisco_core_data->sig = SIGBUS; break;	   /* illegal instruction */	case 4 : abfd->tdata.cisco_core_data->sig = SIGILL;  break;	   /* zero divide         */	case 5 : abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	   /* chk instruction     */	case 6 : abfd->tdata.cisco_core_data->sig = SIGFPE; break;	   /* trapv instruction   */	case 7 : abfd->tdata.cisco_core_data->sig = SIGFPE; break;	   /* privilege violation */	case 8 : abfd->tdata.cisco_core_data->sig = SIGSEGV; break;	   /* trace trap          */	case 9 : abfd->tdata.cisco_core_data->sig = SIGTRAP;  break;	   /* line 1010 emulator  */	case 10: abfd->tdata.cisco_core_data->sig = SIGILL;  break;	   /* line 1111 emulator  */	case 11: abfd->tdata.cisco_core_data->sig = SIGILL;  break;	  /* Coprocessor protocol violation.  Using a standard MMU or FPU	     this cannot be triggered by software.  Call it a SIGBUS.  */	case 13: abfd->tdata.cisco_core_data->sig = SIGBUS;  break;	  /* interrupt           */	case 31: abfd->tdata.cisco_core_data->sig = SIGINT;  break;	  /* breakpoint          */	case 33: abfd->tdata.cisco_core_data->sig = SIGTRAP;  break;	  /* floating point err  */	case 48: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	  /* floating point err  */	case 49: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	  /* zero divide         */	case 50: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	  /* underflow           */	case 51: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	  /* operand error       */	case 52: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	   /* overflow            */	case 53: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	  /* NAN                 */	case 54: abfd->tdata.cisco_core_data->sig = SIGFPE;  break;	default:	  /* "software generated"*/	  abfd->tdata.cisco_core_data->sig = SIGEMT;	}      break;    default:      /* Unknown crash reason.  */      abfd->tdata.cisco_core_data->sig = 0;      break;    }  abfd->sections = NULL;  abfd->section_count = 0;  asect = (asection *) bfd_zmalloc (sizeof (asection));  if (asect == NULL)    {      bfd_set_error (bfd_error_no_memory);      goto error_return;    }  asect->name = ".reg";  asect->flags = SEC_HAS_CONTENTS;  /* This can be bigger than the real size.  Set it to the size of the whole     core file.  */  asect->_raw_size = statbuf.st_size;  asect->vma = 0;  asect->filepos = bfd_get_32 (abfd, crashinfo.registers) - rambase;  asect->next = abfd->sections;  abfd->sections = asect;  ++abfd->section_count;  /* There is only one section containing data from the target system's RAM.     We call it .data.  */  asect = (asection *) bfd_zmalloc (sizeof (asection));  if (asect == NULL)    {      bfd_set_error (bfd_error_no_memory);      goto error_return;    }  asect->name = ".data";  asect->flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;  /* The size of memory is the size of the core file itself.  */  asect->_raw_size = statbuf.st_size;  asect->vma = rambase;  asect->filepos = 0;  asect->next = abfd->sections;  abfd->sections = asect;  ++abfd->section_count;  return abfd->xvec; error_return:  {    sec_ptr nextsect;    for (asect = abfd->sections; asect != NULL;)      {	nextsect = asect->next;	free (asect);	asect = nextsect;      }    free (abfd->tdata.cisco_core_data);    return NULL;  }}