git: 2761de0832c1 - main - kern: add extended errors support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 31 May 2025 19:52:48 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=2761de0832c1c4342e2f8cca60c794815fda01e3
commit 2761de0832c1c4342e2f8cca60c794815fda01e3
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-05-23 06:39:50 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-05-31 19:52:41 +0000
kern: add extended errors support
Reviewed by: brooks
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
Differential revision: https://reviews.freebsd.org/D50483
---
sys/conf/options | 1 +
sys/kern/kern_thread.c | 8 +++----
sys/sys/_exterr.h | 25 ++++++++++++++++++++++
sys/sys/exterr_cat.h | 18 ++++++++++++++++
sys/sys/exterrvar.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
sys/sys/proc.h | 3 +++
6 files changed, 109 insertions(+), 4 deletions(-)
diff --git a/sys/conf/options b/sys/conf/options
index 48018e3b6adf..b5e8971dfa54 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -53,6 +53,7 @@ DDB_CAPTURE_MAXBUFSIZE opt_ddb.h
DDB_CTF opt_ddb.h
DDB_NUMSYM opt_ddb.h
EARLY_PRINTF opt_global.h
+BLOW_KERNEL_WITH_EXTERR opt_global.h
FULL_BUF_TRACKING opt_global.h
GDB
KDB opt_global.h
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 4ccd6b26528e..2dff461e932a 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -86,9 +86,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0x108,
"struct thread KBI td_flags");
_Static_assert(offsetof(struct thread, td_pflags) == 0x114,
"struct thread KBI td_pflags");
-_Static_assert(offsetof(struct thread, td_frame) == 0x4b8,
+_Static_assert(offsetof(struct thread, td_frame) == 0x4e8,
"struct thread KBI td_frame");
-_Static_assert(offsetof(struct thread, td_emuldata) == 0x6c0,
+_Static_assert(offsetof(struct thread, td_emuldata) == 0x6f0,
"struct thread KBI td_emuldata");
_Static_assert(offsetof(struct proc, p_flag) == 0xb8,
"struct proc KBI p_flag");
@@ -106,9 +106,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0x9c,
"struct thread KBI td_flags");
_Static_assert(offsetof(struct thread, td_pflags) == 0xa8,
"struct thread KBI td_pflags");
-_Static_assert(offsetof(struct thread, td_frame) == 0x318,
+_Static_assert(offsetof(struct thread, td_frame) == 0x33c,
"struct thread KBI td_frame");
-_Static_assert(offsetof(struct thread, td_emuldata) == 0x35c,
+_Static_assert(offsetof(struct thread, td_emuldata) == 0x380,
"struct thread KBI td_emuldata");
_Static_assert(offsetof(struct proc, p_flag) == 0x6c,
"struct proc KBI p_flag");
diff --git a/sys/sys/_exterr.h b/sys/sys/_exterr.h
new file mode 100644
index 000000000000..4423d6a34bdb
--- /dev/null
+++ b/sys/sys/_exterr.h
@@ -0,0 +1,25 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ */
+
+#ifndef _SYS__EXTERR_H_
+#define _SYS__EXTERR_H_
+
+#include <sys/_types.h>
+
+struct kexterr {
+ int error;
+ const char *msg;
+ __uint64_t p1;
+ __uint64_t p2;
+ unsigned cat;
+ unsigned src_line;
+};
+
+#endif
diff --git a/sys/sys/exterr_cat.h b/sys/sys/exterr_cat.h
new file mode 100644
index 000000000000..d16faa9cc2e5
--- /dev/null
+++ b/sys/sys/exterr_cat.h
@@ -0,0 +1,18 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ */
+
+#ifndef _SYS_EXTERR_CAT_H_
+#define _SYS_EXTERR_CAT_H_
+
+#define EXTERR_CAT_MMAP 1
+#define EXTERR_CAT_FILEDESC 2
+
+#endif
+
diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h
new file mode 100644
index 000000000000..6e392ff2c18c
--- /dev/null
+++ b/sys/sys/exterrvar.h
@@ -0,0 +1,58 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ */
+
+#ifndef _SYS_EXTERRVAR_H_
+#define _SYS_EXTERRVAR_H_
+
+#include <sys/_exterr.h>
+#include <sys/exterr_cat.h>
+#include <sys/types.h>
+
+struct uexterror {
+ uint32_t ver;
+ uint32_t error;
+ uint32_t cat;
+ uint32_t src_line;
+ uint64_t p1;
+ uint64_t p2;
+ uint64_t rsrv1[4];
+ char msg[128];
+};
+
+#ifdef _KERNEL
+
+#ifndef EXTERR_CATEGORY
+#error "Specify error category before including sys/exterrvar.h"
+#endif
+
+#ifdef BLOW_KERNEL_WITH_EXTERR
+#define SET_ERROR_MSG(mmsg) _Td->td_kexterr.msg = mmsg
+#else
+#define SET_ERROR_MSG(mmsg) _Td->td_kexterr.msg = NULL
+#endif
+
+#define SET_ERROR2(eerror, mmsg, pp1, pp2) do { \
+ struct thread *_Td = curthread; \
+ if ((_Td->td_pflags2 & TDP2_UEXTERR) != 0) { \
+ _Td->td_pflags2 |= TDP2_EXTERR; \
+ _Td->td_kexterr.error = eerror; \
+ _Td->td_kexterr.cat = EXTERR_CATEGORY; \
+ SET_ERROR_MSG(mmsg); \
+ _Td->td_kexterr.p1 = (uintptr_t)pp1; \
+ _Td->td_kexterr.p2 = (uintptr_t)pp2; \
+ _Td->td_kexterr.src_line = __LINE__; \
+ } \
+} while (0)
+#define SET_ERROR0(eerror, mmsg) SET_ERROR2(eerror, mmsg, 0, 0)
+#define SET_ERROR1(eerror, mmsg, pp1) SET_ERROR2(eerror, mmsg, pp1, 0)
+
+#endif /* _KERNEL */
+
+#endif
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index fcacfec4442b..cab487719c31 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -42,6 +42,7 @@
#ifdef _KERNEL
#include <sys/_eventhandler.h>
#endif
+#include <sys/_exterr.h>
#include <sys/condvar.h>
#ifndef _KERNEL
#include <sys/filedesc.h>
@@ -322,6 +323,7 @@ struct thread {
size_t td_vslock_sz; /* (k) amount of vslock-ed space */
struct kcov_info *td_kcov_info; /* (*) Kernel code coverage data */
long td_ucredref; /* (k) references on td_realucred */
+ struct kexterr td_kexterr;
#define td_endzero td_sigmask
/* Copied during fork1(), thread_create(), or kthread_add(). */
@@ -569,6 +571,7 @@ enum {
#define TDP2_COMPAT32RB 0x00000002 /* compat32 ABI for robust lists */
#define TDP2_ACCT 0x00000004 /* Doing accounting */
#define TDP2_SAN_QUIET 0x00000008 /* Disable warnings from K(A|M)SAN */
+#define TDP2_EXTERR 0x00000010 /* Kernel reported ext error */
/*
* Reasons that the current thread can not be run yet.