c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * CDDL HEADER START
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * The contents of this file are subject to the terms of the
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Common Development and Distribution License (the "License").
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * You may not use this file except in compliance with the License.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * or http://www.opensolaris.org/os/licensing.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * See the License for the specific language governing permissions
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * and limitations under the License.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * When distributing Covered Code, include this CDDL HEADER in each
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * If applicable, add the following below this CDDL HEADER, with the
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * fields enclosed by brackets "[]" replaced with your own identifying
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * information: Portions Copyright [yyyy] [name of copyright owner]
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * CDDL HEADER END
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Use is subject to license terms.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <stdlib.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <stdio.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <string.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <msg.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <_elfdump.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <struct_layout.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab#include <conv.h>
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Functions for extracting and formatting numeric values from
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * structure data.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Extract the integral field into the value union given and
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * perform any necessary byte swapping to make the result readable
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * on the elfdump host.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abvoid
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_extract_num_field(const char *data, int do_swap, const sl_field_t *fdesc,
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_data_t *field_data)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Copy the value bytes into our union */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab (void) memcpy(field_data, data + fdesc->slf_offset,
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab fdesc->slf_eltlen);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Do byte swapping as necessary */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab if (do_swap) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab field_data->sld_ui16 = BSWAP_HALF(field_data->sld_ui16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab field_data->sld_ui32 = BSWAP_WORD(field_data->sld_ui32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab field_data->sld_ui64 =
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab BSWAP_LWORD(field_data->sld_ui64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Extract the given integer field, and return its value, cast
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * to Word. Note that this operation must not be used on values
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * that can be negative, or larger than 32-bits, as information
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * can be lost.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abWord
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_extract_as_word(const char *data, int do_swap, const sl_field_t *fdesc)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_data_t v;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Extract the value from the raw data */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_extract_num_field(data, do_swap, fdesc, &v);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab if (fdesc->slf_sign) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_i8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_i16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_i32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_i64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab } else {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_ui8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_ui16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_ui32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Word) v.sld_ui64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* This should not be reached */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab assert(0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Extract the given integer field, and return its value, cast
d2a70789f056fc6c9ce3ab047b52126d80b0e3daRichard Lowe * to Lword. Note that this operation must not be used on values
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * that can be negative, as information can be lost.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abLword
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_extract_as_lword(const char *data, int do_swap, const sl_field_t *fdesc)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_data_t v;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Extract the value from the raw data */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_extract_num_field(data, do_swap, fdesc, &v);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab if (fdesc->slf_sign) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_i8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_i16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_i32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_i64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab } else {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_ui8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_ui16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_ui32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Lword) v.sld_ui64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* This should not be reached */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab assert(0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Extract the given integer field, and return its value, cast
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * to int32_t. Note that this operation must not be used on unsigned
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * values larger than 31-bits, or on signed values larger than 32-bits,
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * as information can be lost.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abSword
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_extract_as_sword(const char *data, int do_swap, const sl_field_t *fdesc)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_data_t v;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Extract the value from the raw data */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_extract_num_field(data, do_swap, fdesc, &v);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab if (fdesc->slf_sign) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_i8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_i16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_i32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_i64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab } else {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_ui8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_ui16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_ui32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return ((Sword)v.sld_ui64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* This should not be reached */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab assert(0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (0);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Extract the integral field and format it into the supplied buffer.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abconst char *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_fmt_num(const char *data, int do_swap, const sl_field_t *fdesc,
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_fmt_num_t fmt_type, sl_fmtbuf_t buf)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * These static arrays are indexed by [fdesc->slf_sign][fmt_type]
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * to get a format string to use for the specified combination.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab static const char *fmt_i8[2][3] = {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_U),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z2X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab },
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_D),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z2X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab };
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab static const char *fmt_i16[2][3] = {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_U),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z4X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab },
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_D),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z4X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab };
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab static const char *fmt_i32[2][3] = {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_U),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z8X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab },
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_D),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_X),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z8X)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab };
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab static const char *fmt_i64[2][3] = {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_LLU),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_LLX),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z16LLX)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab },
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_LLD),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_LLX),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab MSG_ORIG(MSG_CNOTE_FMT_Z16LLX)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab };
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_data_t v;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Extract the value from the raw data */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab sl_extract_num_field(data, do_swap, fdesc, &v);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Format into the buffer. Note that we depend on the signed
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * and unsigned versions of each width being equivalent as long
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * as the format specifies the proper formatting.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (fdesc->slf_eltlen) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 1:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab (void) snprintf(buf, sizeof (sl_fmtbuf_t),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab fmt_i8[fdesc->slf_sign][fmt_type], (uint32_t)v.sld_ui8);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 2:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab (void) snprintf(buf, sizeof (sl_fmtbuf_t),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab fmt_i16[fdesc->slf_sign][fmt_type], (uint32_t)v.sld_ui16);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 4:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab (void) snprintf(buf, sizeof (sl_fmtbuf_t),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab fmt_i32[fdesc->slf_sign][fmt_type], v.sld_ui32);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case 8:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab (void) snprintf(buf, sizeof (sl_fmtbuf_t),
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab fmt_i64[fdesc->slf_sign][fmt_type], v.sld_ui64);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab break;
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (buf);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab/*
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * Return structure layout definition for the given machine type,
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab * or NULL if the specified machine is not supported.
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87abconst sl_arch_layout_t *
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87absl_mach(Half mach)
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab{
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab switch (mach) {
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case EM_386:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (struct_layout_i386());
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case EM_AMD64:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (struct_layout_amd64());
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case EM_SPARC:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case EM_SPARC32PLUS:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (struct_layout_sparc());
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab case EM_SPARCV9:
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (struct_layout_sparcv9());
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab }
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab /* Unsupported architecture */
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab return (NULL);
c6c9aed4d309e3d11be652b85e3bf8bb72f20c87ab}