10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * CDDL HEADER START
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * The contents of this file are subject to the terms of the
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Common Development and Distribution License, Version 1.0 only
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * (the "License"). You may not use this file except in compliance
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * with the License.
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * See the License for the specific language governing permissions
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * and limitations under the License.
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * When distributing Covered Code, include this CDDL HEADER in each
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * If applicable, add the following below this CDDL HEADER, with the
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * CDDL HEADER END
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Copyright (c) 1994, by Sun Microsytems, Inc.
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross#pragma ident "%Z%%M% %I% %E% SMI"
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross ((tag) | ((tagarg) & 0xfffc) | TNF_REF32_T_PAIR)
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * CAUTION: halfword_accessible assumes that the pointer is to a reclaimable
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * block - i.e. negative offsets have a 0 in high bit
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross ((((x) & 0xffff8000) == 0) || (((x) & 0xffff8000) == 0x7fff8000))
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Check that x can be encoded in tagarg slot
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Same as above, but operates on ints (no space bit)
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Check that hit 32 bits of hrtime are zero
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross (((x) >> 32) == 0)
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * CAUTION: Use the following macro only when doing a self relative pointer
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * to a target in the same block
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross ((tnf_ref32_t)((tnf_record_p)(item) - (tnf_record_p)(ref)))
10b444a87400224fdb8ed3a329960a27385a96daGordon Rosstypedef struct {
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Declarations
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * tnf_trace_alloc
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * the probe allocation function
10b444a87400224fdb8ed3a329960a27385a96daGordon Rosstnf_trace_alloc(tnf_ops_t *ops, tnf_probe_control_t *probe_p,
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Check the "tracing active" flag after setting the busy bit;
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * this avoids a race in which we check the "tracing active"
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * flag, then it gets turned off, and the buffer gets
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * deallocated, before we've set the busy bit.
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross if (!lock_try(&ops->busy)) /* atomic op flushes WB */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Write probe tag if needed
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross if ((probe_index = tnf_probe_tag(ops, probe_p)) == 0)
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Determine how much memory is required
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross asize = size + sizeof (tnf_ref32_t); /* one fwd ptr */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* common case - probe_index is a file ptr */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* rare case -- get an extra fwd ptr */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Allocate memory
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 16-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross TNFW_B_ALLOC(wcb, asize, buffer, probe_event_prototype_t *);
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED pointer cast may result in improper alignment */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Check if the probe tag needs more work
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* use up first fwd ptr */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED cast from 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Get timestamp
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Write schedule record if needed
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED pointer cast */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross shift = ((tnf_buf_file_header_t *)tnf_buf)->com.file_log_size;
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross block = (tnf_block_header_t *)((uintptr_t)buffer & TNF_BLOCK_MASK);
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* No record written yet */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Note: Don't bother about space bit here, because we'll
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * only use bits 15:2 anyway
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross sched_offset = ((sched->record_gen - block->generation) << shift) +
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross sched_offset = ((sched->record_gen - block->generation) << shift) +
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* Record too far away to reference */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* Time delta can't fit in 32 bits */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* CPU information is invalid */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Can reuse existing schedule record
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Since we did not allocate any more space, can giveback
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED warning: assignment of 64-bit integer to 16-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Store return params and two common event members, return buffer
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross buffer->probe_event = ENCODED_TAG(tag_disp, sched_offset);
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross buffer->time_delta = tnf_time_delta(ops, (unsigned long)time_diff,
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross buffer->time_delta = tnf_time_delta(ops, (unsigned long)time_diff,
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross * Write a new schedule record for this thread
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross if ((sched_record_p = tnf_kernel_schedule(ops, sched)) != NULL) {
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* use one of the extra alloced words for the forwarding ptr */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED assignment of 64-bit integer to 32-bit integer */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross ((sched->record_gen - block->generation) << shift) +
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED */
10b444a87400224fdb8ed3a329960a27385a96daGordon Ross /* LINTED cast from 64-bit integer to 32-bit integer */
sched_offset = 0;
goto good_ret;
return (NULL);