1260684Skaiw/*-
2260684Skaiw * Copyright (c) 2009 Kai Wang
3260684Skaiw * All rights reserved.
4260684Skaiw *
5260684Skaiw * Redistribution and use in source and binary forms, with or without
6260684Skaiw * modification, are permitted provided that the following conditions
7260684Skaiw * are met:
8260684Skaiw * 1. Redistributions of source code must retain the above copyright
9260684Skaiw *    notice, this list of conditions and the following disclaimer.
10260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright
11260684Skaiw *    notice, this list of conditions and the following disclaimer in the
12260684Skaiw *    documentation and/or other materials provided with the distribution.
13260684Skaiw *
14260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17260684Skaiw * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24260684Skaiw * SUCH DAMAGE.
25260684Skaiw */
26260684Skaiw
27260684Skaiw#include "_libdwarf.h"
28260684Skaiw
29260684SkaiwELFTC_VCSID("$Id: libdwarf_elf_access.c 2070 2011-10-27 03:05:32Z jkoshy $");
30260684Skaiw
31260684Skaiwint
32260684Skaiw_dwarf_elf_get_section_info(void *obj, Dwarf_Half ndx,
33260684Skaiw    Dwarf_Obj_Access_Section *ret_section, int *error)
34260684Skaiw{
35260684Skaiw	Dwarf_Elf_Object *e;
36260684Skaiw	GElf_Shdr *sh;
37260684Skaiw
38260684Skaiw	e = obj;
39260684Skaiw	assert(e != NULL);
40260684Skaiw
41260684Skaiw	if (ret_section == NULL) {
42260684Skaiw		if (error)
43260684Skaiw			*error = DW_DLE_ARGUMENT;
44260684Skaiw		return (DW_DLV_ERROR);
45260684Skaiw	}
46260684Skaiw
47260684Skaiw	if (ndx >= e->eo_seccnt) {
48260684Skaiw		if (error)
49260684Skaiw			*error = DW_DLE_NO_ENTRY;
50260684Skaiw		return (DW_DLV_NO_ENTRY);
51260684Skaiw	}
52260684Skaiw
53260684Skaiw	sh = &e->eo_shdr[ndx];
54260684Skaiw
55260684Skaiw	ret_section->addr = sh->sh_addr;
56260684Skaiw	ret_section->size = sh->sh_size;
57260684Skaiw
58260684Skaiw	ret_section->name = elf_strptr(e->eo_elf, e->eo_strndx, sh->sh_name);
59260684Skaiw	if (ret_section->name == NULL) {
60260684Skaiw		if (error)
61260684Skaiw			*error = DW_DLE_ELF;
62260684Skaiw		return (DW_DLV_ERROR);
63260684Skaiw	}
64260684Skaiw
65260684Skaiw	return (DW_DLV_OK);
66260684Skaiw}
67260684Skaiw
68260684SkaiwDwarf_Endianness
69260684Skaiw_dwarf_elf_get_byte_order(void *obj)
70260684Skaiw{
71260684Skaiw	Dwarf_Elf_Object *e;
72260684Skaiw
73260684Skaiw	e = obj;
74260684Skaiw	assert(e != NULL);
75260684Skaiw
76260684Skaiw	switch (e->eo_ehdr.e_ident[EI_DATA]) {
77260684Skaiw	case ELFDATA2MSB:
78260684Skaiw		return (DW_OBJECT_MSB);
79260684Skaiw
80260684Skaiw	case ELFDATA2LSB:
81260684Skaiw	case ELFDATANONE:
82260684Skaiw	default:
83260684Skaiw		return (DW_OBJECT_LSB);
84260684Skaiw	}
85260684Skaiw}
86260684Skaiw
87260684SkaiwDwarf_Small
88260684Skaiw_dwarf_elf_get_length_size(void *obj)
89260684Skaiw{
90260684Skaiw	Dwarf_Elf_Object *e;
91260684Skaiw
92260684Skaiw	e = obj;
93260684Skaiw	assert(e != NULL);
94260684Skaiw
95260684Skaiw	if (gelf_getclass(e->eo_elf) == ELFCLASS32)
96260684Skaiw		return (4);
97260684Skaiw	else if (e->eo_ehdr.e_machine == EM_MIPS)
98260684Skaiw		return (8);
99260684Skaiw	else
100260684Skaiw		return (4);
101260684Skaiw}
102260684Skaiw
103260684SkaiwDwarf_Small
104260684Skaiw_dwarf_elf_get_pointer_size(void *obj)
105260684Skaiw{
106260684Skaiw	Dwarf_Elf_Object *e;
107260684Skaiw
108260684Skaiw	e = obj;
109260684Skaiw	assert(e != NULL);
110260684Skaiw
111260684Skaiw	if (gelf_getclass(e->eo_elf) == ELFCLASS32)
112260684Skaiw		return (4);
113260684Skaiw	else
114260684Skaiw		return (8);
115260684Skaiw}
116260684Skaiw
117260684SkaiwDwarf_Unsigned
118260684Skaiw_dwarf_elf_get_section_count(void *obj)
119260684Skaiw{
120260684Skaiw	Dwarf_Elf_Object *e;
121260684Skaiw
122260684Skaiw	e = obj;
123260684Skaiw	assert(e != NULL);
124260684Skaiw
125260684Skaiw	return (e->eo_seccnt);
126260684Skaiw}
127260684Skaiw
128260684Skaiwint
129260684Skaiw_dwarf_elf_load_section(void *obj, Dwarf_Half ndx, Dwarf_Small** ret_data,
130260684Skaiw    int *error)
131260684Skaiw{
132260684Skaiw	Dwarf_Elf_Object *e;
133260684Skaiw	Dwarf_Elf_Data *ed;
134260684Skaiw
135260684Skaiw	e = obj;
136260684Skaiw	assert(e != NULL);
137260684Skaiw
138260684Skaiw	if (ret_data == NULL) {
139260684Skaiw		if (error)
140260684Skaiw			*error = DW_DLE_ARGUMENT;
141260684Skaiw		return (DW_DLV_ERROR);
142260684Skaiw	}
143260684Skaiw
144260684Skaiw	if (ndx >= e->eo_seccnt) {
145260684Skaiw		if (error)
146260684Skaiw			*error = DW_DLE_NO_ENTRY;
147260684Skaiw		return (DW_DLV_NO_ENTRY);
148260684Skaiw	}
149260684Skaiw
150260684Skaiw	ed = &e->eo_data[ndx];
151260684Skaiw
152260684Skaiw	if (ed->ed_alloc != NULL)
153260684Skaiw		*ret_data = ed->ed_alloc;
154260684Skaiw	else {
155260684Skaiw		if (ed->ed_data == NULL) {
156260684Skaiw			if (error)
157260684Skaiw				*error = DW_DLE_NO_ENTRY;
158260684Skaiw			return (DW_DLV_NO_ENTRY);
159260684Skaiw		}
160260684Skaiw		*ret_data = ed->ed_data->d_buf;
161260684Skaiw	}
162260684Skaiw
163260684Skaiw	return (DW_DLV_OK);
164260684Skaiw}
165