dump.c revision e7cbe64f7a72dae5cb44f100db60ca88f3313c65
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * See the License for the specific language governing permissions
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * and limitations under the License.
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 * CDDL HEADER END
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Use is subject to license terms.
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#pragma ident "%Z%%M% %I% %E% SMI"
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt * Dump driver. Provides ioctls to get/set crash dump configuration.
a276e6d68606861b552140cbcc003f4af10626fcTom Gundersendump_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt if (ddi_create_minor_node(devi, "dump", S_IFCHR, 0, DDI_PSEUDO, NULL) ==
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flyktdump_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred, int *rvalp)
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt char *pathbuf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt size = ptob((uint64_t)physmem) / DUMP_COMPRESS_RATIO;
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.
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 dumpsize_in_pages = (physinstalled - obp_pages -
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt * Protect against vm vagaries.
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt size = ptob(dumpsize_in_pages) / DUMP_COMPRESS_RATIO;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if (copyout(&size, (void *)arg, sizeof (size)) < 0)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = copyoutstr(pathbuf, (void *)arg, MAXPATHLEN, NULL);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt if ((error = copyinstr((char *)arg, pathbuf, MAXPATHLEN,
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt NULL)) != 0 || (error = lookupname(pathbuf, UIO_SYSSPACE,
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt error = dumpinit(vp, pathbuf, cmd == DIOCTRYDEV);
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt 0, /* streamtab */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt 0, /* refcnt */
139b011ab81ccea1d51f09e0261a1c390115c6ffPatrik Flykt &mod_driverops, "crash dump driver %I%", &dump_ops,