dtrace_vtime.c revision 1.1
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * $FreeBSD: src/sys/cddl/dev/dtrace/dtrace_vtime.c,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $ 22 */ 23 24/* 25 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29void 30dtrace_vtime_enable(void) 31{ 32 dtrace_vtime_state_t state, nstate = 0; 33 34 do { 35 state = dtrace_vtime_active; 36 37 switch (state) { 38 case DTRACE_VTIME_INACTIVE: 39 nstate = DTRACE_VTIME_ACTIVE; 40 break; 41 42 case DTRACE_VTIME_INACTIVE_TNF: 43 nstate = DTRACE_VTIME_ACTIVE_TNF; 44 break; 45 46 case DTRACE_VTIME_ACTIVE: 47 case DTRACE_VTIME_ACTIVE_TNF: 48 panic("DTrace virtual time already enabled"); 49 /*NOTREACHED*/ 50 } 51 52 } while (dtrace_cas32((uint32_t *)&dtrace_vtime_active, 53 state, nstate) != state); 54} 55 56void 57dtrace_vtime_disable(void) 58{ 59 dtrace_vtime_state_t state, nstate = 0; 60 61 do { 62 state = dtrace_vtime_active; 63 64 switch (state) { 65 case DTRACE_VTIME_ACTIVE: 66 nstate = DTRACE_VTIME_INACTIVE; 67 break; 68 69 case DTRACE_VTIME_ACTIVE_TNF: 70 nstate = DTRACE_VTIME_INACTIVE_TNF; 71 break; 72 73 case DTRACE_VTIME_INACTIVE: 74 case DTRACE_VTIME_INACTIVE_TNF: 75 panic("DTrace virtual time already disabled"); 76 /*NOTREACHED*/ 77 } 78 79 } while (dtrace_cas32((uint32_t *)&dtrace_vtime_active, 80 state, nstate) != state); 81} 82 83void 84dtrace_vtime_switch(kthread_t *next) 85{ 86 dtrace_icookie_t cookie; 87 hrtime_t ts; 88 89 cookie = dtrace_interrupt_disable(); 90 ts = dtrace_gethrtime(); 91 92 if (curthread->t_dtrace_start != 0) { 93 curthread->t_dtrace_vtime += ts - curthread->t_dtrace_start; 94 curthread->t_dtrace_start = 0; 95 } 96 97 if (next != NULL) 98 next->t_dtrace_start = ts; 99 100 dtrace_interrupt_enable(cookie); 101} 102