dump.c revision e7cbe64f7a72dae5cb44f100db60ca88f3313c65
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt/*
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * CDDL HEADER START
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * The contents of this file are subject to the terms of the
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Common Development and Distribution License (the "License").
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * You may not use this file except in compliance with the License.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * or http://www.opensolaris.org/os/licensing.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * See the License for the specific language governing permissions
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * and limitations under the License.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * When distributing Covered Code, include this CDDL HEADER in each
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * If applicable, add the following below this CDDL HEADER, with the
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * fields enclosed by brackets "[]" replaced with your own identifying
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * information: Portions Copyright [yyyy] [name of copyright owner]
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * CDDL HEADER END
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt/*
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Use is subject to license terms.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#pragma ident "%Z%%M% %I% %E% SMI"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen/*
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Dump driver. Provides ioctls to get/set crash dump configuration.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <sys/types.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/param.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/systm.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <sys/vnode.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/uio.h>
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen#include <sys/cred.h>
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen#include <sys/kmem.h>
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen#include <sys/errno.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/modctl.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/dumphdr.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/dumpadm.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/pathname.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/file.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <vm/anon.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/stat.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/conf.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <sys/ddi.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt#include <sys/sunddi.h>
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersenstatic dev_info_t *dump_devi;
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersenstatic int
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersendump_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen{
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersen if (cmd != DDI_ATTACH)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_FAILURE);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt if (ddi_create_minor_node(devi, "dump", S_IFCHR, 0, DDI_PSEUDO, NULL) ==
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt DDI_FAILURE) {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt ddi_remove_minor_node(devi, NULL);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_FAILURE);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt }
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dump_devi = devi;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_SUCCESS);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktstatic int
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt if (cmd != DDI_DETACH)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_FAILURE);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt ddi_remove_minor_node(devi, NULL);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_SUCCESS);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt/*ARGSUSED*/
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktstatic int
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt switch (infocmd) {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt case DDI_INFO_DEVT2DEVINFO:
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *result = dump_devi;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_SUCCESS);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt case DDI_INFO_DEVT2INSTANCE:
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt *result = 0;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_SUCCESS);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt }
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (DDI_FAILURE);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt/*ARGSUSED*/
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktint
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred, int *rvalp)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt uint64_t size;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt uint64_t dumpsize_in_pages;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt int error = 0;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt char *pathbuf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt vnode_t *vp;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt switch (cmd) {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt case DIOCGETDUMPSIZE:
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt if (dump_conflags & DUMP_ALL)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt size = ptob((uint64_t)physmem) / DUMP_COMPRESS_RATIO;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt else {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt /*
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * We can't give a good answer for the DUMP_CURPROC
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * because we won't know which process to use until it
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * causes a panic. We'll therefore punt and give the
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * caller the size for the kernel.
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt *
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * This kernel size equation takes care of the
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * boot time kernel footprint and also accounts
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * for availrmem changes due to user explicit locking.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Refer to common/vm/vm_page.c for an explanation
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * of these counters.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dumpsize_in_pages = (physinstalled - obp_pages -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt availrmem -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt anon_segkp_pages_locked -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt k_anoninfo.ani_mem_resv -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt segvn_pages_locked -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt pages_locked -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt pages_claimed -
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt pages_useclaim);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt /*
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * Protect against vm vagaries.
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (dumpsize_in_pages > (uint64_t)physmem)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt dumpsize_in_pages = (uint64_t)physmem;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt size = ptob(dumpsize_in_pages) / DUMP_COMPRESS_RATIO;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt }
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (copyout(&size, (void *)arg, sizeof (size)) < 0)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = EFAULT;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCGETCONF:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_enter(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt *rvalp = dump_conflags;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (dumpvp && !(dumpvp->v_flag & VISSWAP))
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt *rvalp |= DUMP_EXCL;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_exit(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCSETCONF:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_enter(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (arg == DUMP_KERNEL || arg == DUMP_ALL ||
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt arg == DUMP_CURPROC)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt dump_conflags = arg;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt else
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = EINVAL;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_exit(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCGETDEV:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_enter(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (dumppath == NULL) {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_exit(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = ENODEV;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt }
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt (void) strcpy(pathbuf, dumppath);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_exit(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = copyoutstr(pathbuf, (void *)arg, MAXPATHLEN, NULL);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCSETDEV:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCTRYDEV:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if ((error = copyinstr((char *)arg, pathbuf, MAXPATHLEN,
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt NULL)) != 0 || (error = lookupname(pathbuf, UIO_SYSSPACE,
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt FOLLOW, NULLVPP, &vp)) != 0)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_enter(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (vp->v_type == VBLK)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = dumpinit(vp, pathbuf, cmd == DIOCTRYDEV);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt else
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = ENOTBLK;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_exit(&dump_lock);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt VN_RELE(vp);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt break;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt case DIOCDUMP:
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt mutex_enter(&dump_lock);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt if (dumpvp == NULL)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt error = ENODEV;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt else if (dumpvp->v_flag & VISSWAP)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt error = EBUSY;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt else
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dumpsys();
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt mutex_exit(&dump_lock);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt break;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt default:
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt error = ENXIO;
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt }
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt kmem_free(pathbuf, MAXPATHLEN);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (error);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktstruct cb_ops dump_cb_ops = {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt nulldev, /* open */
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt nulldev, /* close */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* strategy */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* print */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* dump */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* read */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* write */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dump_ioctl, /* ioctl */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* devmap */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* mmap */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* segmap */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nochpoll, /* poll */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt ddi_prop_op, /* prop_op */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt 0, /* streamtab */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt D_NEW|D_MP /* Driver compatibility flag */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt};
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktstruct dev_ops dump_ops = {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt DEVO_REV, /* devo_rev, */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt 0, /* refcnt */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dump_info, /* info */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nulldev, /* identify */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nulldev, /* probe */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dump_attach, /* attach */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt dump_detach, /* detach */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt nodev, /* reset */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt &dump_cb_ops, /* driver operations */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt (struct bus_ops *)0 /* bus operations */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt};
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktstatic struct modldrv modldrv = {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt &mod_driverops, "crash dump driver %I%", &dump_ops,
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt};
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktstatic struct modlinkage modlinkage = {
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt MODREV_1, (void *)&modldrv, NULL
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt};
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktint
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt_init(void)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (mod_install(&modlinkage));
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktint
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt_fini(void)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (mod_remove(&modlinkage));
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktint
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt_info(struct modinfo *modinfop)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt{
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt return (mod_info(&modlinkage, modinfop));
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt}
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt