1/*- 2 * Copyright (c) 2000, 2001 Ben Harris 3 * Copyright (c) 1996 Scott K. Stevens 4 * 5 * Mach Operating System 6 * Copyright (c) 1991,1990 Carnegie Mellon University 7 * All Rights Reserved. 8 * 9 * Permission to use, copy, modify and distribute this software and its 10 * documentation is hereby granted, provided that both the copyright 11 * notice and this permission notice appear in all copies of the 12 * software, derivative works or modified versions, and any portions 13 * thereof, and that both notices appear in supporting documentation. 14 * 15 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 17 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18 * 19 * Carnegie Mellon requests users of this software to return to 20 * 21 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 22 * School of Computer Science 23 * Carnegie Mellon University 24 * Pittsburgh PA 15213-3890 25 * 26 * any improvements or extensions that they make and grant Carnegie the 27 * rights to redistribute these changes. 28 */ 29 30#ifndef _MACHINE_STACK_H_ 31#define _MACHINE_STACK_H_ 32 33#define INKERNEL(va) (((vm_offset_t)(va)) >= VM_MIN_KERNEL_ADDRESS) 34 35#define FR_SCP (0) 36#define FR_RLV (-1) 37#define FR_RSP (-2) 38#define FR_RFP (-3) 39 40/* The state of the unwind process */ 41struct unwind_state { 42 uint32_t registers[16]; 43 uint32_t start_pc; 44 uint32_t *insn; 45 u_int entries; 46 u_int byte; 47 uint16_t update_mask; 48}; 49 50/* The register names */ 51#define FP 11 52#define SP 13 53#define LR 14 54#define PC 15 55 56#ifdef _KERNEL 57 58int unwind_stack_one(struct unwind_state *, int); 59 60struct linker_file; 61void unwind_module_loaded(struct linker_file *); 62void unwind_module_unloaded(struct linker_file *); 63 64#ifdef _SYS_PROC_H_ 65 66#include <machine/pcb.h> 67 68/* Get the current kernel thread stack usage. */ 69#define GET_STACK_USAGE(total, used) do { \ 70 struct thread *td = curthread; \ 71 (total) = td->td_kstack_pages * PAGE_SIZE - sizeof(struct pcb); \ 72 (used) = td->td_kstack + (total) - (vm_offset_t)&td; \ 73} while (0) 74 75static __inline bool 76kstack_contains(struct thread *td, vm_offset_t va, size_t len) 77{ 78 return (va >= td->td_kstack && va + len >= va && 79 va + len <= td->td_kstack + td->td_kstack_pages * PAGE_SIZE - 80 sizeof(struct pcb)); 81} 82#endif /* _SYS_PROC_H_ */ 83 84#endif 85 86#endif /* !_MACHINE_STACK_H_ */ 87