1 | #ifndef _ENDIANNESS_H |
---|
2 | #define _ENDIANNESS_H |
---|
3 | //=====[ endianness ]========================================================== |
---|
4 | |
---|
5 | /* |
---|
6 | * file : endianness.h |
---|
7 | * date (yyyy/mm/dd) : 2006/05/02 |
---|
8 | * authors : Rosiere Mathieu |
---|
9 | */ |
---|
10 | |
---|
11 | #include <byteswap.h> |
---|
12 | |
---|
13 | #define LittleEndian false |
---|
14 | #define BigEndian true |
---|
15 | |
---|
16 | union TestEndian |
---|
17 | { |
---|
18 | unsigned long total; |
---|
19 | struct |
---|
20 | { |
---|
21 | unsigned char octet1; |
---|
22 | unsigned char octet2; |
---|
23 | unsigned char octet3; |
---|
24 | unsigned char octet4; |
---|
25 | } octets; |
---|
26 | }; |
---|
27 | |
---|
28 | //-----[ hostEndianness ]------------------------------------------------------ |
---|
29 | /* |
---|
30 | * false : LitteEndian |
---|
31 | * true : BigEndian |
---|
32 | */ |
---|
33 | inline bool hostEndianness() |
---|
34 | { |
---|
35 | union TestEndian test_endian; |
---|
36 | test_endian.total = 0xFF; |
---|
37 | |
---|
38 | return (test_endian.octets.octet1 == 0xFF)?LittleEndian:BigEndian; |
---|
39 | } |
---|
40 | |
---|
41 | //-----[ cpuEndianness ]------------------------------------------------------- |
---|
42 | /* |
---|
43 | * false : LitteEndian |
---|
44 | * true : BigEndian |
---|
45 | */ |
---|
46 | inline bool cpuEndianness(unsigned int cpu_id) |
---|
47 | { |
---|
48 | return(BigEndian); |
---|
49 | |
---|
50 | /* |
---|
51 | * Comment connaitre l'endianness ? |
---|
52 | * static : table generee dans le top level |
---|
53 | * dynamique : table generee par un l'equivalent de hostEndianness et ecrivant dans un segment precis de la ram |
---|
54 | */ |
---|
55 | } |
---|
56 | |
---|
57 | //-----[ isSameEndianness ]---------------------------------------------------- |
---|
58 | |
---|
59 | /* |
---|
60 | * The host machine and the simulate processeur have the same endianness |
---|
61 | */ |
---|
62 | inline bool isSameEndianness(unsigned int cpu_id) |
---|
63 | { |
---|
64 | return ((hostEndianness() ^ cpuEndianness(cpu_id)) == false); |
---|
65 | } |
---|
66 | |
---|
67 | //-----[ swapBytes ]----------------------------------------------------------- |
---|
68 | /* |
---|
69 | * swapBytes -> change the endiannes |
---|
70 | * exemple for 16 and size_access = 4, [0123456789abcdef] -> [32107654ba98fedc] |
---|
71 | */ |
---|
72 | inline char * swapBytes (char * string_src , unsigned int size_string, unsigned int size_access) |
---|
73 | { |
---|
74 | char string_tmp [size_string]; |
---|
75 | |
---|
76 | if (size_access == 1) |
---|
77 | return string_src; |
---|
78 | |
---|
79 | if (size_string % size_access != 0) |
---|
80 | { |
---|
81 | cerr << "<swapBytes> : Size of string must be a multiple of size_access." << endl; |
---|
82 | exit(1); |
---|
83 | } |
---|
84 | |
---|
85 | // size_access : |
---|
86 | // 1 -> bytes |
---|
87 | // 2 -> half |
---|
88 | // 4 -> word |
---|
89 | // 8 -> doubleword |
---|
90 | |
---|
91 | memcpy (string_tmp,string_src,size_string); |
---|
92 | |
---|
93 | // Loop to reorganize the string |
---|
94 | for (unsigned int it_size_string = 0 ; it_size_string < size_string; it_size_string += size_access) |
---|
95 | { |
---|
96 | // Permutation |
---|
97 | // for (unsigned int it_size_access = 0 ; it_size_access < size_access; it_size_access ++) |
---|
98 | // string_src [it_size_string+it_size_access] = string_tmp [it_size_string + (size_access-1) - it_size_access]; |
---|
99 | switch (size_access) |
---|
100 | { |
---|
101 | case 2 : |
---|
102 | { |
---|
103 | string_src[it_size_string+0] = string_tmp[it_size_string+1]; |
---|
104 | string_src[it_size_string+1] = string_tmp[it_size_string+0]; |
---|
105 | break; |
---|
106 | } |
---|
107 | case 4 : |
---|
108 | { |
---|
109 | string_src[it_size_string+0] = string_tmp[it_size_string+3]; |
---|
110 | string_src[it_size_string+1] = string_tmp[it_size_string+2]; |
---|
111 | string_src[it_size_string+2] = string_tmp[it_size_string+1]; |
---|
112 | string_src[it_size_string+3] = string_tmp[it_size_string+0]; |
---|
113 | break; |
---|
114 | } |
---|
115 | case 8 : |
---|
116 | { |
---|
117 | string_src[it_size_string+0] = string_tmp[it_size_string+7]; |
---|
118 | string_src[it_size_string+1] = string_tmp[it_size_string+6]; |
---|
119 | string_src[it_size_string+2] = string_tmp[it_size_string+5]; |
---|
120 | string_src[it_size_string+3] = string_tmp[it_size_string+4]; |
---|
121 | string_src[it_size_string+4] = string_tmp[it_size_string+3]; |
---|
122 | string_src[it_size_string+5] = string_tmp[it_size_string+2]; |
---|
123 | string_src[it_size_string+6] = string_tmp[it_size_string+1]; |
---|
124 | string_src[it_size_string+7] = string_tmp[it_size_string+0]; |
---|
125 | break; |
---|
126 | } |
---|
127 | default : |
---|
128 | { |
---|
129 | cerr << "<swapBytes> : Illegal size of access (size_access = " << size_access << ")" << endl; |
---|
130 | exit(1); |
---|
131 | break; |
---|
132 | } |
---|
133 | }//end switch(size_access) |
---|
134 | }//end it_size_string |
---|
135 | |
---|
136 | |
---|
137 | // cout << "size_access : " << size_access << endl; |
---|
138 | // cout << "size_string : " << size_string << endl; |
---|
139 | |
---|
140 | // for (unsigned int it_size_string = 0 ; it_size_string < size_string; it_size_string ++) |
---|
141 | // printf("%.2x",(unsigned int)string_src[it_size_string]); |
---|
142 | // printf("\n"); |
---|
143 | |
---|
144 | // // Loop to reorganize the string |
---|
145 | // for (unsigned int it_size_string = 0 ; it_size_string < size_string; it_size_string += size_access) |
---|
146 | // { |
---|
147 | // switch (size_access) |
---|
148 | // { |
---|
149 | // case 2 : string_src[it_size_string] = bswap_16((unsigned short) string_src[it_size_string]); break; |
---|
150 | // case 4 : string_src[it_size_string] = bswap_32((unsigned int ) string_src[it_size_string]); break; |
---|
151 | // case 8 : string_src[it_size_string] = bswap_64((unsigned long int)string_src[it_size_string]); break; |
---|
152 | // default : |
---|
153 | // { |
---|
154 | // cerr << "<swapBytes> : Illegal size of access (size_access = " << size_access << ")" << endl; |
---|
155 | // exit(1); |
---|
156 | // break; |
---|
157 | // } |
---|
158 | // }//end switch(size_access) |
---|
159 | |
---|
160 | // for (unsigned int it_size_string = 0 ; it_size_string < size_string; it_size_string ++) |
---|
161 | // printf("%.2x",(unsigned int)string_src[it_size_string]); |
---|
162 | // printf("\n"); |
---|
163 | |
---|
164 | return string_src; |
---|
165 | } |
---|
166 | #endif //_ENDIANNESS_H |
---|