1210678Srpaulo/* 2210678Srpaulo * Copyright (c) 2010 The FreeBSD Foundation 3210678Srpaulo * All rights reserved. 4210678Srpaulo * 5210678Srpaulo * This software was developed by Rui Paulo under sponsorship from the 6210678Srpaulo * FreeBSD Foundation. 7210678Srpaulo * 8210678Srpaulo * Redistribution and use in source and binary forms, with or without 9210678Srpaulo * modification, are permitted provided that the following conditions 10210678Srpaulo * are met: 11210678Srpaulo * 1. Redistributions of source code must retain the above copyright 12210678Srpaulo * notice, this list of conditions and the following disclaimer. 13210678Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 14210678Srpaulo * notice, this list of conditions and the following disclaimer in the 15210678Srpaulo * documentation and/or other materials provided with the distribution. 16210678Srpaulo * 17210678Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18210678Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19210678Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20210678Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21210678Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22210678Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23210678Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24210678Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25210678Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26210678Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27210678Srpaulo * SUCH DAMAGE. 28210678Srpaulo * 29210678Srpaulo * $FreeBSD: releng/11.0/lib/librtld_db/rtld_db.h 265629 2014-05-08 03:26:25Z markj $ 30210678Srpaulo */ 31210678Srpaulo 32210678Srpaulo#ifndef _RTLD_DB_H_ 33210678Srpaulo#define _RTLD_DB_H_ 34210678Srpaulo 35210678Srpaulo#include <sys/param.h> 36210678Srpaulo#include <sys/cdefs.h> 37210678Srpaulo#include <sys/types.h> 38210678Srpaulo 39210678Srpaulo 40210678Srpaulo#define RD_VERSION 1 41210678Srpaulo 42210678Srpaulotypedef enum { 43210678Srpaulo RD_OK, 44210678Srpaulo RD_ERR, 45210678Srpaulo RD_DBERR, 46210678Srpaulo RD_NOCAPAB, 47210678Srpaulo RD_NODYNAM, 48210678Srpaulo RD_NOBASE, 49210678Srpaulo RD_NOMAPS 50210678Srpaulo} rd_err_e; 51210678Srpaulo 52210678Srpaulotypedef struct rd_agent { 53210678Srpaulo struct proc_handle *rda_php; 54265629Smarkj uintptr_t rda_dlactivity_addr; 55265629Smarkj uintptr_t rda_preinit_addr; 56265629Smarkj uintptr_t rda_postinit_addr; 57210678Srpaulo} rd_agent_t; 58210678Srpaulo 59210678Srpaulotypedef struct rd_loadobj { 60210678Srpaulo uintptr_t rdl_saddr; /* start address */ 61210678Srpaulo uintptr_t rdl_eaddr; /* end address */ 62210678Srpaulo uint32_t rdl_offset; 63210678Srpaulo uint8_t rdl_prot; 64210678Srpaulo#define RD_RDL_R 0x01 65210678Srpaulo#define RD_RDL_W 0x02 66210678Srpaulo#define RD_RDL_X 0x04 67210678Srpaulo enum { 68210678Srpaulo RDL_TYPE_NONE = 0, 69210678Srpaulo RDL_TYPE_DEF, 70210678Srpaulo RDL_TYPE_VNODE, 71210678Srpaulo RDL_TYPE_SWAP, 72210678Srpaulo RDL_TYPE_DEV, 73210678Srpaulo /* XXX some types missing */ 74210678Srpaulo RDL_TYPE_UNKNOWN = 255 75210678Srpaulo } rdl_type; 76210678Srpaulo unsigned char rdl_path[PATH_MAX]; 77210678Srpaulo} rd_loadobj_t; 78210678Srpaulo 79210678Srpaulotypedef enum { 80210678Srpaulo RD_NONE = 0, 81210678Srpaulo RD_PREINIT, 82210678Srpaulo RD_POSTINIT, 83210678Srpaulo RD_DLACTIVITY 84210678Srpaulo} rd_event_e; 85210678Srpaulo 86210678Srpaulotypedef enum { 87210678Srpaulo RD_NOTIFY_BPT, 88210678Srpaulo RD_NOTIFY_AUTOBPT, 89210678Srpaulo RD_NOTIFY_SYSCALL 90210678Srpaulo} rd_notify_e; 91210678Srpaulo 92210678Srpaulotypedef struct rd_notify { 93210678Srpaulo rd_notify_e type; 94210678Srpaulo union { 95210678Srpaulo uintptr_t bptaddr; 96210678Srpaulo long syscallno; 97210678Srpaulo } u; 98210678Srpaulo} rd_notify_t; 99210678Srpaulo 100210678Srpaulotypedef enum { 101210678Srpaulo RD_NOSTATE = 0, 102210678Srpaulo RD_CONSISTENT, 103210678Srpaulo RD_ADD, 104210678Srpaulo RD_DELETE 105210678Srpaulo} rd_state_e; 106210678Srpaulo 107210678Srpaulotypedef struct rd_event_msg { 108210678Srpaulo rd_event_e type; 109210678Srpaulo union { 110210678Srpaulo rd_state_e state; 111210678Srpaulo } u; 112210678Srpaulo} rd_event_msg_t; 113210678Srpaulo 114210678Srpaulotypedef enum { 115210678Srpaulo RD_RESOLVE_NONE, 116210678Srpaulo RD_RESOLVE_STEP, 117210678Srpaulo RD_RESOLVE_TARGET, 118210678Srpaulo RD_RESOLVE_TARGET_STEP 119210678Srpaulo} rd_skip_e; 120210678Srpaulo 121210678Srpaulotypedef struct rd_plt_info { 122210678Srpaulo rd_skip_e pi_skip_method; 123210678Srpaulo long pi_nstep; 124210678Srpaulo uintptr_t pi_target; 125210678Srpaulo uintptr_t pi_baddr; 126210678Srpaulo unsigned int pi_flags; 127210678Srpaulo} rd_plt_info_t; 128210678Srpaulo 129210678Srpaulo#define RD_FLG_PI_PLTBOUND 0x0001 130210678Srpaulo 131210678Srpaulo__BEGIN_DECLS 132210678Srpaulo 133210678Srpaulostruct proc_handle; 134210678Srpaulovoid rd_delete(rd_agent_t *); 135210678Srpauloconst char *rd_errstr(rd_err_e); 136210678Srpaulord_err_e rd_event_addr(rd_agent_t *, rd_event_e, rd_notify_t *); 137210678Srpaulord_err_e rd_event_enable(rd_agent_t *, int); 138210678Srpaulord_err_e rd_event_getmsg(rd_agent_t *, rd_event_msg_t *); 139210678Srpaulord_err_e rd_init(int); 140210678Srpaulotypedef int rl_iter_f(const rd_loadobj_t *, void *); 141210678Srpaulord_err_e rd_loadobj_iter(rd_agent_t *, rl_iter_f *, void *); 142210678Srpaulovoid rd_log(const int); 143210678Srpaulord_agent_t *rd_new(struct proc_handle *); 144210678Srpaulord_err_e rd_objpad_enable(rd_agent_t *, size_t); 145210678Srpaulostruct proc; 146210678Srpaulord_err_e rd_plt_resolution(rd_agent_t *, uintptr_t, struct proc *, 147210678Srpaulo uintptr_t, rd_plt_info_t *); 148210678Srpaulord_err_e rd_reset(rd_agent_t *); 149210678Srpaulo 150210678Srpaulo__END_DECLS 151210678Srpaulo 152210678Srpaulo#endif /* _RTLD_DB_H_ */ 153