mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-24 02:34:59 +00:00
Implement corefiles for FreeBSD/alpha. This requires a separate change to
the kernel which is awaiting review.
This commit is contained in:
parent
5abc195371
commit
0ba2f2a9ba
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=46654
|
@ -30,6 +30,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include "value.h"
|
||||
#include "inferior.h"
|
||||
|
||||
#if defined(HAVE_GREGSET_T)
|
||||
#include <sys/procfs.h>
|
||||
#endif
|
||||
|
||||
int kernel_debugging = 0;
|
||||
|
||||
/* Size of elements in jmpbuf */
|
||||
|
@ -114,91 +118,29 @@ store_inferior_registers (regno)
|
|||
ptrace (PT_SETFPREGS, inferior_pid, (PTRACE_ARG3_TYPE) &fpregs, 0);
|
||||
}
|
||||
|
||||
/* Extract the register values out of the core file and store
|
||||
them where `read_register' will find them.
|
||||
Extract the floating point state out of the core file and store
|
||||
it where `float_info' will find it.
|
||||
|
||||
CORE_REG_SECT points to the register values themselves, read into memory.
|
||||
CORE_REG_SIZE is the size of that area.
|
||||
WHICH says which set of registers we are handling (0 = int, 2 = float
|
||||
on machines where they are discontiguous).
|
||||
REG_ADDR is the offset from u.u_ar0 to the register values relative to
|
||||
core_reg_sect. This is used with old-fashioned core files to
|
||||
locate the registers in a large upage-plus-stack ".reg" section.
|
||||
Original upage address X is at location core_reg_sect+x+reg_addr.
|
||||
*/
|
||||
|
||||
static void
|
||||
fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
|
||||
char *core_reg_sect;
|
||||
unsigned core_reg_size;
|
||||
int which;
|
||||
CORE_ADDR reg_addr;
|
||||
{
|
||||
#if 0 /* XXX laters */
|
||||
register int regno;
|
||||
register int cregno;
|
||||
register int addr;
|
||||
int bad_reg = -1;
|
||||
int offset;
|
||||
struct user *tmp_uaddr;
|
||||
|
||||
/*
|
||||
* First get virtual address of user structure. Then calculate offset.
|
||||
*/
|
||||
memcpy(&tmp_uaddr,
|
||||
&((struct user *) core_reg_sect)->u_kproc.kp_proc.p_addr,
|
||||
sizeof(tmp_uaddr));
|
||||
offset = -reg_addr - (int) tmp_uaddr;
|
||||
|
||||
for (regno = 0; regno < NUM_REGS; regno++)
|
||||
{
|
||||
cregno = tregmap[regno];
|
||||
if (cregno == tFS)
|
||||
addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_fs);
|
||||
else if (cregno == tGS)
|
||||
addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_gs);
|
||||
else
|
||||
addr = offset + 4 * cregno;
|
||||
if (addr < 0 || addr >= core_reg_size)
|
||||
{
|
||||
if (bad_reg < 0)
|
||||
bad_reg = regno;
|
||||
}
|
||||
else
|
||||
{
|
||||
supply_register (regno, core_reg_sect + addr);
|
||||
}
|
||||
}
|
||||
if (bad_reg >= 0)
|
||||
{
|
||||
error ("Register %s not found in core file.", gdb_register_names[bad_reg]);
|
||||
}
|
||||
|
||||
addr = offsetof (struct user, u_pcb) + offsetof (struct pcb, pcb_savefpu);
|
||||
memcpy (&pcb_savefpu, core_reg_sect + addr, sizeof pcb_savefpu);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
kernel_u_size ()
|
||||
{
|
||||
return (sizeof (struct user));
|
||||
}
|
||||
|
||||
|
||||
/* Register that we are able to handle aout (trad-core) file formats. */
|
||||
|
||||
static struct core_fns aout_core_fns =
|
||||
{
|
||||
bfd_target_unknown_flavour,
|
||||
fetch_core_registers,
|
||||
NULL
|
||||
};
|
||||
|
||||
#ifdef HAVE_GREGSET_T
|
||||
void
|
||||
_initialize_core_aout ()
|
||||
supply_gregset (gp)
|
||||
gregset_t *gp;
|
||||
{
|
||||
add_core_fns (&aout_core_fns);
|
||||
int regno = 0;
|
||||
|
||||
/* These must be ordered the same as REGISTER_NAMES in
|
||||
config/alpha/tm-alpha.h. */
|
||||
for (regno = 0; regno < 31; regno++)
|
||||
supply_register (regno, (char *)&gp->r_regs[regno]);
|
||||
supply_register (PC_REGNUM, (char *)&gp->r_regs[regno]);
|
||||
}
|
||||
#endif /* HAVE_GREGSET_T */
|
||||
|
||||
#ifdef HAVE_FPREGSET_T
|
||||
void
|
||||
supply_fpregset (fp)
|
||||
fpregset_t *fp;
|
||||
{
|
||||
int regno = 0;
|
||||
|
||||
for (regno = 0; regno < 32; regno++)
|
||||
supply_register (regno + 32, (char *)&fp->fpr_regs[regno]);
|
||||
}
|
||||
#endif /* HAVE_FPREGSET_T */
|
||||
|
|
Loading…
Reference in a new issue