1174195Srwatson/*-
2174195Srwatson * Copyright (c) 2005 Antoine Brodin
3174195Srwatson * All rights reserved.
4174195Srwatson *
5174195Srwatson * Redistribution and use in source and binary forms, with or without
6174195Srwatson * modification, are permitted provided that the following conditions
7174195Srwatson * are met:
8174195Srwatson * 1. Redistributions of source code must retain the above copyright
9174195Srwatson *    notice, this list of conditions and the following disclaimer.
10174195Srwatson * 2. Redistributions in binary form must reproduce the above copyright
11174195Srwatson *    notice, this list of conditions and the following disclaimer in the
12174195Srwatson *    documentation and/or other materials provided with the distribution.
13174195Srwatson *
14174195Srwatson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15174195Srwatson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16174195Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17174195Srwatson * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18174195Srwatson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19174195Srwatson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20174195Srwatson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21174195Srwatson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22174195Srwatson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23174195Srwatson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24174195Srwatson * SUCH DAMAGE.
25174195Srwatson */
26174195Srwatson
27174195Srwatson#include <sys/cdefs.h>
28174195Srwatson__FBSDID("$FreeBSD$");
29174195Srwatson
30174195Srwatson#include <sys/systm.h>
31174195Srwatson#include <sys/param.h>
32174195Srwatson#include <sys/proc.h>
33174195Srwatson#include <sys/stack.h>
34174195Srwatson
35174195Srwatson#include <machine/vmparam.h>
36174195Srwatson#include <machine/pcb.h>
37174195Srwatson#include <machine/stack.h>
38174195Srwatson
39174195Srwatsonstatic void
40174195Srwatsonstack_capture(struct stack *st, u_int32_t *frame)
41174195Srwatson{
42174195Srwatson	vm_offset_t callpc;
43174195Srwatson
44174195Srwatson	stack_zero(st);
45174195Srwatson	while (1) {
46174195Srwatson		if (!INKERNEL(frame))
47174195Srwatson			break;
48174195Srwatson		callpc = frame[FR_SCP];
49174195Srwatson		if (stack_put(st, callpc) == -1)
50174195Srwatson			break;
51174195Srwatson		frame = (u_int32_t *)(frame[FR_RFP]);
52174195Srwatson	}
53174195Srwatson}
54174195Srwatson
55174195Srwatsonvoid
56174195Srwatsonstack_save_td(struct stack *st, struct thread *td)
57174195Srwatson{
58174195Srwatson	u_int32_t *frame;
59174195Srwatson
60174195Srwatson	if (TD_IS_SWAPPED(td))
61174195Srwatson		panic("stack_save_td: swapped");
62174195Srwatson	if (TD_IS_RUNNING(td))
63174195Srwatson		panic("stack_save_td: running");
64174195Srwatson
65174195Srwatson	frame = (u_int32_t *)td->td_pcb->un_32.pcb32_r11;
66174195Srwatson	stack_capture(st, frame);
67174195Srwatson}
68174195Srwatson
69174195Srwatsonvoid
70174195Srwatsonstack_save(struct stack *st)
71174195Srwatson{
72174195Srwatson	u_int32_t *frame;
73174195Srwatson
74174195Srwatson	frame = (u_int32_t *)__builtin_frame_address(0);
75174195Srwatson	stack_capture(st, frame);
76174195Srwatson}
77