master
  1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  2
  3#ifndef _LINUX_COREDUMP_H
  4#define _LINUX_COREDUMP_H
  5
  6#include <linux/types.h>
  7
  8/**
  9 * coredump_{req,ack} flags
 10 * @COREDUMP_KERNEL: kernel writes coredump
 11 * @COREDUMP_USERSPACE: userspace writes coredump
 12 * @COREDUMP_REJECT: don't generate coredump
 13 * @COREDUMP_WAIT: wait for coredump server
 14 */
 15enum {
 16	COREDUMP_KERNEL		= (1ULL << 0),
 17	COREDUMP_USERSPACE	= (1ULL << 1),
 18	COREDUMP_REJECT		= (1ULL << 2),
 19	COREDUMP_WAIT		= (1ULL << 3),
 20};
 21
 22/**
 23 * struct coredump_req - message kernel sends to userspace
 24 * @size: size of struct coredump_req
 25 * @size_ack: known size of struct coredump_ack on this kernel
 26 * @mask: supported features
 27 *
 28 * When a coredump happens the kernel will connect to the coredump
 29 * socket and send a coredump request to the coredump server. The @size
 30 * member is set to the size of struct coredump_req and provides a hint
 31 * to userspace how much data can be read. Userspace may use MSG_PEEK to
 32 * peek the size of struct coredump_req and then choose to consume it in
 33 * one go. Userspace may also simply read a COREDUMP_ACK_SIZE_VER0
 34 * request. If the size the kernel sends is larger userspace simply
 35 * discards any remaining data.
 36 *
 37 * The coredump_req->mask member is set to the currently know features.
 38 * Userspace may only set coredump_ack->mask to the bits raised by the
 39 * kernel in coredump_req->mask.
 40 *
 41 * The coredump_req->size_ack member is set by the kernel to the size of
 42 * struct coredump_ack the kernel knows. Userspace may only send up to
 43 * coredump_req->size_ack bytes to the kernel and must set
 44 * coredump_ack->size accordingly.
 45 */
 46struct coredump_req {
 47	__u32 size;
 48	__u32 size_ack;
 49	__u64 mask;
 50};
 51
 52enum {
 53	COREDUMP_REQ_SIZE_VER0 = 16U, /* size of first published struct */
 54};
 55
 56/**
 57 * struct coredump_ack - message userspace sends to kernel
 58 * @size: size of the struct
 59 * @spare: unused
 60 * @mask: features kernel is supposed to use
 61 *
 62 * The @size member must be set to the size of struct coredump_ack. It
 63 * may never exceed what the kernel returned in coredump_req->size_ack
 64 * but it may of course be smaller (>= COREDUMP_ACK_SIZE_VER0 and <=
 65 * coredump_req->size_ack).
 66 *
 67 * The @mask member must be set to the features the coredump server
 68 * wants the kernel to use. Only bits the kernel returned in
 69 * coredump_req->mask may be set.
 70 */
 71struct coredump_ack {
 72	__u32 size;
 73	__u32 spare;
 74	__u64 mask;
 75};
 76
 77enum {
 78	COREDUMP_ACK_SIZE_VER0 = 16U, /* size of first published struct */
 79};
 80
 81/**
 82 * enum coredump_mark - Markers for the coredump socket
 83 *
 84 * The kernel will place a single byte on the coredump socket. The
 85 * markers notify userspace whether the coredump ack succeeded or
 86 * failed.
 87 *
 88 * @COREDUMP_MARK_MINSIZE: the provided coredump_ack size was too small
 89 * @COREDUMP_MARK_MAXSIZE: the provided coredump_ack size was too big
 90 * @COREDUMP_MARK_UNSUPPORTED: the provided coredump_ack mask was invalid
 91 * @COREDUMP_MARK_CONFLICTING: the provided coredump_ack mask has conflicting options
 92 * @COREDUMP_MARK_REQACK: the coredump request and ack was successful
 93 * @__COREDUMP_MARK_MAX: the maximum coredump mark value
 94 */
 95enum coredump_mark {
 96	COREDUMP_MARK_REQACK		= 0U,
 97	COREDUMP_MARK_MINSIZE		= 1U,
 98	COREDUMP_MARK_MAXSIZE		= 2U,
 99	COREDUMP_MARK_UNSUPPORTED	= 3U,
100	COREDUMP_MARK_CONFLICTING	= 4U,
101	__COREDUMP_MARK_MAX		= (1U << 31),
102};
103
104#endif /* _LINUX_COREDUMP_H */