root/usr/src/uts/common/sys/mdesc_impl.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _MDESC_IMPL_H_
#define _MDESC_IMPL_H_

#ifdef __cplusplus
extern "C" {
#endif

#define LIBMD_MAGIC     0x4d61636844657363ULL   /* MachDesc */

#ifndef _ASM

        /*
         * Internal definitions
         */


/*
 * Each MD has the following header to
 * provide information about each section of the MD.
 *
 * There are 3 sections:
 * The description list, the name table and the data block.
 *
 * All values are stored in network byte order.
 *
 * Elements in the first (description list) section are defined by their
 * index location within the node block. An index is simply the byte offset
 * within the block / element size (16bytes). All elements are refered to
 * by their index, to avoid bugs related to alignment etc.
 *
 * The name_len field holds the storage length of an ASCII name, NOT the strlen.
 * The header fields are written in network
 * byte order.
 */

struct md_header_s {
        uint32_t        transport_version;
        uint32_t        node_blk_sz;    /* size in bytes of the node block */
        uint32_t        name_blk_sz;    /* size in bytes of the name block */
        uint32_t        data_blk_sz;    /* size in bytes of the data block */
};

typedef struct md_header_s md_header_t;



#if defined(_BIG_ENDIAN)
#define mdtoh8(x)       ((uint8_t)(x))
#define mdtoh16(x)      ((uint16_t)(x))
#define mdtoh32(x)      ((uint32_t)(x))
#define mdtoh64(x)      ((uint64_t)(x))
#define htomd8(x)       (x)
#define htomd16(x)      (x)
#define htomd32(x)      (x)
#define htomd64(x)      (x)
#else
#define mdtoh8(x)       ((uint8_t)(x))
#define mdtoh16(x)      BSWAP_16((uint16_t)(x))
#define mdtoh32(x)      BSWAP_32((uint32_t)(x))
#define mdtoh64(x)      BSWAP_64((uint64_t)(x))
#define htomd8(x)       ((uint8_t)(x))
#define htomd16(x)      BSWAP_16((uint16_t)(x))
#define htomd32(x)      BSWAP_32((uint32_t)(x))
#define htomd64(x)      BSWAP_64((uint64_t)(x))
#endif



struct MD_ELEMENT {
        uint8_t         tag;
        uint8_t         name_len;
        uint16_t        _reserved;
        uint32_t        name_offset;    /* mde_str_cookie_t */
        union {
                struct {
                        uint32_t        len;
                        uint32_t        offset;
                } prop_data;                    /* for PROP_DATA and PROP_STR */
                uint64_t        prop_val;       /* for PROP_VAL */
                uint64_t        prop_idx;       /* for PROP_ARC and NODE */
        } d;
};

typedef struct MD_ELEMENT md_element_t;

struct MACHINE_DESCRIPTION {
        caddr_t         caddr;

        void            *(*allocp)(size_t);
        void            (*freep)(void *, size_t);

        md_header_t     *headerp;
        md_element_t    *mdep;
        char            *namep;
        uint8_t         *datap;

        int             node_blk_size;
        int             name_blk_size;
        int             data_blk_size;

        int             element_count;
        int             node_count;

        mde_cookie_t    root_node;

        int             size;
        uint64_t        gen;

        uint64_t        md_magic;
};

typedef struct MACHINE_DESCRIPTION md_impl_t;

#define MDE_TAG(_p)                     mdtoh8((_p)->tag)
#define MDE_NAME(_p)                    mdtoh32((_p)->name_offset)
#define MDE_NAME_LEN(_p)                mdtoh32((_p)->name_len)
#define MDE_PROP_DATA_OFFSET(_p)        mdtoh32((_p)->d.prop_data.offset)
#define MDE_PROP_DATA_LEN(_p)           mdtoh32((_p)->d.prop_data.len)
#define MDE_PROP_VALUE(_p)              mdtoh64((_p)->d.prop_val)
#define MDE_PROP_INDEX(_p)              mdtoh64((_p)->d.prop_idx)

extern mde_str_cookie_t md_ident_name_str(char *);

extern mde_cookie_t     md_find_node_prop(md_impl_t *,
                                mde_cookie_t,
                                mde_str_cookie_t,
                                int);
#endif  /* _ASM */

#ifdef __cplusplus
}
#endif

#endif  /* _MDESC_IMPL_H_ */