#include "gdbtypes.h"
#include "reggroups.h"
#include "regset.h"
+#include "elf-bfd.h" /* for elfcore_write_* */
#include "parser-defs.h"
#include "user-regs.h"
#include "amd64-linux-tdep.h"
&amd64_linux_xstateregset, "XSAVE extended state", cb_data);
}
+/* The standard elfcore_write_linux_prstatus32 isn't quite correct
+ for x32, which needs an extra 4 bytes of padding at the end of
+ the note. */
+
+static char *
+amd64_x32_write_linux_prstatus (bfd *obfd,
+ char *buf,
+ int *bufsize,
+ struct elf_internal_linux_prstatus *prstatus)
+{
+ /* Tack pr_fpvalid to end of pr_regs. */
+ bfd_put_32 (obfd, prstatus->pr_fpvalid,
+ (char *) prstatus->pr_reg + prstatus->pr_reg_size);
+ prstatus->pr_reg_size += 4;
+ /* pr_fpvalid becomes padding. */
+ prstatus->pr_fpvalid = 0;
+ return elfcore_write_linux_prstatus32 (obfd, buf, bufsize, prstatus);
+}
+
/* The instruction sequences used in x86_64 machines for a
disabled is-enabled probe. */
/* x32's layout is not compatible with the 32-bit layout. */
set_gdbarch_elfcore_write_linux_prstatus
- (gdbarch, gdb_deprecated_elfcore_write_linux_prstatus);
+ (gdbarch, amd64_x32_write_linux_prstatus);
amd64_x32_init_abi (info, gdbarch);
}
char *
-gdbarch_elfcore_write_linux_prstatus (struct gdbarch *gdbarch, bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prstatus *info)
+gdbarch_elfcore_write_linux_prstatus (struct gdbarch *gdbarch, bfd *obfd, char *note_data, int *note_size, struct elf_internal_linux_prstatus *info)
{
gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->elfcore_write_linux_prstatus != NULL);
extern int gdbarch_elfcore_write_linux_prstatus_p (struct gdbarch *gdbarch);
-typedef char * (gdbarch_elfcore_write_linux_prstatus_ftype) (bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prstatus *info);
-extern char * gdbarch_elfcore_write_linux_prstatus (struct gdbarch *gdbarch, bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prstatus *info);
+typedef char * (gdbarch_elfcore_write_linux_prstatus_ftype) (bfd *obfd, char *note_data, int *note_size, struct elf_internal_linux_prstatus *info);
+extern char * gdbarch_elfcore_write_linux_prstatus (struct gdbarch *gdbarch, bfd *obfd, char *note_data, int *note_size, struct elf_internal_linux_prstatus *info);
extern void set_gdbarch_elfcore_write_linux_prstatus (struct gdbarch *gdbarch, gdbarch_elfcore_write_linux_prstatus_ftype *elfcore_write_linux_prstatus);
/* Find core file memory regions */
# as we call the Linux generic routines in bfd to write notes by
# default.
F:char *:elfcore_write_linux_prpsinfo:bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prpsinfo *info:obfd, note_data, note_size, info
-F:char *:elfcore_write_linux_prstatus:bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prstatus *info:obfd, note_data, note_size, info
+F:char *:elfcore_write_linux_prstatus:bfd *obfd, char *note_data, int *note_size, struct elf_internal_linux_prstatus *info:obfd, note_data, note_size, info
# Find core file memory regions
M:int:find_memory_regions:find_memory_region_ftype func, void *data:func, data
gdb_assert (regset && regset->collect_regset);
- buf = (char *) xmalloc (size);
+ /* Extra 4 bytes for use by amd64_x32_write_linux_prstatus. */
+ buf = (char *) xmalloc (size + 4);
regset->collect_regset (regset, data->regcache, -1, buf, size);
/* PRSTATUS still needs to be treated specially. */