Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145172968
D35378.id119353.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D35378.id119353.diff
View Options
diff --git a/sys/arm64/arm64/db_trace.c b/sys/arm64/arm64/db_trace.c
--- a/sys/arm64/arm64/db_trace.c
+++ b/sys/arm64/arm64/db_trace.c
@@ -145,7 +145,7 @@
ctx = kdb_thr_ctx(thr);
frame.fp = (uintptr_t)ctx->pcb_x[PCB_FP];
- frame.pc = (uintptr_t)ctx->pcb_lr;
+ frame.pc = (uintptr_t)ctx->pcb_x[PCB_LR];
db_stack_trace_cmd(thr, &frame);
} else
db_trace_self();
diff --git a/sys/arm64/arm64/gdb_machdep.c b/sys/arm64/arm64/gdb_machdep.c
--- a/sys/arm64/arm64/gdb_machdep.c
+++ b/sys/arm64/arm64/gdb_machdep.c
@@ -60,10 +60,10 @@
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);
+ case GDB_REG_LR: return (&kdb_thrctx->pcb_x[PCB_LR]);
default:
- if (regnum >= GDB_REG_X0 && regnum <= GDB_REG_X29)
- return (&kdb_thrctx->pcb_x[regnum]);
+ if (regnum >= GDB_REG_X19 && regnum <= GDB_REG_X29)
+ return (&kdb_thrctx->pcb_x[regnum - GDB_REG_X19]);
break;
}
@@ -89,11 +89,11 @@
}
switch (regnum) {
case GDB_REG_PC: /* FALLTHROUGH */
- case GDB_REG_LR: kdb_thrctx->pcb_lr = regval; break;
+ case GDB_REG_LR: kdb_thrctx->pcb_x[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;
+ if (regnum >= GDB_REG_X19 && regnum <= GDB_REG_X29) {
+ kdb_thrctx->pcb_x[regnum - GDB_REG_X19] = regval;
}
break;
}
diff --git a/sys/arm64/arm64/genassym.c b/sys/arm64/arm64/genassym.c
--- a/sys/arm64/arm64/genassym.c
+++ b/sys/arm64/arm64/genassym.c
@@ -57,7 +57,6 @@
ASSYM(PCB_SINGLE_STEP_SHIFT, PCB_SINGLE_STEP_SHIFT);
ASSYM(PCB_REGS, offsetof(struct pcb, pcb_x));
ASSYM(PCB_X19, PCB_X19);
-ASSYM(PCB_LR, offsetof(struct pcb, pcb_lr));
ASSYM(PCB_SP, offsetof(struct pcb, pcb_sp));
ASSYM(PCB_TPIDRRO, offsetof(struct pcb, pcb_tpidrro_el0));
ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -356,10 +356,10 @@
int i;
for (i = 0; i < nitems(pcb->pcb_x); i++)
- pcb->pcb_x[i] = tf->tf_x[i];
+ pcb->pcb_x[i] = tf->tf_x[i + PCB_X_START];
- /* NB: pcb_lr is the PC, see PC_REGS() in db_machdep.h */
- pcb->pcb_lr = tf->tf_elr;
+ /* NB: pcb_x[PCB_LR] is the PC, see PC_REGS() in db_machdep.h */
+ pcb->pcb_x[PCB_LR] = tf->tf_elr;
pcb->pcb_sp = tf->tf_sp;
}
diff --git a/sys/arm64/arm64/stack_machdep.c b/sys/arm64/arm64/stack_machdep.c
--- a/sys/arm64/arm64/stack_machdep.c
+++ b/sys/arm64/arm64/stack_machdep.c
@@ -69,7 +69,7 @@
return (EOPNOTSUPP);
frame.fp = td->td_pcb->pcb_x[PCB_FP];
- frame.pc = ADDR_MAKE_CANONICAL(td->td_pcb->pcb_lr);
+ frame.pc = ADDR_MAKE_CANONICAL(td->td_pcb->pcb_x[PCB_LR]);
stack_capture(td, st, &frame);
return (0);
diff --git a/sys/arm64/arm64/vm_machdep.c b/sys/arm64/arm64/vm_machdep.c
--- a/sys/arm64/arm64/vm_machdep.c
+++ b/sys/arm64/arm64/vm_machdep.c
@@ -107,7 +107,7 @@
/* Set the return value registers for fork() */
td2->td_pcb->pcb_x[PCB_X19] = (uintptr_t)fork_return;
td2->td_pcb->pcb_x[PCB_X20] = (uintptr_t)td2;
- td2->td_pcb->pcb_lr = (uintptr_t)fork_trampoline;
+ td2->td_pcb->pcb_x[PCB_LR] = (uintptr_t)fork_trampoline;
td2->td_pcb->pcb_sp = (uintptr_t)td2->td_frame;
vfp_new_thread(td2, td1, true);
@@ -185,7 +185,7 @@
td->td_pcb->pcb_x[PCB_X19] = (uintptr_t)fork_return;
td->td_pcb->pcb_x[PCB_X20] = (uintptr_t)td;
- td->td_pcb->pcb_lr = (uintptr_t)fork_trampoline;
+ td->td_pcb->pcb_x[PCB_LR] = (uintptr_t)fork_trampoline;
td->td_pcb->pcb_sp = (uintptr_t)td->td_frame;
/* Update VFP state for the new thread */
diff --git a/sys/arm64/include/db_machdep.h b/sys/arm64/include/db_machdep.h
--- a/sys/arm64/include/db_machdep.h
+++ b/sys/arm64/include/db_machdep.h
@@ -44,7 +44,7 @@
typedef vm_offset_t db_addr_t;
typedef long db_expr_t;
-#define PC_REGS() ((db_addr_t)kdb_thrctx->pcb_lr)
+#define PC_REGS() ((db_addr_t)kdb_thrctx->pcb_x[PCB_LR])
#define BKPT_INST (0xd4200000)
#define BKPT_SIZE (4)
@@ -52,7 +52,7 @@
#define BKPT_SKIP do { \
kdb_frame->tf_elr += BKPT_SIZE; \
- kdb_thrctx->pcb_lr += BKPT_SIZE; \
+ kdb_thrctx->pcb_x[PCB_LR] += BKPT_SIZE; \
} while (0)
#define db_clear_single_step kdb_cpu_clear_singlestep
diff --git a/sys/arm64/include/gdb_machdep.h b/sys/arm64/include/gdb_machdep.h
--- a/sys/arm64/include/gdb_machdep.h
+++ b/sys/arm64/include/gdb_machdep.h
@@ -34,6 +34,7 @@
#define GDB_BUFSZ 4096
#define GDB_NREGS 68
#define GDB_REG_X0 0
+#define GDB_REG_X19 19
#define GDB_REG_X29 29
#define GDB_REG_LR 30
#define GDB_REG_SP 31
diff --git a/sys/arm64/include/pcb.h b/sys/arm64/include/pcb.h
--- a/sys/arm64/include/pcb.h
+++ b/sys/arm64/include/pcb.h
@@ -36,14 +36,16 @@
struct trapframe;
-#define PCB_X19 19
-#define PCB_X20 20
-#define PCB_FP 29
+/* The first register in pcb_x is x19 */
+#define PCB_X_START 19
+
+#define PCB_X19 0
+#define PCB_X20 1
+#define PCB_FP 10
+#define PCB_LR 11
struct pcb {
- uint64_t pcb_x[30];
- uint64_t pcb_lr;
- uint64_t _reserved; /* Was pcb_pc */
+ uint64_t pcb_x[12];
/* These two need to be in order as we access them together */
uint64_t pcb_sp;
uint64_t pcb_tpidr_el0;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Feb 17, 6:25 PM (9 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28820186
Default Alt Text
D35378.id119353.diff (5 KB)
Attached To
Mode
D35378: Remove unused registes from the arm pcb
Attached
Detach File
Event Timeline
Log In to Comment