git: 6e2a3ed6a765 - stable/13 - kdump: Decode cpuset_t.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 17 Jun 2022 19:40:21 UTC
The branch stable/13 has been updated by dchagin:
URL: https://cgit.FreeBSD.org/src/commit/?id=6e2a3ed6a76501452184098d6f29194972dec66f
commit 6e2a3ed6a76501452184098d6f29194972dec66f
Author: Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2022-05-11 07:40:39 +0000
Commit: Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2022-06-17 19:35:15 +0000
kdump: Decode cpuset_t.
Reviewed by: jhb
Differential revision: https://reviews.freebsd.org/D34982
MFC after: 2 weeks
(cherry picked from commit 586ed321068b883e33df0e41ca913c074e6ea53d)
---
sys/kern/kern_cpuset.c | 10 ++++++++++
sys/sys/ktrace.h | 2 ++
usr.bin/kdump/kdump.c | 40 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/sys/kern/kern_cpuset.c b/sys/kern/kern_cpuset.c
index 6cfc56294ab8..a5c644687241 100644
--- a/sys/kern/kern_cpuset.c
+++ b/sys/kern/kern_cpuset.c
@@ -34,6 +34,7 @@
__FBSDID("$FreeBSD$");
#include "opt_ddb.h"
+#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -62,6 +63,7 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/interrupt.h>
#include <sys/vmmeter.h>
+#include <sys/ktrace.h>
#include <vm/uma.h>
#include <vm/vm.h>
@@ -2001,6 +2003,10 @@ kern_cpuset_getaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which,
cp++;
}
}
+#ifdef KTRACE
+ if ( KTRPOINT(td, KTR_STRUCT))
+ ktrcpuset(mask, size);
+#endif
}
out:
free(mask, M_TEMP);
@@ -2034,6 +2040,10 @@ kern_cpuset_setaffinity(struct thread *td, cpulevel_t level, cpuwhich_t which,
struct proc *p;
int error;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrcpuset(mask, sizeof(cpuset_t));
+#endif
error = cpuset_check_capabilities(td, level, which, id);
if (error != 0)
return (error);
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index 739f5a5d7ea0..b9d80f7f94d0 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -307,6 +307,8 @@ void ktrcapfail(enum ktr_cap_fail_type, const cap_rights_t *,
ktrstruct("stat", (s), sizeof(struct stat))
#define ktrstat_error(s, error) \
ktrstruct_error("stat", (s), sizeof(struct stat), error)
+#define ktrcpuset(s, l) \
+ ktrstruct("cpuset_t", (s), l)
extern u_int ktr_geniosize;
#ifdef KTRACE
extern int ktr_filesize_limit_signal;
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 19616338fc1f..c9344d001f32 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -48,8 +48,11 @@ __FBSDID("$FreeBSD$");
#define _WANT_KEVENT32
#endif
#define _WANT_FREEBSD11_KEVENT
+#define _WANT_FREEBSD_BITSET
#include <sys/param.h>
#include <sys/capsicum.h>
+#include <sys/_bitset.h>
+#include <sys/bitset.h>
#include <sys/errno.h>
#include <sys/time.h>
#include <sys/uio.h>
@@ -119,6 +122,7 @@ void ktrfault(struct ktr_fault *);
void ktrfaultend(struct ktr_faultend *);
void ktrkevent(struct kevent *);
void ktrstructarray(struct ktr_struct_array *, size_t);
+void ktrbitset(char *, struct bitset *, size_t);
void usage(void);
#define TIMESTAMP_NONE 0x0
@@ -1972,6 +1976,30 @@ ktrstat(struct stat *statp)
printf(" }\n");
}
+void
+ktrbitset(char *name, struct bitset *set, size_t setlen)
+{
+ int i, maxi, c = 0;
+
+ if (setlen > INT32_MAX)
+ setlen = INT32_MAX;
+ maxi = setlen * CHAR_BIT;
+ printf("%s [ ", name);
+ for (i = 0; i < maxi; i++) {
+ if (!BIT_ISSET(setlen, i, set))
+ continue;
+ if (c == 0)
+ printf("%d", i);
+ else
+ printf(", %d", i);
+ c++;
+ }
+ if (c == 0)
+ printf(" empty ]\n");
+ else
+ printf(" ]\n");
+}
+
void
ktrstruct(char *buf, size_t buflen)
{
@@ -1982,6 +2010,7 @@ ktrstruct(char *buf, size_t buflen)
struct itimerval it;
struct stat sb;
struct sockaddr_storage ss;
+ struct bitset *set;
for (name = buf, namelen = 0;
namelen < buflen && name[namelen] != '\0';
@@ -1997,7 +2026,7 @@ ktrstruct(char *buf, size_t buflen)
goto invalid;
/* sanity check */
for (i = 0; i < (int)namelen; ++i)
- if (!isalpha(name[i]))
+ if (!isalpha(name[i]) && name[i] != '_')
goto invalid;
if (strcmp(name, "caprights") == 0) {
if (datalen != sizeof(cap_rights_t))
@@ -2021,6 +2050,15 @@ ktrstruct(char *buf, size_t buflen)
if (datalen != ss.ss_len)
goto invalid;
ktrsockaddr((struct sockaddr *)&ss);
+ } else if (strcmp(name, "cpuset_t") == 0) {
+ if (datalen < 1)
+ goto invalid;
+ set = malloc(datalen);
+ if (set == NULL)
+ errx(1, "%s", strerror(ENOMEM));
+ memcpy(set, data, datalen);
+ ktrbitset(name, set, datalen);
+ free(set);
} else {
printf("unknown structure\n");
}