kern_shutdown.c revision 222865
1234370Sjasone/*-
2234370Sjasone * Copyright (c) 1986, 1988, 1991, 1993
3234370Sjasone *	The Regents of the University of California.  All rights reserved.
4234370Sjasone * (c) UNIX System Laboratories, Inc.
5234370Sjasone * All or some portions of this file are derived from material licensed
6234370Sjasone * to the University of California by American Telephone and Telegraph
7234370Sjasone * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8234370Sjasone * the permission of UNIX System Laboratories, Inc.
9234370Sjasone *
10234370Sjasone * Redistribution and use in source and binary forms, with or without
11234370Sjasone * modification, are permitted provided that the following conditions
12234370Sjasone * are met:
13234370Sjasone * 1. Redistributions of source code must retain the above copyright
14234370Sjasone *    notice, this list of conditions and the following disclaimer.
15234370Sjasone * 2. Redistributions in binary form must reproduce the above copyright
16234370Sjasone *    notice, this list of conditions and the following disclaimer in the
17234370Sjasone *    documentation and/or other materials provided with the distribution.
18234370Sjasone * 4. Neither the name of the University nor the names of its contributors
19234370Sjasone *    may be used to endorse or promote products derived from this software
20234370Sjasone *    without specific prior written permission.
21234370Sjasone *
22234370Sjasone * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23234370Sjasone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24234370Sjasone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25234370Sjasone * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26234370Sjasone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 *	@(#)kern_shutdown.c	8.3 (Berkeley) 1/21/94
35 */
36
37#include <sys/cdefs.h>
38__FBSDID("$FreeBSD: head/sys/kern/kern_shutdown.c 222865 2011-06-08 19:28:59Z attilio $");
39
40#include "opt_ddb.h"
41#include "opt_kdb.h"
42#include "opt_panic.h"
43#include "opt_show_busybufs.h"
44#include "opt_sched.h"
45#include "opt_watchdog.h"
46
47#include <sys/param.h>
48#include <sys/systm.h>
49#include <sys/bio.h>
50#include <sys/buf.h>
51#include <sys/conf.h>
52#include <sys/cons.h>
53#include <sys/eventhandler.h>
54#include <sys/jail.h>
55#include <sys/kdb.h>
56#include <sys/kernel.h>
57#include <sys/kerneldump.h>
58#include <sys/kthread.h>
59#include <sys/malloc.h>
60#include <sys/mount.h>
61#include <sys/priv.h>
62#include <sys/proc.h>
63#include <sys/reboot.h>
64#include <sys/resourcevar.h>
65#include <sys/sched.h>
66#include <sys/smp.h>
67#include <sys/sysctl.h>
68#include <sys/sysproto.h>
69#ifdef SW_WATCHDOG
70#include <sys/watchdog.h>
71#endif
72
73#include <ddb/ddb.h>
74
75#include <machine/cpu.h>
76#include <machine/pcb.h>
77#include <machine/smp.h>
78
79#include <security/mac/mac_framework.h>
80
81#include <vm/vm.h>
82#include <vm/vm_object.h>
83#include <vm/vm_page.h>
84#include <vm/vm_pager.h>
85#include <vm/swap_pager.h>
86
87#include <sys/signalvar.h>
88
89#ifndef PANIC_REBOOT_WAIT_TIME
90#define PANIC_REBOOT_WAIT_TIME 15 /* default to 15 seconds */
91#endif
92
93/*
94 * Note that stdarg.h and the ANSI style va_start macro is used for both
95 * ANSI and traditional C compilers.
96 */
97#include <machine/stdarg.h>
98
99#ifdef KDB
100#ifdef KDB_UNATTENDED
101int debugger_on_panic = 0;
102#else
103int debugger_on_panic = 1;
104#endif
105SYSCTL_INT(_debug, OID_AUTO, debugger_on_panic, CTLFLAG_RW | CTLFLAG_TUN,
106	&debugger_on_panic, 0, "Run debugger on kernel panic");
107TUNABLE_INT("debug.debugger_on_panic", &debugger_on_panic);
108
109#ifdef KDB_TRACE
110static int trace_on_panic = 1;
111#else
112static int trace_on_panic = 0;
113#endif
114SYSCTL_INT(_debug, OID_AUTO, trace_on_panic, CTLFLAG_RW | CTLFLAG_TUN,
115	&trace_on_panic, 0, "Print stack trace on kernel panic");
116TUNABLE_INT("debug.trace_on_panic", &trace_on_panic);
117#endif /* KDB */
118
119static int sync_on_panic = 0;
120SYSCTL_INT(_kern, OID_AUTO, sync_on_panic, CTLFLAG_RW | CTLFLAG_TUN,
121	&sync_on_panic, 0, "Do a sync before rebooting from a panic");
122TUNABLE_INT("kern.sync_on_panic", &sync_on_panic);
123
124SYSCTL_NODE(_kern, OID_AUTO, shutdown, CTLFLAG_RW, 0, "Shutdown environment");
125
126/*
127 * Variable panicstr contains argument to first call to panic; used as flag
128 * to indicate that the kernel has already called panic.
129 */
130const char *panicstr;
131
132int dumping;				/* system is dumping */
133int rebooting;				/* system is rebooting */
134static struct dumperinfo dumper;	/* our selected dumper */
135
136/* Context information for dump-debuggers. */
137static struct pcb dumppcb;		/* Registers. */
138static lwpid_t dumptid;			/* Thread ID. */
139
140static void poweroff_wait(void *, int);
141static void shutdown_halt(void *junk, int howto);
142static void shutdown_panic(void *junk, int howto);
143static void shutdown_reset(void *junk, int howto);
144
145/* register various local shutdown events */
146static void
147shutdown_conf(void *unused)
148{
149
150	EVENTHANDLER_REGISTER(shutdown_final, poweroff_wait, NULL,
151	    SHUTDOWN_PRI_FIRST);
152	EVENTHANDLER_REGISTER(shutdown_final, shutdown_halt, NULL,
153	    SHUTDOWN_PRI_LAST + 100);
154	EVENTHANDLER_REGISTER(shutdown_final, shutdown_panic, NULL,
155	    SHUTDOWN_PRI_LAST + 100);
156	EVENTHANDLER_REGISTER(shutdown_final, shutdown_reset, NULL,
157	    SHUTDOWN_PRI_LAST + 200);
158}
159
160SYSINIT(shutdown_conf, SI_SUB_INTRINSIC, SI_ORDER_ANY, shutdown_conf, NULL);
161
162/*
163 * The system call that results in a reboot.
164 */
165/* ARGSUSED */
166int
167reboot(struct thread *td, struct reboot_args *uap)
168{
169	int error;
170
171	error = 0;
172#ifdef MAC
173	error = mac_system_check_reboot(td->td_ucred, uap->opt);
174#endif
175	if (error == 0)
176		error = priv_check(td, PRIV_REBOOT);
177	if (error == 0) {
178		mtx_lock(&Giant);
179		kern_reboot(uap->opt);
180		mtx_unlock(&Giant);
181	}
182	return (error);
183}
184
185/*
186 * Called by events that want to shut down.. e.g  <CTL><ALT><DEL> on a PC
187 */
188static int shutdown_howto = 0;
189
190void
191shutdown_nice(int howto)
192{
193
194	shutdown_howto = howto;
195
196	/* Send a signal to init(8) and have it shutdown the world */
197	if (initproc != NULL) {
198		PROC_LOCK(initproc);
199		psignal(initproc, SIGINT);
200		PROC_UNLOCK(initproc);
201	} else {
202		/* No init(8) running, so simply reboot */
203		kern_reboot(RB_NOSYNC);
204	}
205	return;
206}
207static int	waittime = -1;
208
209static void
210print_uptime(void)
211{
212	int f;
213	struct timespec ts;
214
215	getnanouptime(&ts);
216	printf("Uptime: ");
217	f = 0;
218	if (ts.tv_sec >= 86400) {
219		printf("%ldd", (long)ts.tv_sec / 86400);
220		ts.tv_sec %= 86400;
221		f = 1;
222	}
223	if (f || ts.tv_sec >= 3600) {
224		printf("%ldh", (long)ts.tv_sec / 3600);
225		ts.tv_sec %= 3600;
226		f = 1;
227	}
228	if (f || ts.tv_sec >= 60) {
229		printf("%ldm", (long)ts.tv_sec / 60);
230		ts.tv_sec %= 60;
231		f = 1;
232	}
233	printf("%lds\n", (long)ts.tv_sec);
234}
235
236int
237doadump(boolean_t textdump)
238{
239	boolean_t coredump;
240
241	if (dumping)
242		return (EBUSY);
243	if (dumper.dumper == NULL)
244		return (ENXIO);
245
246	savectx(&dumppcb);
247	dumptid = curthread->td_tid;
248	dumping++;
249
250	coredump = TRUE;
251#ifdef DDB
252	if (textdump && textdump_pending) {
253		coredump = FALSE;
254		textdump_dumpsys(&dumper);
255	}
256#endif
257	if (coredump)
258		dumpsys(&dumper);
259
260	dumping--;
261	return (0);
262}
263
264static int
265isbufbusy(struct buf *bp)
266{
267	if (((bp->b_flags & (B_INVAL | B_PERSISTENT)) == 0 &&
268	    BUF_ISLOCKED(bp)) ||
269	    ((bp->b_flags & (B_DELWRI | B_INVAL)) == B_DELWRI))
270		return (1);
271	return (0);
272}
273
274/*
275 * Shutdown the system cleanly to prepare for reboot, halt, or power off.
276 */
277void
278kern_reboot(int howto)
279{
280	static int first_buf_printf = 1;
281
282#if defined(SMP)
283	/*
284	 * Bind us to CPU 0 so that all shutdown code runs there.  Some
285	 * systems don't shutdown properly (i.e., ACPI power off) if we
286	 * run on another processor.
287	 */
288	thread_lock(curthread);
289	sched_bind(curthread, 0);
290	thread_unlock(curthread);
291	KASSERT(PCPU_GET(cpuid) == 0, ("%s: not running on cpu 0", __func__));
292#endif
293	/* We're in the process of rebooting. */
294	rebooting = 1;
295
296	/* collect extra flags that shutdown_nice might have set */
297	howto |= shutdown_howto;
298
299	/* We are out of the debugger now. */
300	kdb_active = 0;
301
302	/*
303	 * Do any callouts that should be done BEFORE syncing the filesystems.
304	 */
305	EVENTHANDLER_INVOKE(shutdown_pre_sync, howto);
306
307	/*
308	 * Now sync filesystems
309	 */
310	if (!cold && (howto & RB_NOSYNC) == 0 && waittime < 0) {
311		register struct buf *bp;
312		int iter, nbusy, pbusy;
313#ifndef PREEMPTION
314		int subiter;
315#endif
316
317		waittime = 0;
318
319#ifdef SW_WATCHDOG
320		wdog_kern_pat(WD_LASTVAL);
321#endif
322		sync(curthread, NULL);
323
324		/*
325		 * With soft updates, some buffers that are
326		 * written will be remarked as dirty until other
327		 * buffers are written.
328		 */
329		for (iter = pbusy = 0; iter < 20; iter++) {
330			nbusy = 0;
331			for (bp = &buf[nbuf]; --bp >= buf; )
332				if (isbufbusy(bp))
333					nbusy++;
334			if (nbusy == 0) {
335				if (first_buf_printf)
336					printf("All buffers synced.");
337				break;
338			}
339			if (first_buf_printf) {
340				printf("Syncing disks, buffers remaining... ");
341				first_buf_printf = 0;
342			}
343			printf("%d ", nbusy);
344			if (nbusy < pbusy)
345				iter = 0;
346			pbusy = nbusy;
347#ifdef SW_WATCHDOG
348			wdog_kern_pat(WD_LASTVAL);
349#endif
350			sync(curthread, NULL);
351
352#ifdef PREEMPTION
353			/*
354			 * Drop Giant and spin for a while to allow
355			 * interrupt threads to run.
356			 */
357			DROP_GIANT();
358			DELAY(50000 * iter);
359			PICKUP_GIANT();
360#else
361			/*
362			 * Drop Giant and context switch several times to
363			 * allow interrupt threads to run.
364			 */
365			DROP_GIANT();
366			for (subiter = 0; subiter < 50 * iter; subiter++) {
367				thread_lock(curthread);
368				mi_switch(SW_VOL, NULL);
369				thread_unlock(curthread);
370				DELAY(1000);
371			}
372			PICKUP_GIANT();
373#endif
374		}
375		printf("\n");
376		/*
377		 * Count only busy local buffers to prevent forcing
378		 * a fsck if we're just a client of a wedged NFS server
379		 */
380		nbusy = 0;
381		for (bp = &buf[nbuf]; --bp >= buf; ) {
382			if (isbufbusy(bp)) {
383#if 0
384/* XXX: This is bogus.  We should probably have a BO_REMOTE flag instead */
385				if (bp->b_dev == NULL) {
386					TAILQ_REMOVE(&mountlist,
387					    bp->b_vp->v_mount, mnt_list);
388					continue;
389				}
390#endif
391				nbusy++;
392#if defined(SHOW_BUSYBUFS) || defined(DIAGNOSTIC)
393				printf(
394			    "%d: bufobj:%p, flags:%0x, blkno:%ld, lblkno:%ld\n",
395				    nbusy, bp->b_bufobj,
396				    bp->b_flags, (long)bp->b_blkno,
397				    (long)bp->b_lblkno);
398#endif
399			}
400		}
401		if (nbusy) {
402			/*
403			 * Failed to sync all blocks. Indicate this and don't
404			 * unmount filesystems (thus forcing an fsck on reboot).
405			 */
406			printf("Giving up on %d buffers\n", nbusy);
407			DELAY(5000000);	/* 5 seconds */
408		} else {
409			if (!first_buf_printf)
410				printf("Final sync complete\n");
411			/*
412			 * Unmount filesystems
413			 */
414			if (panicstr == 0)
415				vfs_unmountall();
416		}
417		swapoff_all();
418		DELAY(100000);		/* wait for console output to finish */
419	}
420
421	print_uptime();
422
423	/*
424	 * Ok, now do things that assume all filesystem activity has
425	 * been completed.
426	 */
427	EVENTHANDLER_INVOKE(shutdown_post_sync, howto);
428
429	if ((howto & (RB_HALT|RB_DUMP)) == RB_DUMP && !cold && !dumping)
430		doadump(TRUE);
431
432	/* Now that we're going to really halt the system... */
433	EVENTHANDLER_INVOKE(shutdown_final, howto);
434
435	for(;;) ;	/* safety against shutdown_reset not working */
436	/* NOTREACHED */
437}
438
439/*
440 * If the shutdown was a clean halt, behave accordingly.
441 */
442static void
443shutdown_halt(void *junk, int howto)
444{
445
446	if (howto & RB_HALT) {
447		printf("\n");
448		printf("The operating system has halted.\n");
449		printf("Please press any key to reboot.\n\n");
450		switch (cngetc()) {
451		case -1:		/* No console, just die */
452			cpu_halt();
453			/* NOTREACHED */
454		default:
455			howto &= ~RB_HALT;
456			break;
457		}
458	}
459}
460
461/*
462 * Check to see if the system paniced, pause and then reboot
463 * according to the specified delay.
464 */
465static void
466shutdown_panic(void *junk, int howto)
467{
468	int loop;
469
470	if (howto & RB_DUMP) {
471		if (PANIC_REBOOT_WAIT_TIME != 0) {
472			if (PANIC_REBOOT_WAIT_TIME != -1) {
473				printf("Automatic reboot in %d seconds - "
474				       "press a key on the console to abort\n",
475					PANIC_REBOOT_WAIT_TIME);
476				for (loop = PANIC_REBOOT_WAIT_TIME * 10;
477				     loop > 0; --loop) {
478					DELAY(1000 * 100); /* 1/10th second */
479					/* Did user type a key? */
480					if (cncheckc() != -1)
481						break;
482				}
483				if (!loop)
484					return;
485			}
486		} else { /* zero time specified - reboot NOW */
487			return;
488		}
489		printf("--> Press a key on the console to reboot,\n");
490		printf("--> or switch off the system now.\n");
491		cngetc();
492	}
493}
494
495/*
496 * Everything done, now reset
497 */
498static void
499shutdown_reset(void *junk, int howto)
500{
501
502	printf("Rebooting...\n");
503	DELAY(1000000);	/* wait 1 sec for printf's to complete and be read */
504
505	/*
506	 * Acquiring smp_ipi_mtx here has a double effect:
507	 * - it disables interrupts avoiding CPU0 preemption
508	 *   by fast handlers (thus deadlocking  against other CPUs)
509	 * - it avoids deadlocks against smp_rendezvous() or, more
510	 *   generally, threads busy-waiting, with this spinlock held,
511	 *   and waiting for responses by threads on other CPUs
512	 *   (ie. smp_tlb_shootdown()).
513	 *
514	 * For the !SMP case it just needs to handle the former problem.
515	 */
516#ifdef SMP
517	mtx_lock_spin(&smp_ipi_mtx);
518#else
519	spinlock_enter();
520#endif
521
522	/* cpu_boot(howto); */ /* doesn't do anything at the moment */
523	cpu_reset();
524	/* NOTREACHED */ /* assuming reset worked */
525}
526
527/*
528 * Panic is called on unresolvable fatal errors.  It prints "panic: mesg",
529 * and then reboots.  If we are called twice, then we avoid trying to sync
530 * the disks as this often leads to recursive panics.
531 */
532void
533panic(const char *fmt, ...)
534{
535#ifdef SMP
536	static volatile u_int panic_cpu = NOCPU;
537#endif
538	struct thread *td = curthread;
539	int bootopt, newpanic;
540	va_list ap;
541	static char buf[256];
542
543	critical_enter();
544#ifdef SMP
545	/*
546	 * We don't want multiple CPU's to panic at the same time, so we
547	 * use panic_cpu as a simple spinlock.  We have to keep checking
548	 * panic_cpu if we are spinning in case the panic on the first
549	 * CPU is canceled.
550	 */
551	if (panic_cpu != PCPU_GET(cpuid))
552		while (atomic_cmpset_int(&panic_cpu, NOCPU,
553		    PCPU_GET(cpuid)) == 0)
554			while (panic_cpu != NOCPU)
555				; /* nothing */
556#endif
557
558	bootopt = RB_AUTOBOOT;
559	newpanic = 0;
560	if (panicstr)
561		bootopt |= RB_NOSYNC;
562	else {
563		bootopt |= RB_DUMP;
564		panicstr = fmt;
565		newpanic = 1;
566	}
567
568	va_start(ap, fmt);
569	if (newpanic) {
570		(void)vsnprintf(buf, sizeof(buf), fmt, ap);
571		panicstr = buf;
572		printf("panic: %s\n", buf);
573	} else {
574		printf("panic: ");
575		vprintf(fmt, ap);
576		printf("\n");
577	}
578	va_end(ap);
579#ifdef SMP
580	printf("cpuid = %d\n", PCPU_GET(cpuid));
581#endif
582
583#ifdef KDB
584	if (newpanic && trace_on_panic)
585		kdb_backtrace();
586	if (debugger_on_panic)
587		kdb_enter(KDB_WHY_PANIC, "panic");
588#ifdef RESTARTABLE_PANICS
589	/* See if the user aborted the panic, in which case we continue. */
590	if (panicstr == NULL) {
591#ifdef SMP
592		atomic_store_rel_int(&panic_cpu, NOCPU);
593#endif
594		return;
595	}
596#endif
597#endif
598	/*thread_lock(td); */
599	td->td_flags |= TDF_INPANIC;
600	/* thread_unlock(td); */
601	if (!sync_on_panic)
602		bootopt |= RB_NOSYNC;
603	critical_exit();
604	kern_reboot(bootopt);
605}
606
607/*
608 * Support for poweroff delay.
609 *
610 * Please note that setting this delay too short might power off your machine
611 * before the write cache on your hard disk has been flushed, leading to
612 * soft-updates inconsistencies.
613 */
614#ifndef POWEROFF_DELAY
615# define POWEROFF_DELAY 5000
616#endif
617static int poweroff_delay = POWEROFF_DELAY;
618
619SYSCTL_INT(_kern_shutdown, OID_AUTO, poweroff_delay, CTLFLAG_RW,
620	&poweroff_delay, 0, "");
621
622static void
623poweroff_wait(void *junk, int howto)
624{
625
626	if (!(howto & RB_POWEROFF) || poweroff_delay <= 0)
627		return;
628	DELAY(poweroff_delay * 1000);
629}
630
631/*
632 * Some system processes (e.g. syncer) need to be stopped at appropriate
633 * points in their main loops prior to a system shutdown, so that they
634 * won't interfere with the shutdown process (e.g. by holding a disk buf
635 * to cause sync to fail).  For each of these system processes, register
636 * shutdown_kproc() as a handler for one of shutdown events.
637 */
638static int kproc_shutdown_wait = 60;
639SYSCTL_INT(_kern_shutdown, OID_AUTO, kproc_shutdown_wait, CTLFLAG_RW,
640    &kproc_shutdown_wait, 0, "");
641
642void
643kproc_shutdown(void *arg, int howto)
644{
645	struct proc *p;
646	int error;
647
648	if (panicstr)
649		return;
650
651	p = (struct proc *)arg;
652	printf("Waiting (max %d seconds) for system process `%s' to stop...",
653	    kproc_shutdown_wait, p->p_comm);
654	error = kproc_suspend(p, kproc_shutdown_wait * hz);
655
656	if (error == EWOULDBLOCK)
657		printf("timed out\n");
658	else
659		printf("done\n");
660}
661
662void
663kthread_shutdown(void *arg, int howto)
664{
665	struct thread *td;
666	int error;
667
668	if (panicstr)
669		return;
670
671	td = (struct thread *)arg;
672	printf("Waiting (max %d seconds) for system thread `%s' to stop...",
673	    kproc_shutdown_wait, td->td_name);
674	error = kthread_suspend(td, kproc_shutdown_wait * hz);
675
676	if (error == EWOULDBLOCK)
677		printf("timed out\n");
678	else
679		printf("done\n");
680}
681
682/* Registration of dumpers */
683int
684set_dumper(struct dumperinfo *di)
685{
686
687	if (di == NULL) {
688		bzero(&dumper, sizeof dumper);
689		return (0);
690	}
691	if (dumper.dumper != NULL)
692		return (EBUSY);
693	dumper = *di;
694	return (0);
695}
696
697/* Call dumper with bounds checking. */
698int
699dump_write(struct dumperinfo *di, void *virtual, vm_offset_t physical,
700    off_t offset, size_t length)
701{
702
703	if (length != 0 && (offset < di->mediaoffset ||
704	    offset - di->mediaoffset + length > di->mediasize)) {
705		printf("Attempt to write outside dump device boundaries.\n");
706		return (ENXIO);
707	}
708	return (di->dumper(di->priv, virtual, physical, offset, length));
709}
710
711void
712mkdumpheader(struct kerneldumpheader *kdh, char *magic, uint32_t archver,
713    uint64_t dumplen, uint32_t blksz)
714{
715
716	bzero(kdh, sizeof(*kdh));
717	strncpy(kdh->magic, magic, sizeof(kdh->magic));
718	strncpy(kdh->architecture, MACHINE_ARCH, sizeof(kdh->architecture));
719	kdh->version = htod32(KERNELDUMPVERSION);
720	kdh->architectureversion = htod32(archver);
721	kdh->dumplength = htod64(dumplen);
722	kdh->dumptime = htod64(time_second);
723	kdh->blocksize = htod32(blksz);
724	strncpy(kdh->hostname, prison0.pr_hostname, sizeof(kdh->hostname));
725	strncpy(kdh->versionstring, version, sizeof(kdh->versionstring));
726	if (panicstr != NULL)
727		strncpy(kdh->panicstring, panicstr, sizeof(kdh->panicstring));
728	kdh->parity = kerneldump_parity(kdh);
729}
730