dumpsys: build a fake switchframe for postmortem debugging.

reviewed by Frank van der Linden.
This commit is contained in:
yamt 2007-05-25 15:09:50 +00:00
parent 2d653f2875
commit 8e69ce0726
2 changed files with 25 additions and 7 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.S,v 1.24 2007/05/21 08:10:38 fvdl Exp $ */
/* $NetBSD: locore.S,v 1.25 2007/05/25 15:09:50 yamt Exp $ */
/*
* Copyright-o-rama!
@ -709,6 +709,26 @@ ENTRY(longjmp)
movl $1,%eax
ret
ENTRY(dumpsys)
# mimic cpu_switchto() for postmortem debugging.
# build a fake switch frame.
pushq %rbx
pushq %r12
pushq %r13
pushq %r14
pushq %r15
# save a context.
movq $dumppcb, %rax
movq %rsp, PCB_RSP(%rax)
movq %rbp, PCB_RBP(%rax)
call _C_LABEL(dodumpsys)
addq $(5*8), %rsp # sizeof(switchframe) - sizeof(%rip)
ret
/*
* struct lwp *cpu_switchto(struct lwp *, struct lwp *)
*

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.58 2007/05/21 08:10:38 fvdl Exp $ */
/* $NetBSD: machdep.c,v 1.59 2007/05/25 15:09:50 yamt Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2000, 2006, 2007
@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.58 2007/05/21 08:10:38 fvdl Exp $");
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.59 2007/05/25 15:09:50 yamt Exp $");
#include "opt_user_ldt.h"
#include "opt_ddb.h"
@ -230,6 +230,7 @@ int cpu_dump(void);
int cpu_dumpsize(void);
u_long cpu_dump_mempagecnt(void);
void dumpsys(void);
void dodumpsys(void);
void init_x86_64(paddr_t);
/*
@ -724,7 +725,7 @@ reserve_dumppages(vaddr_t p)
}
void
dumpsys(void)
dodumpsys(void)
{
const struct bdevsw *bdev;
u_long totalbytesleft, bytes, i, n, memseg;
@ -734,9 +735,6 @@ dumpsys(void)
int (*dump)(dev_t, daddr_t, void *, size_t);
int error;
/* Save registers. */
savectx(&dumppcb);
if (dumpdev == NODEV)
return;
bdev = bdevsw_lookup(dumpdev);