arch/x86/kernel/cpu/mce/dev-mcelog.c

Source file repositories/reference/linux-study-clean/arch/x86/kernel/cpu/mce/dev-mcelog.c

File Facts

System
Linux kernel
Corpus path
arch/x86/kernel/cpu/mce/dev-mcelog.c
Extension
.c
Size
8288 bytes
Lines
366
Domain
Architecture Layer
Bucket
arch/x86
Inferred role
Architecture Layer: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct file_operations mce_chrdev_ops = {
	.open			= mce_chrdev_open,
	.release		= mce_chrdev_release,
	.read			= mce_chrdev_read,
	.write			= mce_chrdev_write,
	.poll			= mce_chrdev_poll,
	.unlocked_ioctl		= mce_chrdev_ioctl,
	.compat_ioctl		= compat_ptr_ioctl,
};

static struct miscdevice mce_chrdev_device = {
	MISC_MCELOG_MINOR,
	"mcelog",
	&mce_chrdev_ops,
};

static __init int dev_mcelog_init_device(void)
{
	int mce_log_len;
	int err;

	mce_log_len = max(MCE_LOG_MIN_LEN, num_online_cpus());
	mcelog = kzalloc_flex(*mcelog, entry, mce_log_len);
	if (!mcelog)
		return -ENOMEM;

	memcpy(mcelog->signature, MCE_LOG_SIGNATURE, sizeof(mcelog->signature));
	mcelog->len = mce_log_len;
	mcelog->recordlen = sizeof(struct mce);

	/* register character device /dev/mcelog */
	err = misc_register(&mce_chrdev_device);
	if (err) {
		if (err == -EBUSY)
			/* Xen dom0 might have registered the device already. */
			pr_info("Unable to init device /dev/mcelog, already registered");
		else
			pr_err("Unable to init device /dev/mcelog (rc: %d)\n", err);

		kfree(mcelog);
		return err;
	}

	mce_register_decode_chain(&dev_mcelog_nb);
	return 0;
}
device_initcall_sync(dev_mcelog_init_device);

Annotation

Implementation Notes