833c95456a
Many devices run firmware and/or complex hardware, and most of that can have bugs. When it misbehaves, however, it is often much harder to debug than software running on the host. Introduce a "device coredump" mechanism to allow dumping internal device/firmware state through a generalized mechanism. As devices are different and information needed can vary accordingly, this doesn't prescribe a file format - it just provides mechanism to get data to be able to capture it in a generalized way (e.g. in distributions.) The dumped data will be readable in sysfs in the virtual device's data file under /sys/class/devcoredump/devcd*/. Writing to it will free the data and remove the device, as does a 5-minute timeout. Note that generalized capturing of such data may result in privacy issues, so users generally need to be involved. In order to allow certain users/system integrators/... to disable the feature at all, introduce a Kconfig option to override the drivers that would like to have the feature. For now, this provides two ways of dumping data: 1) with a vmalloc'ed area, that is then given to the subsystem and freed after retrieval or timeout 2) with a generalized reader/free function method We could/should add more options, e.g. a list of pages, since the vmalloc area is very limited on some architectures. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
35 lines
986 B
C
35 lines
986 B
C
#ifndef __DEVCOREDUMP_H
|
|
#define __DEVCOREDUMP_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/module.h>
|
|
#include <linux/vmalloc.h>
|
|
|
|
#ifdef CONFIG_DEV_COREDUMP
|
|
void dev_coredumpv(struct device *dev, const void *data, size_t datalen,
|
|
gfp_t gfp);
|
|
|
|
void dev_coredumpm(struct device *dev, struct module *owner,
|
|
const void *data, size_t datalen, gfp_t gfp,
|
|
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
|
|
const void *data, size_t datalen),
|
|
void (*free)(const void *data));
|
|
#else
|
|
static inline void dev_coredumpv(struct device *dev, const void *data,
|
|
size_t datalen, gfp_t gfp)
|
|
{
|
|
vfree(data);
|
|
}
|
|
|
|
static inline void
|
|
dev_coredumpm(struct device *dev, struct module *owner,
|
|
const void *data, size_t datalen, gfp_t gfp,
|
|
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
|
|
const void *data, size_t datalen),
|
|
void (*free)(const void *data))
|
|
{
|
|
free(data);
|
|
}
|
|
#endif /* CONFIG_DEV_COREDUMP */
|
|
|
|
#endif /* __DEVCOREDUMP_H */
|