aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2021-07-03 07:05:44 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2021-07-03 07:06:31 +0000
commit45d99014ca3a57fcc6b603cf4494516b4dadda1b (patch)
treea7f6244decbd1770b58726d4649e14a2155ddbb7
parentef790cc7407e827db9563d08a52a71ab36436986 (diff)
downloadsrc-45d99014ca3a57fcc6b603cf4494516b4dadda1b.tar.gz
src-45d99014ca3a57fcc6b603cf4494516b4dadda1b.zip
linux(4): implement coredumps on arm64
Previously they only worked on amd64. Sponsored By: EPSRC Differential Revision: https://reviews.freebsd.org/D30975
-rw-r--r--sys/arm64/linux/linux.h12
-rw-r--r--sys/arm64/linux/linux_machdep.c16
-rw-r--r--sys/arm64/linux/linux_sysvec.c4
-rw-r--r--sys/modules/linux64/Makefile5
4 files changed, 32 insertions, 5 deletions
diff --git a/sys/arm64/linux/linux.h b/sys/arm64/linux/linux.h
index 5d4739223275..2e683b77f8e8 100644
--- a/sys/arm64/linux/linux.h
+++ b/sys/arm64/linux/linux.h
@@ -298,4 +298,16 @@ struct linux_robust_list_head {
l_uintptr_t pending_list;
};
+struct linux_pt_regset {
+ l_ulong x[31];
+ l_ulong sp;
+ l_ulong pc;
+ l_ulong cpsr;
+};
+
+struct reg;
+
+void bsd_to_linux_regset(struct reg *b_reg,
+ struct linux_pt_regset *l_regset);
+
#endif /* _ARM64_LINUX_H_ */
diff --git a/sys/arm64/linux/linux_machdep.c b/sys/arm64/linux/linux_machdep.c
index 8e10fc9d26a1..d9b13fa631fc 100644
--- a/sys/arm64/linux/linux_machdep.c
+++ b/sys/arm64/linux/linux_machdep.c
@@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
+#include <machine/reg.h>
+
#include <arm64/linux/linux.h>
#include <arm64/linux/linux_proto.h>
#include <compat/linux/linux_dtrace.h>
@@ -149,3 +151,17 @@ linux_set_cloned_tls(struct thread *td, void *desc)
return (cpu_set_user_tls(td, desc));
}
+
+void
+bsd_to_linux_regset(struct reg *b_reg, struct linux_pt_regset *l_regset)
+{
+
+ KASSERT(sizeof(l_regset->x) == sizeof(b_reg->x) + sizeof(l_ulong),
+ ("%s: size mismatch\n", __func__));
+ memcpy(l_regset->x, b_reg->x, sizeof(b_reg->x));
+
+ l_regset->x[30] = b_reg->lr;
+ l_regset->sp = b_reg->sp;
+ l_regset->pc = b_reg->elr;
+ l_regset->cpsr = b_reg->spsr;
+}
diff --git a/sys/arm64/linux/linux_sysvec.c b/sys/arm64/linux/linux_sysvec.c
index 33bc303b5ada..e1d3708b70e9 100644
--- a/sys/arm64/linux/linux_sysvec.c
+++ b/sys/arm64/linux/linux_sysvec.c
@@ -417,8 +417,8 @@ struct sysentvec elf_linux_sysvec = {
.sv_name = "Linux ELF64",
.sv_coredump = elf64_coredump,
.sv_elf_core_osabi = ELFOSABI_NONE,
- .sv_elf_core_abi_vendor = FREEBSD_ABI_VENDOR,
- .sv_elf_core_prepare_notes = elf64_prepare_notes,
+ .sv_elf_core_abi_vendor = LINUX_ABI_VENDOR,
+ .sv_elf_core_prepare_notes = linux64_prepare_notes,
.sv_imgact_try = linux_exec_imgact_try,
.sv_minsigstksz = LINUX_MINSIGSTKSZ,
.sv_minuser = VM_MIN_ADDRESS,
diff --git a/sys/modules/linux64/Makefile b/sys/modules/linux64/Makefile
index d70983354407..5f3f0fd03574 100644
--- a/sys/modules/linux64/Makefile
+++ b/sys/modules/linux64/Makefile
@@ -8,8 +8,8 @@
VDSO= linux_vdso
KMOD= linux64
-SRCS= linux_fork.c linux_dummy_machdep.c linux_file.c linux_event.c \
- linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c \
+SRCS= linux_elf64.c linux_fork.c linux_dummy_machdep.c linux_file.c \
+ linux_event.c linux_futex.c linux_getcwd.c linux_ioctl.c linux_ipc.c \
linux_machdep.c linux_misc.c linux_ptrace.c linux_signal.c \
linux_socket.c linux_stats.c linux_sysctl.c linux_sysent.c \
linux_sysvec.c linux_time.c linux_vdso.c linux_timer.c \
@@ -18,7 +18,6 @@ SRCS= linux_fork.c linux_dummy_machdep.c linux_file.c linux_event.c \
linux_support.s
.if ${MACHINE_CPUARCH} == "amd64"
SRCS+= linux_dummy_x86.c
-SRCS+= linux_elf64.c
.endif
DPSRCS= assym.inc linux_genassym.c