Page MenuHomeFreeBSD

D12293.id33072.diff
No OneTemporary

D12293.id33072.diff

Index: head/sys/arm/arm/elf_machdep.c
===================================================================
--- head/sys/arm/arm/elf_machdep.c
+++ head/sys/arm/arm/elf_machdep.c
@@ -45,6 +45,9 @@
#include <machine/elf.h>
#include <machine/md_var.h>
+#ifdef VFP
+#include <machine/vfp.h>
+#endif
static boolean_t elf32_arm_abi_supported(struct image_params *);
@@ -127,9 +130,19 @@
}
void
-elf32_dump_thread(struct thread *td __unused, void *dst __unused,
- size_t *off __unused)
+elf32_dump_thread(struct thread *td, void *dst, size_t *off)
{
+#ifdef VFP
+ mcontext_vfp_t vfp;
+
+ if (dst != NULL) {
+ get_vfpcontext(td, &vfp);
+ *off = elf32_populate_note(NT_ARM_VFP, &vfp, dst, sizeof(vfp),
+ NULL);
+ } else
+ *off = elf32_populate_note(NT_ARM_VFP, NULL, NULL, sizeof(vfp),
+ NULL);
+#endif
}
/*
Index: head/sys/sys/elf_common.h
===================================================================
--- head/sys/sys/elf_common.h
+++ head/sys/sys/elf_common.h
@@ -757,6 +757,7 @@
#define NT_PTLWPINFO 17 /* Thread ptrace miscellaneous info. */
#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */
#define NT_X86_XSTATE 0x202 /* x86 XSAVE extended state. */
+#define NT_ARM_VFP 0x400 /* ARM VFP registers */
/* Symbol Binding - ELFNN_ST_BIND - st_info */
#define STB_LOCAL 0 /* Local symbol */
Index: head/usr.bin/gcore/elfcore.c
===================================================================
--- head/usr.bin/gcore/elfcore.c
+++ head/usr.bin/gcore/elfcore.c
@@ -109,6 +109,9 @@
static void *elf_note_prstatus(void *, size_t *);
static void *elf_note_thrmisc(void *, size_t *);
static void *elf_note_ptlwpinfo(void *, size_t *);
+#if defined(__arm__)
+static void *elf_note_arm_vfp(void *, size_t *);
+#endif
#if defined(__i386__) || defined(__amd64__)
static void *elf_note_x86_xstate(void *, size_t *);
#endif
@@ -368,6 +371,9 @@
elf_putnote(NT_FPREGSET, elf_note_fpregset, tids + i, sb);
elf_putnote(NT_THRMISC, elf_note_thrmisc, tids + i, sb);
elf_putnote(NT_PTLWPINFO, elf_note_ptlwpinfo, tids + i, sb);
+#if defined(__arm__)
+ elf_putnote(NT_ARM_VFP, elf_note_arm_vfp, tids + i, sb);
+#endif
#if defined(__i386__) || defined(__amd64__)
elf_putnote(NT_X86_XSTATE, elf_note_x86_xstate, tids + i, sb);
#endif
@@ -717,6 +723,31 @@
*sizep = sizeof(int) + sizeof(struct ptrace_lwpinfo);
return (p);
}
+
+#if defined(__arm__)
+static void *
+elf_note_arm_vfp(void *arg, size_t *sizep)
+{
+ lwpid_t tid;
+ struct vfpreg *vfp;
+ static bool has_vfp = true;
+ struct vfpreg info;
+
+ tid = *(lwpid_t *)arg;
+ if (has_vfp) {
+ if (ptrace(PT_GETVFPREGS, tid, (void *)&info, 0) != 0)
+ has_vfp = false;
+ }
+ if (!has_vfp) {
+ *sizep = 0;
+ return (NULL);
+ }
+ vfp = calloc(1, sizeof(*vfp));
+ memcpy(vfp, &info, sizeof(*vfp));
+ *sizep = sizeof(*vfp);
+ return (vfp);
+}
+#endif
#if defined(__i386__) || defined(__amd64__)
static void *

File Metadata

Mime Type
text/plain
Expires
Mon, Aug 17, 9:51 PM (4 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36876903
Default Alt Text
D12293.id33072.diff (2 KB)

Event Timeline