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$ 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; 54210678Srpaulo uintptr_t rda_addr; /* address of r_debug_state */ 55210678Srpaulo} rd_agent_t; 56210678Srpaulo 57210678Srpaulotypedef struct rd_loadobj { 58210678Srpaulo uintptr_t rdl_saddr; /* start address */ 59210678Srpaulo uintptr_t rdl_eaddr; /* end address */ 60210678Srpaulo uint32_t rdl_offset; 61210678Srpaulo uint8_t rdl_prot; 62210678Srpaulo#define RD_RDL_R 0x01 63210678Srpaulo#define RD_RDL_W 0x02 64210678Srpaulo#define RD_RDL_X 0x04 65210678Srpaulo enum { 66210678Srpaulo RDL_TYPE_NONE = 0, 67210678Srpaulo RDL_TYPE_DEF, 68210678Srpaulo RDL_TYPE_VNODE, 69210678Srpaulo RDL_TYPE_SWAP, 70210678Srpaulo RDL_TYPE_DEV, 71210678Srpaulo /* XXX some types missing */ 72210678Srpaulo RDL_TYPE_UNKNOWN = 255 73210678Srpaulo } rdl_type; 74210678Srpaulo unsigned char rdl_path[PATH_MAX]; 75210678Srpaulo} rd_loadobj_t; 76210678Srpaulo 77210678Srpaulotypedef enum { 78210678Srpaulo RD_NONE = 0, 79210678Srpaulo RD_PREINIT, 80210678Srpaulo RD_POSTINIT, 81210678Srpaulo RD_DLACTIVITY 82210678Srpaulo} rd_event_e; 83210678Srpaulo 84210678Srpaulotypedef enum { 85210678Srpaulo RD_NOTIFY_BPT, 86210678Srpaulo RD_NOTIFY_AUTOBPT, 87210678Srpaulo RD_NOTIFY_SYSCALL 88210678Srpaulo} rd_notify_e; 89210678Srpaulo 90210678Srpaulotypedef struct rd_notify { 91210678Srpaulo rd_notify_e type; 92210678Srpaulo union { 93210678Srpaulo uintptr_t bptaddr; 94210678Srpaulo long syscallno; 95210678Srpaulo } u; 96210678Srpaulo} rd_notify_t; 97210678Srpaulo 98210678Srpaulotypedef enum { 99210678Srpaulo RD_NOSTATE = 0, 100210678Srpaulo RD_CONSISTENT, 101210678Srpaulo RD_ADD, 102210678Srpaulo RD_DELETE 103210678Srpaulo} rd_state_e; 104210678Srpaulo 105210678Srpaulotypedef struct rd_event_msg { 106210678Srpaulo rd_event_e type; 107210678Srpaulo union { 108210678Srpaulo rd_state_e state; 109210678Srpaulo } u; 110210678Srpaulo} rd_event_msg_t; 111210678Srpaulo 112210678Srpaulotypedef enum { 113210678Srpaulo RD_RESOLVE_NONE, 114210678Srpaulo RD_RESOLVE_STEP, 115210678Srpaulo RD_RESOLVE_TARGET, 116210678Srpaulo RD_RESOLVE_TARGET_STEP 117210678Srpaulo} rd_skip_e; 118210678Srpaulo 119210678Srpaulotypedef struct rd_plt_info { 120210678Srpaulo rd_skip_e pi_skip_method; 121210678Srpaulo long pi_nstep; 122210678Srpaulo uintptr_t pi_target; 123210678Srpaulo uintptr_t pi_baddr; 124210678Srpaulo unsigned int pi_flags; 125210678Srpaulo} rd_plt_info_t; 126210678Srpaulo 127210678Srpaulo#define RD_FLG_PI_PLTBOUND 0x0001 128210678Srpaulo 129210678Srpaulo__BEGIN_DECLS 130210678Srpaulo 131210678Srpaulostruct proc_handle; 132210678Srpaulovoid rd_delete(rd_agent_t *); 133210678Srpauloconst char *rd_errstr(rd_err_e); 134210678Srpaulord_err_e rd_event_addr(rd_agent_t *, rd_event_e, rd_notify_t *); 135210678Srpaulord_err_e rd_event_enable(rd_agent_t *, int); 136210678Srpaulord_err_e rd_event_getmsg(rd_agent_t *, rd_event_msg_t *); 137210678Srpaulord_err_e rd_init(int); 138210678Srpaulotypedef int rl_iter_f(const rd_loadobj_t *, void *); 139210678Srpaulord_err_e rd_loadobj_iter(rd_agent_t *, rl_iter_f *, void *); 140210678Srpaulovoid rd_log(const int); 141210678Srpaulord_agent_t *rd_new(struct proc_handle *); 142210678Srpaulord_err_e rd_objpad_enable(rd_agent_t *, size_t); 143210678Srpaulostruct proc; 144210678Srpaulord_err_e rd_plt_resolution(rd_agent_t *, uintptr_t, struct proc *, 145210678Srpaulo uintptr_t, rd_plt_info_t *); 146210678Srpaulord_err_e rd_reset(rd_agent_t *); 147210678Srpaulo 148210678Srpaulo__END_DECLS 149210678Srpaulo 150210678Srpaulo#endif /* _RTLD_DB_H_ */ 151