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