| Commit | Line | Data |
|---|---|---|
| d7f50089 YY |
1 | /* |
| 2 | * Copyright (c) 2005 The DragonFly Project. All rights reserved. | |
| 3 | * | |
| 4 | * This code is derived from software contributed to The DragonFly Project | |
| 5 | * by Matthew Dillon <dillon@backplane.com> | |
| 6 | * | |
| 7 | * Redistribution and use in source and binary forms, with or without | |
| 8 | * modification, are permitted provided that the following conditions | |
| 9 | * are met: | |
| 10 | * | |
| 11 | * 1. Redistributions of source code must retain the above copyright | |
| 12 | * notice, this list of conditions and the following disclaimer. | |
| 13 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 14 | * notice, this list of conditions and the following disclaimer in | |
| 15 | * the documentation and/or other materials provided with the | |
| 16 | * distribution. | |
| 17 | * 3. Neither the name of The DragonFly Project nor the names of its | |
| 18 | * contributors may be used to endorse or promote products derived | |
| 19 | * from this software without specific, prior written permission. | |
| 20 | * | |
| 21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
| 24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
| 25 | * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
| 26 | * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
| 27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
| 29 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| 30 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
| 31 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 32 | * SUCH DAMAGE. | |
| d7f50089 YY |
33 | */ |
| 34 | /* | |
| 35 | * Kernel tracepoint facility. | |
| 36 | */ | |
| 37 | ||
| 38 | #include "opt_ddb.h" | |
| 39 | #include "opt_ktr.h" | |
| 40 | ||
| 41 | #include <sys/param.h> | |
| 42 | #include <sys/cons.h> | |
| 43 | #include <sys/kernel.h> | |
| 44 | #include <sys/libkern.h> | |
| 45 | #include <sys/proc.h> | |
| 46 | #include <sys/sysctl.h> | |
| 47 | #include <sys/ktr.h> | |
| 48 | ||
| 49 | /* | |
| 50 | * This routine fills in the ktr_caller1 and ktr_caller2 fields by | |
| 51 | * tracing back through the kernel stack to locate the stack frames | |
| 52 | * and return addresses. | |
| 53 | * | |
| 54 | * | |
| 55 | * [first argument] | |
| 56 | * [retpc] | |
| 57 | * [frameptr] -> points to caller's frame pointer | |
| 58 | * sp ->[junk] | |
| 59 | */ | |
| 60 | ||
| 61 | static __inline | |
| 62 | void ** | |
| 63 | FRAMEUP(void **frameptr) | |
| 64 | { | |
| 65 | void **newframeptr; | |
| 66 | ||
| 67 | newframeptr = (void **)frameptr[0]; | |
| 68 | if (((uintptr_t)newframeptr ^ (uintptr_t)frameptr) & ~16383) | |
| 69 | newframeptr = frameptr; | |
| 70 | return(newframeptr); | |
| 71 | } | |
| 72 | ||
| 73 | void | |
| 74 | cpu_ktr_caller(struct ktr_entry *_ktr) | |
| 75 | { | |
| 76 | struct ktr_entry *ktr; | |
| 77 | void **frameptr; | |
| 78 | ||
| 79 | frameptr = (void **)&_ktr - 2; /* frame, retpc to ktr_log */ | |
| 80 | ktr = _ktr; | |
| 81 | frameptr = FRAMEUP(frameptr); /* frame, retpc to traced function */ | |
| 82 | frameptr = FRAMEUP(frameptr); /* frame, caller1 of traced function */ | |
| 83 | ktr->ktr_caller1 = frameptr[1]; | |
| 84 | frameptr = FRAMEUP(frameptr); /* frame, caller2 of caller1 */ | |
| 85 | ktr->ktr_caller2 = frameptr[1]; | |
| 86 | } | |
| 87 |