a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * DBGPlugInSolaris - Debugger and Guest OS Digger Plugin For Solaris.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2008-2013 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Header Files *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define LOG_GROUP LOG_GROUP_DBGF ///@todo add new log group.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "DBGPlugIns.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "DBGPlugInCommonELF.h"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/dbgf.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/asm.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/mem.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/stream.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/string.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Defined Constants And Macros *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Solaris on little endian ASCII systems. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define DIG_SOL_MOD_TAG UINT64_C(0x00736972616c6f53)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Structures and Typedefs *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @name InternalSolaris structures
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @{ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** sys/modctl.h */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL32v11_modctl
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_next; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_prev; /**< 4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_id; /**< 8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_mp; /**< c Pointer to the kernel runtime loader bits. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_inprogress_thread; /**< 10 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_modinfo; /**< 14 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_linkage; /**< 18 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_filename; /**< 1c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_modname; /**< 20 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_busy; /**< 24 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_want; /**< 25 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_prim; /**< 26 this is 1 for 'unix' and a few others. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_unused_padding; /**< 27 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_ref; /**< 28 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loaded; /**< 2c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_installed; /**< 2d */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loadflags; /**< 2e */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_delay_unload; /**< 2f */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_requisites; /**< 30 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod___unused; /**< 34 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_loadcnt; /**< 38 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_nenabled; /**< 3c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_text; /**< 40 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_text_size; /**< 44 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_gencount; /**< 48 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_requisite_loading; /**< 4c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL32v11_modctl_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL32v11_modctl_t, 0x50);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL64v11_modctl
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_next; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_prev; /**< 8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_id; /**< 10 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_mp; /**< 18 Pointer to the kernel runtime loader bits. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_inprogress_thread; /**< 20 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_modinfo; /**< 28 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_linkage; /**< 30 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_filename; /**< 38 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_modname; /**< 40 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_busy; /**< 48 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_want; /**< 49 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_prim; /**< 4a this is 1 for 'unix' and a few others. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_unused_padding; /**< 4b */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_ref; /**< 4c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loaded; /**< 50 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_installed; /**< 51 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loadflags; /**< 52 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_delay_unload; /**< 53 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_requisites; /**< 58 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod___unused; /**< 60 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_loadcnt; /**< 68 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_nenabled; /**< 6c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_text; /**< 70 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_text_size; /**< 78 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_gencount; /**< 80 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding2;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_requisite_loading; /**< 88 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL64v11_modctl_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL64v11_modctl_t, 0x90);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL32v9_modctl
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_next; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_prev; /**< 4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_id; /**< 8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_mp; /**< c Pointer to the kernel runtime loader bits. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_inprogress_thread; /**< 10 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_modinfo; /**< 14 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_linkage; /**< 18 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_filename; /**< 1c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_modname; /**< 20 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_busy; /**< 24 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_stub; /**< 28 DIFF 1 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loaded; /**< 2c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_installed; /**< 2d */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loadflags; /**< 2e */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_want; /**< 2f DIFF 2 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_requisites; /**< 30 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_dependents; /**< 34 DIFF 3 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_loadcnt; /**< 38 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* DIFF 4: 4 bytes added in v11 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_text; /**< 3c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t mod_text_size; /**< 40 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* DIFF 5: 8 bytes added in v11 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL32v9_modctl_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL32v9_modctl_t, 0x44);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL64v9_modctl
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_next; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_prev; /**< 8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_id; /**< 10 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_mp; /**< 18 Pointer to the kernel runtime loader bits. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_inprogress_thread; /**< 20 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_modinfo; /**< 28 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_linkage; /**< 30 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_filename; /**< 38 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_modname; /**< 40 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_busy; /**< 48 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_stub; /**< 4c DIFF 1 - is this a pointer? */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loaded; /**< 50 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_installed; /**< 51 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_loadflags; /**< 52 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int8_t mod_want; /**< 53 DIFF 2 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_requisites; /**< 58 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_dependencies; /**< 60 DIFF 3 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_loadcnt; /**< 68 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t mod_padding3; /**< 6c DIFF 4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_text; /**< 70 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t mod_text_size; /**< 78 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* DIFF 5: 8 bytes added in v11 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL64v9_modctl_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL64v9_modctl_t, 0x80);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef union SOL_modctl
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL32v9_modctl_t v9_32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL32v11_modctl_t v11_32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL64v9_modctl_t v9_64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL64v11_modctl_t v11_64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL_modctl_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** sys/kobj.h */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL32_module
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t total_allocated; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf32_Ehdr hdr; /**< 4 Easy to validate */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t shdrs; /**< 38 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symhdr; /**< 3c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t strhdr; /**< 40 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t depends_on; /**< 44 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symsize; /**< 48 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symspace; /**< 4c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t flags; /**< 50 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t text_size; /**< 54 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t data_size; /**< 58 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t text; /**< 5c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t data; /**< 60 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symtbl_section; /**< 64 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symtbl; /**< 68 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t strings; /**< 6c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t hashsize; /**< 70 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t buckets; /**< 74 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t chains; /**< 78 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t nsyms; /**< 7c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t bss_align; /**< 80 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t bss_size; /**< 84 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t bss; /**< 88 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t filename; /**< 8c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t head; /**< 90 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t tail; /**< 94 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t destination; /**< 98 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t machdata; /**< 9c */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t ctfdata; /**< a0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t ctfsize; /**< a4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t fbt_tab; /**< a8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t fbt_size; /**< ac */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t fbt_nentries; /**< b0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t textwin; /**< b4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t textwin_base; /**< b8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sdt_probes; /**< bc */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sdt_nprobes; /**< c0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sdt_tab; /**< c4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sdt_size; /**< c8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sigdata; /**< cc */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t sigsize; /**< d0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL32_module_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(Elf32_Ehdr, 0x34);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL32_module_t, 0xd4);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL64_module
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t total_allocated; /**< 0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t padding0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf64_Ehdr hdr; /**< 8 Easy to validate */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t shdrs; /**< 48 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t symhdr; /**< 50 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t strhdr; /**< 58 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t depends_on; /**< 60 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t symsize; /**< 68 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t symspace; /**< 70 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t flags; /**< 78 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t padding1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t text_size; /**< 80 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t data_size; /**< 88 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t text; /**< 90 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t data; /**< 98 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t symtbl_section; /**< a0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t padding2;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t symtbl; /**< a8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t strings; /**< b0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t hashsize; /**< b8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t padding3;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t buckets; /**< c0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t chains; /**< c8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t nsyms; /**< d0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t bss_align; /**< d4 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t bss_size; /**< d8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t bss; /**< e0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t filename; /**< e8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t head; /**< f0 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t tail; /**< f8 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t destination; /**< 100 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t machdata; /**< 108 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t ctfdata; /**< 110 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t ctfsize; /**< 118 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t fbt_tab; /**< 120 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t fbt_size; /**< 128 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t fbt_nentries; /**< 130 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t textwin; /**< 138 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t textwin_base; /**< 140 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sdt_probes; /**< 148 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sdt_nprobes; /**< 150 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sdt_tab; /**< 158 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sdt_size; /**< 160 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sigdata; /**< 168 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t sigsize; /**< 170 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL64_module_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(Elf64_Ehdr, 0x40);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL64_module_t, 0x178);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct SOL_utsname
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sysname[257];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char nodename[257];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char release[257];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char version[257];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char machine[257];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} SOL_utsname_t;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncAssertCompileSize(SOL_utsname_t, 5 * 257);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @} */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Solaris guest OS digger instance data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct DBGDIGGERSOLARIS
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Whether the information is valid or not.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * (For fending off illegal interface method calls.) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool fValid;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Address of the 'unix' text segment.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is set during probing. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS AddrUnixText;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Address of the 'unix' text segment.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is set during probing. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS AddrUnixData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Address of the 'unix' modctl_t (aka modules). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS AddrUnixModCtl;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** modctl_t version number. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int iModCtlVer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** 64-bit/32-bit indicator. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool f64Bit;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} DBGDIGGERSOLARIS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Pointer to the solaris guest OS digger instance data. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef DBGDIGGERSOLARIS *PDBGDIGGERSOLARIS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Defined Constants And Macros *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Min kernel address. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL32_MIN_KRNL_ADDR UINT32_C(0x80000000)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Max kernel address. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL32_MAX_KRNL_ADDR UINT32_C(0xfffff000)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Min kernel address. */
ef862a94cf65ef72ba76e6e4ecc3d3eb5ac9d56evboxsync#define SOL64_MIN_KRNL_ADDR UINT64_C(0xFFFFC00000000000)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Max kernel address. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL64_MAX_KRNL_ADDR UINT64_C(0xFFFFFFFFFFF00000)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Validates a 32-bit solaris kernel address */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0 /* OpenSolaris, early boot have symspace at 0x27a2000 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync# define SOL32_VALID_ADDRESS(Addr) ((Addr) > SOL32_MIN_KRNL_ADDR && (Addr) < SOL32_MAX_KRNL_ADDR)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync# define SOL32_VALID_ADDRESS(Addr) ( ((Addr) > SOL32_MIN_KRNL_ADDR && (Addr) < SOL32_MAX_KRNL_ADDR) \
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || ((Addr) > UINT32_C(0x02000000) && (Addr) < UINT32_C(0x04000000)) /* boot */ )
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** Validates a 64-bit solaris kernel address */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL64_VALID_ADDRESS(Addr) ( (Addr) > SOL64_MIN_KRNL_ADDR \
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (Addr) < SOL64_MAX_KRNL_ADDR)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** The max data segment size of the 'unix' module. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL_UNIX_MAX_DATA_SEG_SIZE 0x01000000
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** The max code segment size of the 'unix' module.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is the same for both 64-bit and 32-bit. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define SOL_UNIX_MAX_CODE_SEG_SIZE 0x00400000
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Internal Functions *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgDiggerSolarisInit(PUVM pUVM, void *pvData);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnQueryInterface
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(void *) dbgDiggerSolarisQueryInterface(PUVM pUVM, void *pvData, DBGFOSINTERFACE enmIf)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnQueryVersion
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgDiggerSolarisQueryVersion(PUVM pUVM, void *pvData, char *pszVersion, size_t cchVersion)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGDIGGERSOLARIS pThis = (PDBGDIGGERSOLARIS)pvData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pThis->fValid);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * It's all in the utsname symbol...
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Addr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL_utsname_t UtsName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTDBGSYMBOL SymUtsName;
98427c0ab08697e468c26dc33ee9571308577867vboxsync int rc = DBGFR3AsSymbolByName(pUVM, DBGF_AS_KERNEL, "utsname", &SymUtsName, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, SymUtsName.Value), &UtsName, sizeof(UtsName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Try searching by the name...
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memset(&UtsName, '\0', sizeof(UtsName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync strcpy(&UtsName.sysname[0], "SunOS");
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemScan(pUVM, 0, &pThis->AddrUnixData, SOL_UNIX_MAX_DATA_SEG_SIZE, 1,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync &UtsName.sysname[0], sizeof(UtsName.sysname), &Addr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, Addr.FlatPtr - RT_OFFSETOF(SOL_utsname_t, sysname)),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync &UtsName, sizeof(UtsName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Copy out the result (if any).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( UtsName.sysname[sizeof(UtsName.sysname) - 1] != '\0'
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || UtsName.nodename[sizeof(UtsName.nodename) - 1] != '\0'
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || UtsName.release[sizeof(UtsName.release) - 1] != '\0'
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || UtsName.version[sizeof(UtsName.version) - 1] != '\0'
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || UtsName.machine[sizeof(UtsName.machine) - 1] != '\0')
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync //rc = VERR_DBGF_UNEXPECTED_OS_DATA;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync rc = VERR_GENERAL_FAILURE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(pszVersion, cchVersion, "failed - bogus utsname");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(pszVersion, cchVersion, "%s %s", UtsName.version, UtsName.release);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(pszVersion, cchVersion, "failed - %Rrc", rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Processes a modctl_t.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
98427c0ab08697e468c26dc33ee9571308577867vboxsync * @param pUVM The user mode VM handle.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pThis Our instance data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pModCtl Pointer to the modctl structure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic void dbgDiggerSolarisProcessModCtl32(PUVM pUVM, PDBGDIGGERSOLARIS pThis, SOL_modctl_t const *pModCtl)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* skip it if it's not loaded and installed */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_loaded, v9_32.mod_loaded);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_installed, v9_32.mod_installed);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_id, v9_32.mod_id);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( ( !pModCtl->v9_32.mod_loaded
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !pModCtl->v9_32.mod_installed)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pModCtl->v9_32.mod_id > 3)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read the module and file names first
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_modname, v9_32.mod_modname);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szModName[64];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Addr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync int rc = DBGFR3MemReadString(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_32.mod_modname), szModName, sizeof(szModName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!RTStrEnd(szModName, sizeof(szModName)))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szModName[sizeof(szModName) - 1] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_filename, v9_32.mod_filename);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szFilename[256];
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemReadString(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_32.mod_filename), szFilename, sizeof(szFilename));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync strcpy(szFilename, szModName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (!RTStrEnd(szFilename, sizeof(szFilename)))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szFilename[sizeof(szFilename) - 1] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Then read the module struct and validate it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_mp, v9_32.mod_mp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync struct SOL32_module Module;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_32.mod_mp), &Module, sizeof(Module));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Basic validations of the elf header. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_ident[EI_MAG0] != ELFMAG0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG1] != ELFMAG1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG2] != ELFMAG2
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG3] != ELFMAG3
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_CLASS] != ELFCLASS32
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_DATA] != ELFDATA2LSB
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_VERSION] != EV_CURRENT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || ASMMemIsAll8(&Module.hdr.e_ident[EI_PAD], EI_NIDENT - EI_PAD, 0) != NULL
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync )
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_version != EV_CURRENT)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_ehsize != sizeof(Module.hdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_type != ET_DYN
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_type != ET_REL
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_type != ET_EXEC) //??
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_machine != EM_386
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_machine != EM_486)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_phentsize != sizeof(Elf32_Phdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_phentsize) //??
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_shentsize != sizeof(Elf32_Shdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_shentsize != sizeof(Elf32_Shdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Basic validations of the rest of the stuff. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !SOL32_VALID_ADDRESS(Module.shdrs)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL32_VALID_ADDRESS(Module.symhdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL32_VALID_ADDRESS(Module.strhdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL32_VALID_ADDRESS(Module.symspace) && Module.symspace)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL32_VALID_ADDRESS(Module.text)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL32_VALID_ADDRESS(Module.data)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL32_VALID_ADDRESS(Module.symtbl) && Module.symtbl)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL32_VALID_ADDRESS(Module.strings) && Module.strings)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL32_VALID_ADDRESS(Module.head) && Module.head)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL32_VALID_ADDRESS(Module.tail) && Module.tail)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL32_VALID_ADDRESS(Module.filename))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.symsize > _4M
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_shnum > 4096
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.nsyms > _256K)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Ignore modules without symbols. */
8dbb6dcc855b489c0c3a50d1b41d930d34aaebb1vboxsync if (!Module.symtbl || !Module.strings || !Module.symspace || !Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Check that the symtbl and strings points inside the symspace. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.strings - Module.symspace >= Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.symtbl - Module.symspace >= Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read the section headers, symbol table and string tables.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = Module.hdr.e_shnum * sizeof(Elf32_Shdr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf32_Shdr *paShdrs = (Elf32_Shdr *)RTMemTmpAlloc(cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!paShdrs)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, Module.shdrs), paShdrs, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void *pvSymSpace = RTMemTmpAlloc(Module.symsize + 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pvSymSpace)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, Module.symspace), pvSymSpace, Module.symsize);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ((uint8_t *)pvSymSpace)[Module.symsize] = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Hand it over to the common ELF32 module parser.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char const *pbStrings = (char const *)pvSymSpace + (Module.strings - Module.symspace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbMaxStrings = Module.symsize - (Module.strings - Module.symspace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf32_Sym const *paSyms = (Elf32_Sym const *)((uintptr_t)pvSymSpace + (Module.symtbl - Module.symspace));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cMaxSyms = (Module.symsize - (Module.symtbl - Module.symspace)) / sizeof(Elf32_Sym);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cMaxSyms = RT_MIN(cMaxSyms, Module.nsyms);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGDiggerCommonParseElf32Mod(pUVM, szModName, szFilename, DBG_DIGGER_ELF_FUNNY_SHDRS,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync &Module.hdr, paShdrs, paSyms, cMaxSyms, pbStrings, cbMaxStrings,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL32_MIN_KRNL_ADDR, SOL32_MAX_KRNL_ADDR - 1, DIG_SOL_MOD_TAG);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemTmpFree(pvSymSpace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemTmpFree(paShdrs);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Processes a modctl_t.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
98427c0ab08697e468c26dc33ee9571308577867vboxsync * @param pUVM The user mode VM handle.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pThis Our instance data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pModCtl Pointer to the modctl structure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic void dbgDiggerSolarisProcessModCtl64(PUVM pUVM, PDBGDIGGERSOLARIS pThis, SOL_modctl_t const *pModCtl)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* skip it if it's not loaded and installed */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_loaded, v9_64.mod_loaded);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_installed, v9_64.mod_installed);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_id, v9_64.mod_id);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( ( !pModCtl->v9_64.mod_loaded
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !pModCtl->v9_64.mod_installed)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pModCtl->v9_64.mod_id > 3)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read the module and file names first
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_modname, v9_64.mod_modname);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szModName[64];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Addr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync int rc = DBGFR3MemReadString(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_64.mod_modname), szModName, sizeof(szModName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!RTStrEnd(szModName, sizeof(szModName)))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szModName[sizeof(szModName) - 1] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_filename, v9_64.mod_filename);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szFilename[256];
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemReadString(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_64.mod_filename), szFilename, sizeof(szFilename));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync strcpy(szFilename, szModName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (!RTStrEnd(szFilename, sizeof(szFilename)))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szFilename[sizeof(szFilename) - 1] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Then read the module struct and validate it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_mp, v9_64.mod_mp);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync struct SOL64_module Module;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, pModCtl->v9_64.mod_mp), &Module, sizeof(Module));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Basic validations of the elf header. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_ident[EI_MAG0] != ELFMAG0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG1] != ELFMAG1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG2] != ELFMAG2
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_MAG3] != ELFMAG3
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_CLASS] != ELFCLASS64
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_DATA] != ELFDATA2LSB
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_ident[EI_VERSION] != EV_CURRENT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || ASMMemIsAll8(&Module.hdr.e_ident[EI_PAD], EI_NIDENT - EI_PAD, 0) != NULL
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync )
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_version != EV_CURRENT)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_ehsize != sizeof(Module.hdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_type != ET_DYN
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_type != ET_REL
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_type != ET_EXEC) //??
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_machine != EM_X86_64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.hdr.e_phentsize != sizeof(Elf64_Phdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && Module.hdr.e_phentsize) //??
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_shentsize != sizeof(Elf64_Shdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.hdr.e_shentsize != sizeof(Elf64_Shdr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Basic validations of the rest of the stuff. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !SOL64_VALID_ADDRESS(Module.shdrs)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL64_VALID_ADDRESS(Module.symhdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL64_VALID_ADDRESS(Module.strhdr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL64_VALID_ADDRESS(Module.symspace) && Module.symspace)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL64_VALID_ADDRESS(Module.text)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL64_VALID_ADDRESS(Module.data)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL64_VALID_ADDRESS(Module.symtbl) && Module.symtbl)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL64_VALID_ADDRESS(Module.strings) && Module.strings)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL64_VALID_ADDRESS(Module.head) && Module.head)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (!SOL64_VALID_ADDRESS(Module.tail) && Module.tail)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || !SOL64_VALID_ADDRESS(Module.filename))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( Module.symsize > _4M
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.hdr.e_shnum > 4096
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || Module.nsyms > _256K)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Ignore modules without symbols. */
8dbb6dcc855b489c0c3a50d1b41d930d34aaebb1vboxsync if (!Module.symtbl || !Module.strings || !Module.symspace || !Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Check that the symtbl and strings points inside the symspace. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.strings - Module.symspace >= Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Module.symtbl - Module.symspace >= Module.symsize)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read the section headers, symbol table and string tables.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cb = Module.hdr.e_shnum * sizeof(Elf64_Shdr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf64_Shdr *paShdrs = (Elf64_Shdr *)RTMemTmpAlloc(cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!paShdrs)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, Module.shdrs), paShdrs, cb);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void *pvSymSpace = RTMemTmpAlloc(Module.symsize + 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pvSymSpace)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, DBGFR3AddrFromFlat(pUVM, &Addr, Module.symspace), pvSymSpace, Module.symsize);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ((uint8_t *)pvSymSpace)[Module.symsize] = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Hand it over to the common ELF64 module parser.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char const *pbStrings = (char const *)pvSymSpace + (Module.strings - Module.symspace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbMaxStrings = Module.symsize - (Module.strings - Module.symspace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Elf64_Sym const *paSyms = (Elf64_Sym const *)((uintptr_t)pvSymSpace + (uintptr_t)(Module.symtbl - Module.symspace));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cMaxSyms = (Module.symsize - (Module.symtbl - Module.symspace)) / sizeof(Elf32_Sym);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cMaxSyms = RT_MIN(cMaxSyms, Module.nsyms);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGDiggerCommonParseElf64Mod(pUVM, szModName, szFilename, DBG_DIGGER_ELF_FUNNY_SHDRS,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync &Module.hdr, paShdrs, paSyms, cMaxSyms, pbStrings, cbMaxStrings,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL64_MIN_KRNL_ADDR, SOL64_MAX_KRNL_ADDR - 1, DIG_SOL_MOD_TAG);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemTmpFree(pvSymSpace);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemTmpFree(paShdrs);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnTerm
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(void) dbgDiggerSolarisTerm(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGDIGGERSOLARIS pThis = (PDBGDIGGERSOLARIS)pvData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pThis->fValid);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->fValid = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnRefresh
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgDiggerSolarisRefresh(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGDIGGERSOLARIS pThis = (PDBGDIGGERSOLARIS)pvData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(pThis);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pThis->fValid);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * For now we'll flush and reload everything.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsync RTDBGAS hDbgAs = DBGFR3AsResolveAndRetain(pUVM, DBGF_AS_KERNEL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (hDbgAs != NIL_RTDBGAS)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iMod = RTDbgAsModuleCount(hDbgAs);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (iMod-- > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTDBGMOD hMod = RTDbgAsModuleByIndex(hDbgAs, iMod);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (hMod != NIL_RTDBGMOD)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RTDbgModGetTag(hMod) == DIG_SOL_MOD_TAG)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = RTDbgAsModuleUnlink(hDbgAs, hMod);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertRC(rc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTDbgModRelease(hMod);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTDbgAsRelease(hDbgAs);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
98427c0ab08697e468c26dc33ee9571308577867vboxsync dbgDiggerSolarisTerm(pUVM, pvData);
98427c0ab08697e468c26dc33ee9571308577867vboxsync return dbgDiggerSolarisInit(pUVM, pvData);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnInit
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgDiggerSolarisInit(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGDIGGERSOLARIS pThis = (PDBGDIGGERSOLARIS)pvData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!pThis->fValid);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cbModCtl = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * On Solaris the kernel and is the global address space.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AsSetAlias(pUVM, DBGF_AS_KERNEL, DBGF_AS_GLOBAL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @todo Use debug_info, build 7x / S10U6. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Find the 'unix' modctl_t structure (aka modules).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We know it resides in the unix data segment.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &pThis->AddrUnixModCtl, 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS CurAddr = pThis->AddrUnixData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS MaxAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &MaxAddr, CurAddr.FlatPtr + SOL_UNIX_MAX_DATA_SEG_SIZE);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const uint8_t *pbExpr = (const uint8_t *)&pThis->AddrUnixText.FlatPtr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const uint32_t cbExpr = pThis->f64Bit ? sizeof(uint64_t) : sizeof(uint32_t);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( CurAddr.FlatPtr < MaxAddr.FlatPtr
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && CurAddr.FlatPtr >= pThis->AddrUnixData.FlatPtr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS HitAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemScan(pUVM, 0, &CurAddr, MaxAddr.FlatPtr - CurAddr.FlatPtr, 1, pbExpr, cbExpr, &HitAddr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Read out the modctl_t structure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS ModCtlAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* v11 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->f64Bit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &ModCtlAddr, HitAddr.FlatPtr - RT_OFFSETOF(SOL32v11_modctl_t, mod_text));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL64v11_modctl_t ModCtlv11;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &ModCtlAddr, &ModCtlv11, sizeof(ModCtlv11));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( SOL64_VALID_ADDRESS(ModCtlv11.mod_next)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv11.mod_prev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_id == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv11.mod_mp)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv11.mod_filename)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv11.mod_modname)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_prim == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_loaded == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_installed == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_requisites == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_loadcnt == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*&& ModCtlv11.mod_text == pThis->AddrUnixText.FlatPtr*/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_text_size < SOL_UNIX_MAX_CODE_SEG_SIZE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_text_size >= _128K)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szUnix[5];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS NameAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &NameAddr, ModCtlv11.mod_modname);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &NameAddr, &szUnix, sizeof(szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!strcmp(szUnix, "unix"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixModCtl = ModCtlAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->iModCtlVer = 11;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbModCtl = sizeof(ModCtlv11);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("sol64 mod_name=%.*s v11\n", sizeof(szUnix), szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &ModCtlAddr, HitAddr.FlatPtr - RT_OFFSETOF(SOL32v11_modctl_t, mod_text));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL32v11_modctl_t ModCtlv11;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &ModCtlAddr, &ModCtlv11, sizeof(ModCtlv11));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( SOL32_VALID_ADDRESS(ModCtlv11.mod_next)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv11.mod_prev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_id == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv11.mod_mp)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv11.mod_filename)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv11.mod_modname)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_prim == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_loaded == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_installed == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_requisites == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_loadcnt == 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*&& ModCtlv11.mod_text == pThis->AddrUnixText.FlatPtr*/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_text_size < SOL_UNIX_MAX_CODE_SEG_SIZE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv11.mod_text_size >= _128K)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szUnix[5];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS NameAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &NameAddr, ModCtlv11.mod_modname);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &NameAddr, &szUnix, sizeof(szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!strcmp(szUnix, "unix"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixModCtl = ModCtlAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->iModCtlVer = 11;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbModCtl = sizeof(ModCtlv11);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("sol32 mod_name=%.*s v11\n", sizeof(szUnix), szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* v9 */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->f64Bit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &ModCtlAddr, HitAddr.FlatPtr - RT_OFFSETOF(SOL64v9_modctl_t, mod_text));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL64v9_modctl_t ModCtlv9;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &ModCtlAddr, &ModCtlv9, sizeof(ModCtlv9));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( SOL64_VALID_ADDRESS(ModCtlv9.mod_next)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv9.mod_prev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_id == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv9.mod_mp)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv9.mod_filename)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL64_VALID_ADDRESS(ModCtlv9.mod_modname)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_loaded == 1 || ModCtlv9.mod_loaded == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_installed == 1 || ModCtlv9.mod_installed == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_requisites == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_loadcnt == 1 || ModCtlv9.mod_loadcnt == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*&& ModCtlv9.mod_text == pThis->AddrUnixText.FlatPtr*/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_text_size < SOL_UNIX_MAX_CODE_SEG_SIZE)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szUnix[5];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS NameAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &NameAddr, ModCtlv9.mod_modname);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &NameAddr, &szUnix, sizeof(szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!strcmp(szUnix, "unix"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixModCtl = ModCtlAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->iModCtlVer = 9;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbModCtl = sizeof(ModCtlv9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("sol64 mod_name=%.*s v9\n", sizeof(szUnix), szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &ModCtlAddr, HitAddr.FlatPtr - RT_OFFSETOF(SOL32v9_modctl_t, mod_text));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL32v9_modctl_t ModCtlv9;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &ModCtlAddr, &ModCtlv9, sizeof(ModCtlv9));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( SOL32_VALID_ADDRESS(ModCtlv9.mod_next)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv9.mod_prev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_id == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv9.mod_mp)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv9.mod_filename)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && SOL32_VALID_ADDRESS(ModCtlv9.mod_modname)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_loaded == 1 || ModCtlv9.mod_loaded == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_installed == 1 || ModCtlv9.mod_installed == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_requisites == 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && (ModCtlv9.mod_loadcnt == 1 || ModCtlv9.mod_loadcnt == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*&& ModCtlv9.mod_text == pThis->AddrUnixText.FlatPtr*/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && ModCtlv9.mod_text_size < SOL_UNIX_MAX_CODE_SEG_SIZE )
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szUnix[5];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS NameAddr;
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &NameAddr, ModCtlv9.mod_modname);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &NameAddr, &szUnix, sizeof(szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!strcmp(szUnix, "unix"))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixModCtl = ModCtlAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->iModCtlVer = 9;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cbModCtl = sizeof(ModCtlv9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("sol32 mod_name=%.*s v9\n", sizeof(szUnix), szUnix));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* next */
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &CurAddr, HitAddr.FlatPtr + cbExpr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Walk the module chain and add the modules and their symbols.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->AddrUnixModCtl.FlatPtr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int iMod = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync CurAddr = pThis->AddrUnixModCtl;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync do
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* read it */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync SOL_modctl_t ModCtl;
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemRead(pUVM, 0, &CurAddr, &ModCtl, cbModCtl);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
ef862a94cf65ef72ba76e6e4ecc3d3eb5ac9d56evboxsync LogRel(("sol: bad modctl_t chain for module %d: %RGv - %Rrc\n", iMod, CurAddr.FlatPtr, rc));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* process it. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->f64Bit)
98427c0ab08697e468c26dc33ee9571308577867vboxsync dbgDiggerSolarisProcessModCtl64(pUVM, pThis, &ModCtl);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
98427c0ab08697e468c26dc33ee9571308577867vboxsync dbgDiggerSolarisProcessModCtl32(pUVM, pThis, &ModCtl);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* next */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->f64Bit)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_64.mod_next, v9_64.mod_next);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!SOL64_VALID_ADDRESS(ModCtl.v9_64.mod_next))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
ef862a94cf65ef72ba76e6e4ecc3d3eb5ac9d56evboxsync LogRel(("sol64: bad modctl_t chain for module %d at %RGv: %RGv\n", iMod, CurAddr.FlatPtr, (RTGCUINTPTR)ModCtl.v9_64.mod_next));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &CurAddr, ModCtl.v9_64.mod_next);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile2MemberOffsets(SOL_modctl_t, v11_32.mod_next, v9_32.mod_next);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!SOL32_VALID_ADDRESS(ModCtl.v9_32.mod_next))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
ef862a94cf65ef72ba76e6e4ecc3d3eb5ac9d56evboxsync LogRel(("sol32: bad modctl_t chain for module %d at %RGv: %RGv\n", iMod, CurAddr.FlatPtr, (RTGCUINTPTR)ModCtl.v9_32.mod_next));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &CurAddr, ModCtl.v9_32.mod_next);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (++iMod >= 1024)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync LogRel(("sol32: too many modules (%d)\n", iMod));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync } while (CurAddr.FlatPtr != pThis->AddrUnixModCtl.FlatPtr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->fValid = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnProbe
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(bool) dbgDiggerSolarisProbe(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGDIGGERSOLARIS pThis = (PDBGDIGGERSOLARIS)pvData;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Look for "SunOS Release" in the text segment.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS Addr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool f64Bit = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* 32-bit search range. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &Addr, 0xfe800000);
e13be774f489340a894f56f95a7d26fdd6cff0ccvboxsync RTGCUINTPTR cbRange = 0xfec00000 - 0xfe800000;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFADDRESS HitAddr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const uint8_t s_abSunRelease[] = "SunOS Release ";
98427c0ab08697e468c26dc33ee9571308577867vboxsync int rc = DBGFR3MemScan(pUVM, 0, &Addr, cbRange, 1, s_abSunRelease, sizeof(s_abSunRelease) - 1, &HitAddr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* 64-bit.... */
98427c0ab08697e468c26dc33ee9571308577867vboxsync DBGFR3AddrFromFlat(pUVM, &Addr, UINT64_C(0xfffffffffb800000));
ef862a94cf65ef72ba76e6e4ecc3d3eb5ac9d56evboxsync cbRange = UINT64_C(0xfffffffffbd00000) - UINT64_C(0xfffffffffb800000);
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemScan(pUVM, 0, &Addr, cbRange, 1, s_abSunRelease, sizeof(s_abSunRelease) - 1, &HitAddr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync f64Bit = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync * Look for the copyright string too, just to be sure.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const uint8_t s_abSMI[] = "Sun Microsystems, Inc.";
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync static const uint8_t s_abORCL[] = "Oracle and/or its affiliates.";
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemScan(pUVM, 0, &Addr, cbRange, 1, s_abSMI, sizeof(s_abSMI) - 1, &HitAddr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_FAILURE(rc))
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync {
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync /* Try the alternate copyright string. */
98427c0ab08697e468c26dc33ee9571308577867vboxsync rc = DBGFR3MemScan(pUVM, 0, &Addr, cbRange, 1, s_abORCL, sizeof(s_abORCL) - 1, &HitAddr);
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync if (RT_FAILURE(rc))
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync return false;
fd5c3224c7cbfb3c5c5115e1260d9f91033885e0vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Remember the unix text and data addresses and bitness.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixText = Addr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGFR3AddrAdd(&Addr, SOL_UNIX_MAX_CODE_SEG_SIZE);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->AddrUnixData = Addr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->f64Bit = f64Bit;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnDestruct
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(void) dbgDiggerSolarisDestruct(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc DBGFOSREG::pfnConstruct
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
98427c0ab08697e468c26dc33ee9571308577867vboxsyncstatic DECLCALLBACK(int) dbgDiggerSolarisConstruct(PUVM pUVM, void *pvData)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncconst DBGFOSREG g_DBGDiggerSolaris =
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .u32Magic = */ DBGFOSREG_MAGIC,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .fFlags = */ 0,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .cbData = */ sizeof(DBGDIGGERSOLARIS),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .szName = */ "Solaris",
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnConstruct = */ dbgDiggerSolarisConstruct,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnDestruct = */ dbgDiggerSolarisDestruct,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnProbe = */ dbgDiggerSolarisProbe,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnInit = */ dbgDiggerSolarisInit,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnRefresh = */ dbgDiggerSolarisRefresh,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnTerm = */ dbgDiggerSolarisTerm,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnQueryVersion = */ dbgDiggerSolarisQueryVersion,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .pfnQueryInterface = */ dbgDiggerSolarisQueryInterface,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* .u32EndMagic = */ DBGFOSREG_MAGIC
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync