/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __COREDUMP_TEST_H #define __COREDUMP_TEST_H #include #include #include #include "../kselftest_harness.h" #include "../pidfd/pidfd.h" #ifndef PAGE_SIZE #define PAGE_SIZE 4096 #endif #define NUM_THREAD_SPAWN 128 /* Coredump fixture */ FIXTURE(coredump) { char original_core_pattern[256]; pid_t pid_coredump_server; int fd_tmpfs_detached; }; /* Shared helper function declarations */ void *do_nothing(void *arg); void crashing_child(void); int create_detached_tmpfs(void); int create_and_listen_unix_socket(const char *path); bool set_core_pattern(const char *pattern); int get_peer_pidfd(int fd); bool get_pidfd_info(int fd_peer_pidfd, struct pidfd_info *info); /* Inline helper that uses harness types */ static inline void wait_and_check_coredump_server(pid_t pid_coredump_server, struct __test_metadata *const _metadata, FIXTURE_DATA(coredump) *self) { int status; waitpid(pid_coredump_server, &status, 0); self->pid_coredump_server = -ESRCH; ASSERT_TRUE(WIFEXITED(status)); ASSERT_EQ(WEXITSTATUS(status), 0); } /* Protocol helper function declarations */ ssize_t recv_marker(int fd); bool read_marker(int fd, enum coredump_mark mark); bool read_coredump_req(int fd, struct coredump_req *req); bool send_coredump_ack(int fd, const struct coredump_req *req, __u64 mask, size_t size_ack); bool check_coredump_req(const struct coredump_req *req, size_t min_size, __u64 required_mask); int open_coredump_tmpfile(int fd_tmpfs_detached); void process_coredump_worker(int fd_coredump, int fd_peer_pidfd, int fd_core_file); #endif /* __COREDUMP_TEST_H */