003 File Manager
Current Path:
/usr/src/sys/mips/mips
usr
/
src
/
sys
/
mips
/
mips
/
📁
..
📄
autoconf.c
(3.38 KB)
📄
bcopy.S
(6.4 KB)
📄
bus_space_generic.c
(17.44 KB)
📄
busdma_machdep.c
(40.9 KB)
📄
cache.c
(11.76 KB)
📄
cache_mipsNN.c
(28.85 KB)
📄
cpu.c
(15.33 KB)
📄
db_disasm.c
(10.94 KB)
📄
db_interface.c
(8.46 KB)
📄
db_trace.c
(11.38 KB)
📄
dump_machdep.c
(1.89 KB)
📄
elf_machdep.c
(12.77 KB)
📄
elf_trampoline.c
(5.67 KB)
📄
exception.S
(33.09 KB)
📄
fp.S
(78.42 KB)
📄
freebsd32_machdep.c
(12.66 KB)
📄
gdb_machdep.c
(6.65 KB)
📄
genassym.c
(8.92 KB)
📄
in_cksum.c
(6.37 KB)
📄
inckern.S
(1.62 KB)
📄
intr_machdep.c
(7.67 KB)
📄
libkern_machdep.c
(1.67 KB)
📄
locore.S
(5.93 KB)
📄
machdep.c
(14.16 KB)
📄
mem.c
(4.57 KB)
📄
minidump_machdep.c
(8.27 KB)
📄
mips_pic.c
(17.28 KB)
📄
mp_machdep.c
(7.73 KB)
📄
mpboot.S
(2.71 KB)
📄
nexus.c
(16.24 KB)
📄
octeon_cop2.c
(2.12 KB)
📄
octeon_cop2_swtch.S
(7.38 KB)
📄
ofw_machdep.c
(2.28 KB)
📄
pm_machdep.c
(13.79 KB)
📄
pmap.c
(90.48 KB)
📄
ptrace_machdep.c
(1.6 KB)
📄
sc_machdep.c
(2.21 KB)
📄
stack_machdep.c
(4.37 KB)
📄
stdatomic.c
(11.64 KB)
📄
support.S
(20.36 KB)
📄
swtch.S
(19.44 KB)
📄
sys_machdep.c
(2.75 KB)
📄
tick.c
(9.8 KB)
📄
tlb.c
(8.78 KB)
📄
trap.c
(43.68 KB)
📄
uio_machdep.c
(4.49 KB)
📄
uma_machdep.c
(2.72 KB)
📄
vm_machdep.c
(16.44 KB)
Editing: stack_machdep.c
/*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * * Copyright (c) 2005 Antoine Brodin * All rights reserved. * * 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 <sys/systm.h> #include <sys/lock.h> #include <sys/mutex.h> #include <sys/proc.h> #include <sys/stack.h> #include <machine/mips_opcode.h> #include <machine/pcb.h> #include <machine/regnum.h> #define VALID_PC(addr) ((addr) >= (uintptr_t)btext && (addr) % 4 == 0) static void stack_capture(struct stack *st, struct thread *td, uintptr_t pc, uintptr_t sp) { u_register_t ra; uintptr_t i, ra_addr; int ra_stack_pos, stacksize; InstFmt insn; stack_zero(st); for (;;) { if (!VALID_PC(pc)) break; /* * Walk backward from the PC looking for the function * start. Assume a subtraction from SP is the start * of a function. Hope that we find the store of RA * into the stack frame along the way and save the * offset of the saved RA relative to SP. */ ra_stack_pos = -1; stacksize = 0; for (i = pc; VALID_PC(i); i -= sizeof(insn)) { bcopy((void *)i, &insn, sizeof(insn)); switch (insn.IType.op) { case OP_ADDI: case OP_ADDIU: case OP_DADDI: case OP_DADDIU: if (insn.IType.rs != SP || insn.IType.rt != SP) break; /* * Ignore stack fixups in "early" * returns in a function, or if the * call was from an unlikely branch * moved after the end of the normal * return. */ if ((short)insn.IType.imm > 0) break; stacksize = -(short)insn.IType.imm; break; case OP_SW: case OP_SD: if (insn.IType.rs != SP || insn.IType.rt != RA) break; ra_stack_pos = (short)insn.IType.imm; break; default: break; } if (stacksize != 0) break; } if (stack_put(st, pc) == -1) break; if (ra_stack_pos == -1) break; /* * Walk forward from the PC to find the function end * (jr RA). If eret is hit instead, stop unwinding. */ ra_addr = sp + ra_stack_pos; ra = 0; for (i = pc; VALID_PC(i); i += sizeof(insn)) { bcopy((void *)i, &insn, sizeof(insn)); switch (insn.IType.op) { case OP_SPECIAL: if (insn.RType.func == OP_JR) { if (insn.RType.rs != RA) break; if (!kstack_contains(td, ra_addr, sizeof(ra))) goto done; ra = *(u_register_t *)ra_addr; if (ra == 0) goto done; ra -= 8; } break; default: break; } /* eret */ if (insn.word == 0x42000018) goto done; if (ra != 0) break; } if (pc == ra && stacksize == 0) break; sp += stacksize; pc = ra; } done: return; } int stack_save_td(struct stack *st, struct thread *td) { uintptr_t pc, sp; THREAD_LOCK_ASSERT(td, MA_OWNED); KASSERT(!TD_IS_SWAPPED(td), ("stack_save_td: thread %p is swapped", td)); if (TD_IS_RUNNING(td)) return (EOPNOTSUPP); pc = td->td_pcb->pcb_context[PCB_REG_RA]; sp = td->td_pcb->pcb_context[PCB_REG_SP]; stack_capture(st, td, pc, sp); return (0); } void stack_save(struct stack *st) { uintptr_t pc, sp; pc = (uintptr_t)&&here; sp = (uintptr_t)__builtin_frame_address(0); here: stack_capture(st, curthread, pc, sp); }
Upload File
Create Folder