aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinsoo Choo <minsoochoo0122@proton.me>2026-02-06 20:03:53 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-02-09 04:17:16 +0000
commit8f23665fed2fbaf4481359b4d2fcdd7b9feb40e3 (patch)
tree94ad4006ebf97f623a37d5fc08d899204ef6a3cd
parent2088e742013bb1b9ca237a79767362efe92d9da8 (diff)
pcb.h: mark struct pcb to be preserved
There are programs that depend on this structure (e.g. kernel debuggers) that breaks when the ABI changes. Signed-off-by: Minsoo Choo <minsoochoo0122@proton.me> Reviewed by: kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D55149
-rw-r--r--sys/amd64/include/pcb.h21
-rw-r--r--sys/arm/include/pcb.h4
-rw-r--r--sys/arm64/include/pcb.h5
-rw-r--r--sys/i386/include/pcb.h17
-rw-r--r--sys/powerpc/include/pcb.h5
-rw-r--r--sys/riscv/include/pcb.h5
6 files changed, 39 insertions, 18 deletions
diff --git a/sys/amd64/include/pcb.h b/sys/amd64/include/pcb.h
index 27e1dce08ee1..5a1e8529ad8b 100644
--- a/sys/amd64/include/pcb.h
+++ b/sys/amd64/include/pcb.h
@@ -44,18 +44,19 @@
#ifdef __amd64__
/*
- * NB: The fields marked with (*) are used by kernel debuggers. Their
- * ABI should be preserved.
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
*/
struct pcb {
- register_t pcb_r15; /* (*) */
- register_t pcb_r14; /* (*) */
- register_t pcb_r13; /* (*) */
- register_t pcb_r12; /* (*) */
- register_t pcb_rbp; /* (*) */
- register_t pcb_rsp; /* (*) */
- register_t pcb_rbx; /* (*) */
- register_t pcb_rip; /* (*) */
+ register_t pcb_r15;
+ register_t pcb_r14;
+ register_t pcb_r13;
+ register_t pcb_r12;
+ register_t pcb_rbp;
+ register_t pcb_rsp;
+ register_t pcb_rbx;
+ register_t pcb_rip;
register_t pcb_fsbase;
register_t pcb_gsbase;
register_t pcb_kgsbase;
diff --git a/sys/arm/include/pcb.h b/sys/arm/include/pcb.h
index fd77544c22c1..810b1e665b19 100644
--- a/sys/arm/include/pcb.h
+++ b/sys/arm/include/pcb.h
@@ -42,6 +42,10 @@
#include <machine/vfp.h>
/*
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
+ *
* WARNING!
* Keep pcb_regs first for faster access in switch.S
*/
diff --git a/sys/arm64/include/pcb.h b/sys/arm64/include/pcb.h
index c0feb1149cf5..9955f5b22714 100644
--- a/sys/arm64/include/pcb.h
+++ b/sys/arm64/include/pcb.h
@@ -46,6 +46,11 @@ struct trapframe;
#define PCB_FP 10
#define PCB_LR 11
+/*
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
+ */
struct pcb {
uint64_t pcb_x[12];
/* These two need to be in order as we access them together */
diff --git a/sys/i386/include/pcb.h b/sys/i386/include/pcb.h
index 1b14efa425b5..1385bfeeef31 100644
--- a/sys/i386/include/pcb.h
+++ b/sys/i386/include/pcb.h
@@ -44,16 +44,17 @@
#include <machine/npx.h>
/*
- * NB: The fields marked with (*) are used by kernel debuggers. Their
- * ABI should be preserved.
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
*/
struct pcb {
- int pcb_edi; /* (*) */
- int pcb_esi; /* (*) */
- int pcb_ebp; /* (*) */
- int pcb_esp; /* (*) */
- int pcb_ebx; /* (*) */
- int pcb_eip; /* (*) */
+ int pcb_edi;
+ int pcb_esi;
+ int pcb_ebp;
+ int pcb_esp;
+ int pcb_ebx;
+ int pcb_eip;
struct segment_descriptor pcb_fsd;
struct segment_descriptor pcb_gsd;
int pcb_ds;
diff --git a/sys/powerpc/include/pcb.h b/sys/powerpc/include/pcb.h
index 0230cf78aba7..7ebd13dd0ed1 100644
--- a/sys/powerpc/include/pcb.h
+++ b/sys/powerpc/include/pcb.h
@@ -41,6 +41,11 @@
#include <machine/setjmp.h>
#ifndef _STANDALONE
+/*
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
+ */
struct pcb {
register_t pcb_context[20]; /* non-volatile r12-r31 */
register_t pcb_cr; /* Condition register */
diff --git a/sys/riscv/include/pcb.h b/sys/riscv/include/pcb.h
index bb88516a1385..bcec4c3fd478 100644
--- a/sys/riscv/include/pcb.h
+++ b/sys/riscv/include/pcb.h
@@ -39,6 +39,11 @@
struct trapframe;
+/*
+ * struct pcb is known to and used by kernel debuggers. Its layout must be kept
+ * stable. When adding extra fields that are accessed by kernel debuggers,
+ * debuggers should be backward compatible by using osreldate.
+ */
struct pcb {
uint64_t pcb_ra; /* Return address */
uint64_t pcb_sp; /* Stack pointer */