git: 02c57f7b4877 - main - kdump: decode pollfd struct arrays coming from poll(2)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 05 Mar 2024 05:44:16 UTC
The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=02c57f7b48772c5ec4e3a0a3405273b387b9bb08 commit 02c57f7b48772c5ec4e3a0a3405273b387b9bb08 Author: Kyle Evans <kevans@FreeBSD.org> AuthorDate: 2024-03-05 04:14:06 +0000 Commit: Kyle Evans <kevans@FreeBSD.org> CommitDate: 2024-03-05 05:44:09 +0000 kdump: decode pollfd struct arrays coming from poll(2) We'll handle these just as we do kevents, one per line with subsequent lines indented sufficiently to distinguish them from the upcoming return value. Sample, with indentation stripped and revents changed to '...' in the first one to keep the line length down: CALL poll(0x820610560,0x3,0) STRU struct pollfd[] = { { fd=0, events=0x1<POLLIN>, revents=0x11<...> { fd=1, events=0x4<POLLOUT>, revents=0x4<POLLOUT>} { fd=-1, events=0x4<POLLOUT>, revents=0} } RET poll 2 Reviewed by: bapt, jhb Differential Revision: https://reviews.freebsd.org/D44160 --- usr.bin/kdump/kdump.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 0253fdc9e87b..f5bb4dcfea42 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -46,6 +46,7 @@ #include <sys/ktrace.h> #include <sys/mman.h> #include <sys/ioctl.h> +#include <sys/poll.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/sysent.h> @@ -110,6 +111,7 @@ void ktrcapfail(struct ktr_cap_fail *); void ktrfault(struct ktr_fault *); void ktrfaultend(struct ktr_faultend *); void ktrkevent(struct kevent *); +void ktrpollfd(struct pollfd *); void ktrstructarray(struct ktr_struct_array *, size_t); void ktrbitset(char *, struct bitset *, size_t); void ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip, @@ -2209,10 +2211,23 @@ ktrkevent(struct kevent *kev) printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata); } +void +ktrpollfd(struct pollfd *pfd) +{ + + printf("{ fd=%d", pfd->fd); + printf(", events="); + print_mask_arg0(sysdecode_pollfd_events, pfd->events); + printf(", revents="); + print_mask_arg0(sysdecode_pollfd_events, pfd->revents); + printf("}"); +} + void ktrstructarray(struct ktr_struct_array *ksa, size_t buflen) { struct kevent kev; + struct pollfd pfd; char *name, *data; size_t namelen, datalen; int i; @@ -2294,6 +2309,11 @@ ktrstructarray(struct ktr_struct_array *ksa, size_t buflen) kev.udata = (void *)(uintptr_t)kev32.udata; ktrkevent(&kev); #endif + } else if (strcmp(name, "pollfd") == 0) { + if (ksa->struct_size != sizeof(pfd)) + goto bad_size; + memcpy(&pfd, data, sizeof(pfd)); + ktrpollfd(&pfd); } else { printf("<unknown structure> }\n"); return;