mdb_disasm.c revision d267098be0828035f8b0f6b5e3d62423fa139ed0
/*
* 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
* 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 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <mdb/mdb_disasm_impl.h>
#include <mdb/mdb_modapi.h>
#include <mdb/mdb_string.h>
#include <mdb/mdb_debug.h>
#include <libdisasm.h>
int
mdb_dis_select(const char *name)
{
if (v != NULL) {
return (0);
}
return (0);
}
return (set_errno(EMDB_NODIS));
}
{
if (v != NULL) {
(void) set_errno(EMDB_DISEXISTS);
return (NULL);
}
}
return (dp);
}
return (NULL);
}
void
{
(void) mdb_dis_select("default");
}
{
}
{
}
{
}
/*ARGSUSED*/
int
{
return (DCMD_USAGE);
if (argc != 0) {
const char *name;
else
warn("failed to set disassembly mode");
return (DCMD_ERR);
}
}
mdb_printf("disassembly mode is %s (%s)\n",
return (DCMD_OK);
}
/*ARGSUSED*/
static int
{
return (0);
}
/*ARGSUSED*/
int
{
return (DCMD_USAGE);
return (DCMD_OK);
}
/*
* Generic libdisasm disassembler interfaces.
*/
#define DISBUFSZ 64
/*
* Internal structure used by the read and lookup routines.
*/
typedef struct dis_buf {
} dis_buf_t;
/*
* Disassembler support routine for lookup up an address. Rely on mdb's "%a"
* qualifier to convert the address to a symbol.
*/
/*ARGSUSED*/
static int
{
char c;
#ifdef __sparc
/*
* that indicates the dtrace probe id; this may appear as the
* first two instructions or one instruction into the
* trampoline.
*/
sizeof (instr)) {
goto out;
goto out;
}
}
#endif
}
#ifdef __sparc
out:
#endif
return (-1);
return (0);
}
/*
* Disassembler support routine for reading from the target. Rather than having
* to read one byte at a time, we read from the address space in chunks. If the
* current address doesn't lie within our buffer range, we read in the chunk
* starting from the given address.
*/
static int
{
} else {
if (!db->db_readerr)
mdb_warn("failed to read instruction at %#lr",
return (-1);
}
}
return (len);
}
static mdb_tgt_addr_t
{
/*
* Set the libdisasm data to point to our buffer. This will be
* passed as the first argument to the lookup and read functions.
*/
/*
* Attempt to disassemble the instruction. If this fails because of an
* unknown opcode, drive on anyway. If it fails because we couldn't
* read from the target, bail out immediately.
*/
"***ERROR--unknown op code***");
if (db.db_readerr)
return (pc);
/*
* Return the updated location
*/
return (db.db_nextaddr);
}
static mdb_tgt_addr_t
{
/*
* Set the libdisasm data to point to our buffer. This will be
* passed as the first argument to the lookup and read functions.
* We set 'readerr' to B_TRUE to turn off the mdb_warn() in
* libdisasm_read, because the code works by probing backwards until a
* valid address is found.
*/
}
/*ARGSUSED*/
static mdb_tgt_addr_t
{
char c;
return (pc);
/*
* Probe the address to make sure we can read something from it - we
* want the address we return to actually contain something.
*/
return (pc);
return (npc);
}
static void
{
}
static const mdb_dis_ops_t libdisasm_ops = {
};
/*
* Generic function for creating a libdisasm-backed disassembler. Creates an
* MDB disassembler with the given name backed by libdis with the given flags.
*/
static int
{
libdisasm_read)) == NULL)
return (-1);
return (0);
}
static int
{
return (libdisasm_create(dp,
"ia32",
"Intel 32-bit disassembler",
}
#endif
#if defined(__amd64)
static int
{
return (libdisasm_create(dp,
"amd64",
"AMD64 and IA32e 64-bit disassembler",
}
#endif
#if defined(__sparc)
static int
{
return (libdisasm_create(dp,
"1",
"SPARC-v8 disassembler",
DIS_SPARC_V8));
}
static int
{
return (libdisasm_create(dp,
"2",
"SPARC-v9 disassembler",
DIS_SPARC_V9));
}
static int
{
return (libdisasm_create(dp,
"4",
"UltraSPARC1-v9 disassembler",
}
static int
{
return (libdisasm_create(dp,
"v8",
"SPARC-v8 disassembler",
DIS_SPARC_V8));
}
static int
{
return (libdisasm_create(dp,
"v9",
"SPARC-v9 disassembler",
DIS_SPARC_V9));
}
static int
{
return (libdisasm_create(dp,
"v9plus",
"UltraSPARC1-v9 disassembler",
}
#endif
/*ARGSUSED*/
static void
{
/* Nothing to do here */
}
/*ARGSUSED*/
static mdb_tgt_addr_t
{
return (addr);
}
/*ARGSUSED*/
static mdb_tgt_addr_t
{
return (addr);
}
/*ARGSUSED*/
static mdb_tgt_addr_t
{
return (addr);
}
static const mdb_dis_ops_t defdis_ops = {
};
static int
{
return (0);
}
mdb_dis_ctor_f *const mdb_dis_builtins[] = {
#if defined(__amd64)
#endif
};