Split out db_unwind_frame() so it can be used by DTrace.

Sponsored by:	ARM Ltd.
Differential Revision:	https://reviews.freebsd.org/D2741
This commit is contained in:
br 2015-06-11 12:47:13 +00:00
parent 3c07920f02
commit 94eac11428
4 changed files with 63 additions and 23 deletions

View File

@ -38,12 +38,7 @@ __FBSDID("$FreeBSD$");
#include <machine/armreg.h>
#include <machine/debug_monitor.h>
struct unwind_state {
uint64_t fp;
uint64_t sp;
uint64_t pc;
};
#include <machine/stack.h>
void
db_md_list_watchpoints()
@ -67,22 +62,6 @@ db_md_set_watchpoint(db_expr_t addr, db_expr_t size)
HW_BREAKPOINT_RW));
}
static int
db_unwind_frame(struct unwind_state *frame)
{
uint64_t fp = frame->fp;
if (fp == 0)
return -1;
frame->sp = fp + 0x10;
/* FP to previous frame (X29) */
frame->fp = *(uint64_t *)(fp);
/* LR (X30) */
frame->pc = *(uint64_t *)(fp + 8) - 4;
return (0);
}
static void
db_stack_trace_cmd(struct unwind_state *frame)
{
@ -95,7 +74,7 @@ db_stack_trace_cmd(struct unwind_state *frame)
uint64_t pc = frame->pc;
int ret;
ret = db_unwind_frame(frame);
ret = unwind_frame(frame);
if (ret < 0)
break;

52
sys/arm64/arm64/unwind.c Normal file
View File

@ -0,0 +1,52 @@
/*-
* Copyright (c) 2015 The FreeBSD Foundation
* All rights reserved.
*
* This software was developed by Semihalf under
* the sponsorship of the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <machine/stack.h>
int
unwind_frame(struct unwind_state *frame)
{
uint64_t fp;
fp = frame->fp;
if (fp == 0)
return (-1);
frame->sp = fp + 0x10;
/* FP to previous frame (X29) */
frame->fp = *(uint64_t *)(fp);
/* LR (X30) */
frame->pc = *(uint64_t *)(fp + 8) - 4;
return (0);
}

View File

@ -32,4 +32,12 @@
#define INKERNEL(va) \
((va) >= VM_MIN_KERNEL_ADDRESS && (va) <= VM_MAX_KERNEL_ADDRESS)
struct unwind_state {
uint64_t fp;
uint64_t sp;
uint64_t pc;
};
int unwind_frame(struct unwind_state *);
#endif /* !_MACHINE_STACK_H_ */

View File

@ -2,6 +2,7 @@
arm/arm/devmap.c standard
arm/arm/generic_timer.c standard
arm/arm/pmu.c standard
arm64/arm64/unwind.c optional ddb | kdtrace_hooks
arm64/arm64/autoconf.c standard
arm64/arm64/bcopy.c standard
arm64/arm64/bus_machdep.c standard