Utils: Update the firmware to carry section physical addresses
[gstreamer-omap:sysbios-rpmsg.git] / src / utils / elfload / dload_endian.c
1 /*
2  *  Syslink-IPC for TI OMAP Processors
3  *
4  *  Copyright (c) 2008-2010, Texas Instruments Incorporated
5  *  All rights reserved.
6  *
7  *  Redistribution and use in source and binary forms, with or without
8  *  modification, are permitted provided that the following conditions
9  *  are met:
10  *
11  *  *  Redistributions of source code must retain the above copyright
12  *     notice, this list of conditions and the following disclaimer.
13  *
14  *  *  Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *
18  *  *  Neither the name of Texas Instruments Incorporated nor the names of
19  *     its contributors may be used to endorse or promote products derived
20  *     from this software without specific prior written permission.
21  *
22  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25  *  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
26  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29  *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30  *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31  *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
32  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 /*****************************************************************************/
35 /* dload_endian.c                                                            */
36 /*                                                                           */
37 /* Simple helper functions to assist core loader with endian-ness issues     */
38 /* when the host endian-ness may be opposite the endian-ness of the target.  */
39 /*****************************************************************************/
40 #include "dload_endian.h"
41
42 /*****************************************************************************/
43 /* DLIMP_GET_ENDIAN() - Determine endianness of the host.  Uses ELF          */
44 /*      endianness constants.                                                */
45 /*****************************************************************************/
46 int DLIMP_get_endian()
47 {
48     int32_t x = 0x1;
49
50     if (*((int16_t*)(&x))) return ELFDATA2LSB;
51
52     return ELFDATA2MSB;
53 }
54
55 /*****************************************************************************/
56 /* DLIMP_CHANGE_ENDIAN32() - Swap endianness of a 32-bit integer.            */
57 /*****************************************************************************/
58 void DLIMP_change_endian32(int32_t* to_change)
59 {
60     int32_t temp = 0;
61     temp += (*to_change & 0x000000FF) << 24;
62     temp += (*to_change & 0x0000FF00) << 8;
63     temp += (*to_change & 0x00FF0000) >> 8;
64     temp += (*to_change & 0xFF000000) >> 24;
65     *to_change = temp;
66 }
67
68 /*****************************************************************************/
69 /* DLIMP_CHANGE_ENDIAN16() - Swap endianness of a 16-bit integer.            */
70 /*****************************************************************************/
71 void DLIMP_change_endian16(int16_t* to_change)
72 {
73     int16_t temp = 0;
74     temp += (*to_change & 0x00FF) << 8;
75     temp += (*to_change & 0xFF00) >> 8;
76     *to_change = temp;
77 }
78
79 /*****************************************************************************/
80 /* DLIMP_CHANGE_EHDR_ENDIAN() - Swap endianness of an ELF file header.       */
81 /*****************************************************************************/
82 void DLIMP_change_ehdr_endian(struct Elf32_Ehdr* ehdr)
83 {
84     DLIMP_change_endian16((int16_t*)(&ehdr->e_type));
85     DLIMP_change_endian16((int16_t*)(&ehdr->e_machine));
86     DLIMP_change_endian32((int32_t*)(&ehdr->e_version));
87     DLIMP_change_endian32((int32_t*)(&ehdr->e_entry));
88     DLIMP_change_endian32((int32_t*)(&ehdr->e_phoff));
89     DLIMP_change_endian32((int32_t*)(&ehdr->e_shoff));
90     DLIMP_change_endian32((int32_t*)(&ehdr->e_flags));
91     DLIMP_change_endian16((int16_t*)(&ehdr->e_ehsize));
92     DLIMP_change_endian16((int16_t*)(&ehdr->e_phentsize));
93     DLIMP_change_endian16((int16_t*)(&ehdr->e_phnum));
94     DLIMP_change_endian16((int16_t*)(&ehdr->e_shentsize));
95     DLIMP_change_endian16((int16_t*)(&ehdr->e_shnum));
96     DLIMP_change_endian16((int16_t*)(&ehdr->e_shstrndx));
97 }
98
99 /*****************************************************************************/
100 /* DLIMP_CHANGE_PHDR_ENDIAN() - Swap endianness of an ELF program header.    */
101 /*****************************************************************************/
102 void DLIMP_change_phdr_endian(struct Elf32_Phdr* phdr)
103 {
104     DLIMP_change_endian32((int32_t*)(&phdr->p_type));
105     DLIMP_change_endian32((int32_t*)(&phdr->p_offset));
106     DLIMP_change_endian32((int32_t*)(&phdr->p_vaddr));
107     DLIMP_change_endian32((int32_t*)(&phdr->p_paddr));
108     DLIMP_change_endian32((int32_t*)(&phdr->p_filesz));
109     DLIMP_change_endian32((int32_t*)(&phdr->p_memsz));
110     DLIMP_change_endian32((int32_t*)(&phdr->p_flags));
111     DLIMP_change_endian32((int32_t*)(&phdr->p_align));
112 }
113
114 /*****************************************************************************/
115 /* DLIMP_CHANGE_DYNENT_ENDIAN() - Swap endianness of a dynamic table entry.  */
116 /*****************************************************************************/
117 void DLIMP_change_dynent_endian(struct Elf32_Dyn* dyn)
118 {
119     DLIMP_change_endian32((int32_t*)(&dyn->d_tag));
120     DLIMP_change_endian32((int32_t*)(&dyn->d_un.d_val));
121 }
122
123 /*****************************************************************************/
124 /* DLIMP_CHANGE_SYM_ENDIAN() - Swap endianness of an ELF symbol table entry. */
125 /*****************************************************************************/
126 void DLIMP_change_sym_endian(struct Elf32_Sym* sym)
127 {
128     DLIMP_change_endian32((int32_t*)(&sym->st_name));
129     DLIMP_change_endian32((int32_t*)(&sym->st_value));
130     DLIMP_change_endian32((int32_t*)(&sym->st_size));
131     DLIMP_change_endian16((int16_t*)(&sym->st_shndx));
132 }
133
134 /*****************************************************************************/
135 /* DLIMP_CHANGE_RELA_ENDIAN() - Swap endianness of a RELA-type relocation.   */
136 /*****************************************************************************/
137 void DLIMP_change_rela_endian(struct Elf32_Rela* ra)
138 {
139     DLIMP_change_endian32((int32_t*)(&ra->r_offset));
140     DLIMP_change_endian32((int32_t*)(&ra->r_info));
141     DLIMP_change_endian32((int32_t*)(&ra->r_addend));
142 }
143
144 /*****************************************************************************/
145 /* DLIMP_CHANGE_REL_ENDIAN() - Swap endianness of a REL-type relocation.     */
146 /*****************************************************************************/
147 void DLIMP_change_rel_endian(struct Elf32_Rel* r)
148 {
149     DLIMP_change_endian32((int32_t*)(&r->r_offset));
150     DLIMP_change_endian32((int32_t*)(&r->r_info));
151 }