mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-20 23:35:02 +00:00
- DDB -> KDB, with kdb routines
- ddb -> db for low-level trapcode - implement makectx. I think it only matters that the stack is setup correctly. - bring over ddb_trap_glue and rename to db_trap_glue
This commit is contained in:
parent
def828503c
commit
20d21fe9ef
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132073
|
@ -57,13 +57,13 @@
|
|||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_compat.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_msgbuf.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kdb.h>
|
||||
#include <sys/eventhandler.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/sysproto.h>
|
||||
|
@ -110,10 +110,11 @@ __FBSDID("$FreeBSD$");
|
|||
#include <machine/trap.h>
|
||||
#include <machine/powerpc.h>
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <ddb/ddb.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <machine/sigframe.h>
|
||||
|
||||
#include <ddb/ddb.h>
|
||||
|
||||
int cold = 1;
|
||||
|
||||
char pcpu0[PAGE_SIZE];
|
||||
|
@ -133,11 +134,6 @@ static int cacheline_size = CACHELINESIZE;
|
|||
SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
|
||||
CTLFLAG_RD, &cacheline_size, 0, "");
|
||||
|
||||
#ifdef DDB
|
||||
/* start and end of kernel symbol table */
|
||||
void *ksym_start, *ksym_end;
|
||||
#endif /* DDB */
|
||||
|
||||
static void cpu_startup(void *);
|
||||
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
|
||||
|
||||
|
@ -239,7 +235,7 @@ extern void *alitrap, *alisize;
|
|||
extern void *dsitrap, *dsisize;
|
||||
extern void *decrint, *decrsize;
|
||||
extern void *extint, *extsize;
|
||||
extern void *ddblow, *ddbsize;
|
||||
extern void *dblow, *dbsize;
|
||||
|
||||
void
|
||||
powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
||||
|
@ -305,12 +301,14 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
printf("powerpc_init: no loader metadata.\n");
|
||||
}
|
||||
|
||||
#ifdef DDB
|
||||
kdb_init();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX: Initialize the interrupt tables.
|
||||
* Disable translation in case the vector area
|
||||
* hasn't been mapped (G5)
|
||||
*/
|
||||
mtmsr(mfmsr() & ~(PSL_IR | PSL_DR));
|
||||
bcopy(&trapcode, (void *)EXC_RST, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_MCHK, (size_t)&trapsize);
|
||||
bcopy(&dsitrap, (void *)EXC_DSI, (size_t)&dsisize);
|
||||
|
@ -325,10 +323,12 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
bcopy(&trapcode, (void *)EXC_FPA, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_THRM, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_BPT, (size_t)&trapsize);
|
||||
#ifdef DDB
|
||||
bcopy(&ddblow, (void *)EXC_PGM, (size_t)&ddbsize);
|
||||
bcopy(&ddblow, (void *)EXC_TRC, (size_t)&ddbsize);
|
||||
bcopy(&ddblow, (void *)EXC_BPT, (size_t)&ddbsize);
|
||||
#ifdef KDB
|
||||
bcopy(&dblow, (void *)EXC_RST, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_MCHK, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_PGM, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_TRC, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_BPT, (size_t)&dbsize);
|
||||
#endif
|
||||
__syncicache(EXC_RSVD, EXC_LAST - EXC_RSVD);
|
||||
|
||||
|
@ -360,6 +360,11 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE)
|
||||
pmap_kenter((vm_offset_t)msgbufp + off, msgbuf_phys + off);
|
||||
msgbufinit(msgbufp, MSGBUF_SIZE);
|
||||
|
||||
#ifdef KDB
|
||||
if (boothowto & RB_KDB)
|
||||
kdb_enter("Boot flags requested debugger");
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -570,6 +575,21 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap)
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Construct a PCB from a trapframe. This is called from kdb_trap() where
|
||||
* we want to start a backtrace from the function that caused us to enter
|
||||
* the debugger. We have the context in the trapframe, but base the trace
|
||||
* on the PCB. The PCB doesn't have to be perfect, as long as it contains
|
||||
* enough for a backtrace.
|
||||
*/
|
||||
void
|
||||
makectx(struct trapframe *tf, struct pcb *pcb)
|
||||
{
|
||||
|
||||
pcb->pcb_lr = tf->srr0;
|
||||
pcb->pcb_sp = tf->fixreg[1];
|
||||
}
|
||||
|
||||
/*
|
||||
* get_mcontext/sendsig helper routine that doesn't touch the
|
||||
* proc lock
|
||||
|
@ -741,15 +761,6 @@ exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
|||
td->td_pcb->pcb_flags = 0;
|
||||
}
|
||||
|
||||
#if !defined(DDB)
|
||||
void
|
||||
Debugger(const char *msg)
|
||||
{
|
||||
|
||||
printf("Debugger(\"%s\") called.\n", msg);
|
||||
}
|
||||
#endif /* !defined(DDB) */
|
||||
|
||||
/* XXX: dummy {fill,set}_[fp]regs */
|
||||
int
|
||||
fill_regs(struct thread *td, struct reg *regs)
|
||||
|
@ -853,3 +864,23 @@ asm_panic(char *pstr)
|
|||
{
|
||||
panic(pstr);
|
||||
}
|
||||
|
||||
int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */
|
||||
|
||||
int
|
||||
db_trap_glue(struct trapframe *frame)
|
||||
{
|
||||
if (!(frame->srr1 & PSL_PR)
|
||||
&& (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
|
||||
|| (frame->exc == EXC_PGM
|
||||
&& (frame->srr1 & 0x20000))
|
||||
|| frame->exc == EXC_BPT)) {
|
||||
int type = frame->exc;
|
||||
if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
|
||||
type = T_BREAKPOINT;
|
||||
}
|
||||
return (kdb_trap(type, 0, frame));
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
|
@ -57,13 +57,13 @@
|
|||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_ddb.h"
|
||||
#include "opt_compat.h"
|
||||
#include "opt_kstack_pages.h"
|
||||
#include "opt_msgbuf.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kdb.h>
|
||||
#include <sys/eventhandler.h>
|
||||
#include <sys/imgact.h>
|
||||
#include <sys/sysproto.h>
|
||||
|
@ -110,10 +110,11 @@ __FBSDID("$FreeBSD$");
|
|||
#include <machine/trap.h>
|
||||
#include <machine/powerpc.h>
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <ddb/ddb.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <machine/sigframe.h>
|
||||
|
||||
#include <ddb/ddb.h>
|
||||
|
||||
int cold = 1;
|
||||
|
||||
char pcpu0[PAGE_SIZE];
|
||||
|
@ -133,11 +134,6 @@ static int cacheline_size = CACHELINESIZE;
|
|||
SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
|
||||
CTLFLAG_RD, &cacheline_size, 0, "");
|
||||
|
||||
#ifdef DDB
|
||||
/* start and end of kernel symbol table */
|
||||
void *ksym_start, *ksym_end;
|
||||
#endif /* DDB */
|
||||
|
||||
static void cpu_startup(void *);
|
||||
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
|
||||
|
||||
|
@ -239,7 +235,7 @@ extern void *alitrap, *alisize;
|
|||
extern void *dsitrap, *dsisize;
|
||||
extern void *decrint, *decrsize;
|
||||
extern void *extint, *extsize;
|
||||
extern void *ddblow, *ddbsize;
|
||||
extern void *dblow, *dbsize;
|
||||
|
||||
void
|
||||
powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
||||
|
@ -305,12 +301,14 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
printf("powerpc_init: no loader metadata.\n");
|
||||
}
|
||||
|
||||
#ifdef DDB
|
||||
kdb_init();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX: Initialize the interrupt tables.
|
||||
* Disable translation in case the vector area
|
||||
* hasn't been mapped (G5)
|
||||
*/
|
||||
mtmsr(mfmsr() & ~(PSL_IR | PSL_DR));
|
||||
bcopy(&trapcode, (void *)EXC_RST, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_MCHK, (size_t)&trapsize);
|
||||
bcopy(&dsitrap, (void *)EXC_DSI, (size_t)&dsisize);
|
||||
|
@ -325,10 +323,12 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
bcopy(&trapcode, (void *)EXC_FPA, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_THRM, (size_t)&trapsize);
|
||||
bcopy(&trapcode, (void *)EXC_BPT, (size_t)&trapsize);
|
||||
#ifdef DDB
|
||||
bcopy(&ddblow, (void *)EXC_PGM, (size_t)&ddbsize);
|
||||
bcopy(&ddblow, (void *)EXC_TRC, (size_t)&ddbsize);
|
||||
bcopy(&ddblow, (void *)EXC_BPT, (size_t)&ddbsize);
|
||||
#ifdef KDB
|
||||
bcopy(&dblow, (void *)EXC_RST, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_MCHK, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_PGM, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_TRC, (size_t)&dbsize);
|
||||
bcopy(&dblow, (void *)EXC_BPT, (size_t)&dbsize);
|
||||
#endif
|
||||
__syncicache(EXC_RSVD, EXC_LAST - EXC_RSVD);
|
||||
|
||||
|
@ -360,6 +360,11 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
|
|||
for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE)
|
||||
pmap_kenter((vm_offset_t)msgbufp + off, msgbuf_phys + off);
|
||||
msgbufinit(msgbufp, MSGBUF_SIZE);
|
||||
|
||||
#ifdef KDB
|
||||
if (boothowto & RB_KDB)
|
||||
kdb_enter("Boot flags requested debugger");
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -570,6 +575,21 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap)
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Construct a PCB from a trapframe. This is called from kdb_trap() where
|
||||
* we want to start a backtrace from the function that caused us to enter
|
||||
* the debugger. We have the context in the trapframe, but base the trace
|
||||
* on the PCB. The PCB doesn't have to be perfect, as long as it contains
|
||||
* enough for a backtrace.
|
||||
*/
|
||||
void
|
||||
makectx(struct trapframe *tf, struct pcb *pcb)
|
||||
{
|
||||
|
||||
pcb->pcb_lr = tf->srr0;
|
||||
pcb->pcb_sp = tf->fixreg[1];
|
||||
}
|
||||
|
||||
/*
|
||||
* get_mcontext/sendsig helper routine that doesn't touch the
|
||||
* proc lock
|
||||
|
@ -741,15 +761,6 @@ exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
|
|||
td->td_pcb->pcb_flags = 0;
|
||||
}
|
||||
|
||||
#if !defined(DDB)
|
||||
void
|
||||
Debugger(const char *msg)
|
||||
{
|
||||
|
||||
printf("Debugger(\"%s\") called.\n", msg);
|
||||
}
|
||||
#endif /* !defined(DDB) */
|
||||
|
||||
/* XXX: dummy {fill,set}_[fp]regs */
|
||||
int
|
||||
fill_regs(struct thread *td, struct reg *regs)
|
||||
|
@ -853,3 +864,23 @@ asm_panic(char *pstr)
|
|||
{
|
||||
panic(pstr);
|
||||
}
|
||||
|
||||
int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */
|
||||
|
||||
int
|
||||
db_trap_glue(struct trapframe *frame)
|
||||
{
|
||||
if (!(frame->srr1 & PSL_PR)
|
||||
&& (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
|
||||
|| (frame->exc == EXC_PGM
|
||||
&& (frame->srr1 & 0x20000))
|
||||
|| frame->exc == EXC_BPT)) {
|
||||
int type = frame->exc;
|
||||
if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
|
||||
type = T_BREAKPOINT;
|
||||
}
|
||||
return (kdb_trap(type, 0, frame));
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue