From owner-p4-projects@FreeBSD.ORG Mon Jul 3 15:13:43 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7C97C16A407; Mon, 3 Jul 2006 15:13:43 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3FB6C16A40F for ; Mon, 3 Jul 2006 15:13:43 +0000 (UTC) (envelope-from howardsu@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id EA45B43D45 for ; Mon, 3 Jul 2006 15:13:42 +0000 (GMT) (envelope-from howardsu@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k63FDgNB000788 for ; Mon, 3 Jul 2006 15:13:42 GMT (envelope-from howardsu@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k63FDgQk000785 for perforce@freebsd.org; Mon, 3 Jul 2006 15:13:42 GMT (envelope-from howardsu@FreeBSD.org) Date: Mon, 3 Jul 2006 15:13:42 GMT Message-Id: <200607031513.k63FDgQk000785@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to howardsu@FreeBSD.org using -f From: Howard Su To: Perforce Change Reviews Cc: Subject: PERFORCE change 100506 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jul 2006 15:13:43 -0000 http://perforce.freebsd.org/chv.cgi?CH=100506 Change 100506 by howardsu@su_laptop on 2006/07/03 15:13:39 Implement stack() and stackdepth. Remark: pcpu_find() is used in stack(). So it is not safe to fbt. Add a comment to fbt.c to keep the record of the dependency. Affected files ... .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/i386/dtrace_isa.c#4 edit .. //depot/projects/dtrace/src/sys/cddl/dev/fbt/fbt.c#4 edit Differences ... ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/i386/dtrace_isa.c#4 (text+ko) ==== @@ -23,37 +23,30 @@ * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +#include -#if defined(sun) -#pragma ident "@(#)dtrace_isa.c 1.15 05/09/30 SMI" - -#include +#include +#include +#include #include -#include -#include -#include -#include +#include -/* - * This is gross knowledge to have to encode here... - */ -extern void _interrupt(); -extern void _cmntrap(); -extern void _allsyscalls(); +#include -extern size_t _interrupt_size; -extern size_t _cmntrap_size; -extern size_t _allsyscalls_size; +#include +#include +#include -extern uintptr_t kernelbase; -#else extern uintptr_t kernbase; uintptr_t kernelbase = (uintptr_t) &kernbase; + +#define INKERNEL(va) (((vm_offset_t)(va)) >= USRSTACK && \ + ((vm_offset_t)(va)) < VM_MAX_KERNEL_ADDRESS) + struct frame { greg_t fr_savfp; /* saved frame pointer */ greg_t fr_savpc; /* saved program counter */ }; -#endif uint8_t dtrace_fuword8_nocheck(void *); uint16_t dtrace_fuword16_nocheck(void *); @@ -64,73 +57,43 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes, uint32_t *intrpc) { -#ifdef DOODAD - struct frame *fp = (struct frame *)dtrace_getfp(); - struct frame *nextfp, *minfp, *stacktop; int depth = 0; - int on_intr, last = 0; - uintptr_t pc; - uintptr_t caller = CPU->cpu_dtrace_caller; + vm_offset_t callpc; + register_t ebp; + struct frame *frame; + pc_t caller = (pc_t)pcpu_find(curcpu)->pc_dtrace_caller; - if ((on_intr = CPU_ON_INTR(CPU)) != 0) - stacktop = (struct frame *)(CPU->cpu_intr_stack + SA(MINFRAME)); - else - stacktop = (struct frame *)curthread->t_stk; - minfp = fp; - + if (intrpc != 0) + pcstack[depth++] = (pc_t)intrpc; aframes++; - - if (intrpc != NULL && depth < pcstack_limit) - pcstack[depth++] = (pc_t)intrpc; - - while (depth < pcstack_limit) { - nextfp = (struct frame *)fp->fr_savfp; - pc = fp->fr_savpc; - - if (nextfp <= minfp || nextfp >= stacktop) { - if (on_intr) { - /* - * Hop from interrupt stack to thread stack. - */ - stacktop = (struct frame *)curthread->t_stk; - minfp = (struct frame *)curthread->t_stkbase; - on_intr = 0; - continue; - } - - /* - * This is the last frame we can process; indicate - * that we should return after processing this frame. - */ - last = 1; - } - + ebp = dtrace_getfp(); + frame = (struct frame *)ebp; + while(depth < pcstack_limit) { + if (!INKERNEL(frame)) + break; + callpc = frame->fr_savpc; + if (!INKERNEL(callpc)) + break; if (aframes > 0) { - if (--aframes == 0 && caller != NULL) { - /* - * We've just run out of artificial frames, - * and we have a valid caller -- fill it in - * now. - */ - ASSERT(depth < pcstack_limit); - pcstack[depth++] = (pc_t)caller; - caller = NULL; + aframes--; + if ((aframes == 0) && (caller != 0)) { + pcstack[depth++] = caller; } - } else { - if (depth < pcstack_limit) - pcstack[depth++] = (pc_t)pc; } - - if (last) { - while (depth < pcstack_limit) - pcstack[depth++] = NULL; - return; + else { + pcstack[depth++] = callpc; } + + if ((struct frame *)frame->fr_savfp < frame || + (vm_offset_t)frame->fr_savfp >= + (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE) + break; + frame = (struct frame *)frame->fr_savfp; + } - fp = nextfp; - minfp = fp; + for (; depth < pcstack_limit; depth++) { + pcstack[depth] = 0; } -#endif } static int @@ -515,49 +478,31 @@ int dtrace_getstackdepth(int aframes) { -#ifdef DOODAD - struct frame *fp = (struct frame *)dtrace_getfp(); - struct frame *nextfp, *minfp, *stacktop; int depth = 0; - int on_intr; + struct frame *frame; + vm_offset_t ebp; - if ((on_intr = CPU_ON_INTR(CPU)) != 0) - stacktop = (struct frame *)(CPU->cpu_intr_stack + SA(MINFRAME)); - else - stacktop = (struct frame *)curthread->t_stk; - minfp = fp; - aframes++; - - for (;;) { + ebp = dtrace_getfp(); + frame = (struct frame *)ebp; + depth++; + for(;;) { + if (!INKERNEL(frame)) + break; + if (!INKERNEL(frame->fr_savpc)) + break; depth++; - - nextfp = (struct frame *)fp->fr_savfp; - - if (nextfp <= minfp || nextfp >= stacktop) { - if (on_intr) { - /* - * Hop from interrupt stack to thread stack. - */ - stacktop = (struct frame *)curthread->t_stk; - minfp = (struct frame *)curthread->t_stkbase; - on_intr = 0; - continue; - } + if ((struct frame *)frame->fr_savfp < frame || + (vm_offset_t)frame->fr_savfp >= + (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE) break; - } - - fp = nextfp; - minfp = fp; + + frame = (struct frame *)frame->fr_savfp; } - - if (depth <= aframes) - return (0); - - return (depth - aframes); -#else -return 0; -#endif + if (depth < aframes) + return 0; + else + return depth - aframes; } ulong_t ==== //depot/projects/dtrace/src/sys/cddl/dev/fbt/fbt.c#4 (text+ko) ==== @@ -267,7 +267,7 @@ strncmp(name, "linker", 6) == 0 || strncmp(name, "witness", 7) == 0 || strncmp(name, "spinlock", 8) == 0 || - strcmp(name, "pcpu_find") == 0) + strcmp(name, "pcpu_find") == 0) /* used in stack() impl */ return (0); /*