Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142720082
D27727.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D27727.id.diff
View Options
diff --git a/sys/arm64/arm64/gdb_machdep.c b/sys/arm64/arm64/gdb_machdep.c
new file mode 100644
--- /dev/null
+++ b/sys/arm64/arm64/gdb_machdep.c
@@ -0,0 +1,112 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 The FreeBSD Foundation
+ *
+ * This software was developed by Mitchell Horne under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <sys/signal.h>
+
+#include <machine/armreg.h>
+#include <machine/frame.h>
+#include <machine/gdb_machdep.h>
+#include <machine/pcb.h>
+
+#include <gdb/gdb.h>
+
+void *
+gdb_cpu_getreg(int regnum, size_t *regsz)
+{
+
+ *regsz = gdb_cpu_regsz(regnum);
+
+ if (kdb_thread == curthread) {
+ switch (regnum) {
+ case GDB_REG_LR: return (&kdb_frame->tf_lr);
+ case GDB_REG_SP: return (&kdb_frame->tf_sp);
+ case GDB_REG_PC: return (&kdb_frame->tf_elr);
+ case GDB_REG_CSPR: return (&kdb_frame->tf_spsr);
+ }
+ }
+ switch (regnum) {
+ case GDB_REG_SP: return (&kdb_thrctx->pcb_sp);
+ case GDB_REG_PC: /* FALLTHROUGH */
+ case GDB_REG_LR: return (&kdb_thrctx->pcb_lr);
+ default:
+ if (regnum >= GDB_REG_X0 && regnum <= GDB_REG_X29)
+ return (&kdb_thrctx->pcb_x[regnum]);
+ break;
+ }
+
+ return (NULL);
+}
+
+void
+gdb_cpu_setreg(int regnum, void *val)
+{
+ register_t regval = *(register_t *)val;
+
+ /* For curthread, keep the pcb and trapframe in sync. */
+ if (kdb_thread == curthread) {
+ switch (regnum) {
+ case GDB_REG_PC: kdb_frame->tf_elr = regval; break;
+ case GDB_REG_SP: kdb_frame->tf_sp = regval; break;
+ default:
+ if (regnum >= GDB_REG_X0 && regnum <= GDB_REG_X29) {
+ kdb_frame->tf_x[regnum] = regval;
+ }
+ break;
+ }
+ }
+ switch (regnum) {
+ case GDB_REG_PC: /* FALLTHROUGH */
+ case GDB_REG_LR: kdb_thrctx->pcb_lr = regval; break;
+ case GDB_REG_SP: kdb_thrctx->pcb_sp = regval; break;
+ default:
+ if (regnum >= GDB_REG_X0 && regnum <= GDB_REG_X29) {
+ kdb_thrctx->pcb_x[regnum] = regval;
+ }
+ break;
+ }
+}
+
+int
+gdb_cpu_signal(int type, int code __unused)
+{
+
+ switch (type) {
+ case EXCP_WATCHPT_EL1:
+ case EXCP_SOFTSTP_EL1:
+ case EXCP_BRK:
+ return (SIGTRAP);
+ }
+ return (SIGEMT);
+}
diff --git a/sys/arm64/conf/GENERIC b/sys/arm64/conf/GENERIC
--- a/sys/arm64/conf/GENERIC
+++ b/sys/arm64/conf/GENERIC
@@ -87,7 +87,7 @@
options KDB_TRACE # Print a stack trace for a panic.
# For full debugger support use (turn off in stable branch):
options DDB # Support DDB.
-#options GDB # Support remote GDB.
+options GDB # Support remote GDB.
options DEADLKRES # Enable the deadlock resolver
options INVARIANTS # Enable calls of extra sanity checking
options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
diff --git a/sys/arm64/include/gdb_machdep.h b/sys/arm64/include/gdb_machdep.h
new file mode 100644
--- /dev/null
+++ b/sys/arm64/include/gdb_machdep.h
@@ -0,0 +1,81 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 The FreeBSD Foundation
+ *
+ * This software was developed by Mitchell Horne under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _MACHINE_GDB_MACHDEP_H_
+#define _MACHINE_GDB_MACHDEP_H_
+
+#define GDB_BUFSZ 4096
+#define GDB_NREGS 68
+#define GDB_REG_X0 0
+#define GDB_REG_X29 29
+#define GDB_REG_LR 30
+#define GDB_REG_SP 31
+#define GDB_REG_PC 32
+#define GDB_REG_CSPR 33
+#define GDB_REG_V0 34
+#define GDB_REG_V31 65
+#define GDB_REG_FPSR 66
+#define GDB_REG_FPCR 67
+_Static_assert(GDB_BUFSZ >= (GDB_NREGS * 16), "buffer fits 'g' regs");
+
+static __inline size_t
+gdb_cpu_regsz(int regnum)
+{
+ if (regnum == GDB_REG_CSPR || regnum == GDB_REG_FPSR ||
+ regnum == GDB_REG_FPCR)
+ return (4);
+ else if (regnum >= GDB_REG_V0 && regnum <= GDB_REG_V31)
+ return (16);
+
+ return (8);
+}
+
+static __inline int
+gdb_cpu_query(void)
+{
+ return (0);
+}
+
+static __inline void *
+gdb_begin_write(void)
+{
+ return (NULL);
+}
+
+static __inline void
+gdb_end_write(void *arg __unused)
+{
+}
+
+void *gdb_cpu_getreg(int, size_t *);
+void gdb_cpu_setreg(int, void *);
+int gdb_cpu_signal(int, int);
+
+#endif /* !_MACHINE_GDB_MACHDEP_H_ */
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -168,6 +168,7 @@
arm64/arm64/elf_machdep.c standard
arm64/arm64/exception.S standard
arm64/arm64/freebsd32_machdep.c optional compat_freebsd32
+arm64/arm64/gdb_machdep.c optional gdb
arm64/arm64/gicv3_its.c optional intrng fdt
arm64/arm64/gic_v3.c standard
arm64/arm64/gic_v3_acpi.c optional acpi
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 23, 4:03 PM (6 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27887329
Default Alt Text
D27727.id.diff (7 KB)
Attached To
Mode
D27727: arm64: gdb(4) stub
Attached
Detach File
Event Timeline
Log In to Comment