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$ 22 */ 23 24 /* 25 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29 void 30 dtrace_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 56 void 57 dtrace_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 83 void 84 dtrace_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