34e5daa44fd209ef4e0137c1373583146567f286
[openocd.git] / src / helper / replacements.h
1 /***************************************************************************
2 * Copyright (C) 2006 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
26 #ifndef REPLACEMENTS_H
27 #define REPLACEMENTS_H
28
29 #include "types.h"
30
31 /* MIN,MAX macros */
32 #ifndef MIN
33 #define MIN(a,b) (((a)<(b))?(a):(b))
34 #endif
35 #ifndef MAX
36 #define MAX(a,b) (((a)>(b))?(a):(b))
37 #endif
38
39 /* for systems that do not support ENOTSUP
40 * win32 being one of them */
41 #ifndef ENOTSUP
42 #define ENOTSUP 134 /* Not supported */
43 #endif
44
45 #ifndef HAVE_SYS_TIME_H
46
47 #ifndef _TIMEVAL_DEFINED
48 #define _TIMEVAL_DEFINED
49
50 struct timeval {
51 long tv_sec;
52 long tv_usec;
53 };
54
55 #endif /* _TIMEVAL_DEFINED */
56
57 #endif
58
59 /* gettimeofday() */
60 #ifndef HAVE_GETTIMEOFDAY
61
62 #ifdef _WIN32
63 struct timezone {
64 int tz_minuteswest;
65 int tz_dsttime;
66 };
67 #endif
68 struct timezone;
69
70 extern int gettimeofday(struct timeval *tv, struct timezone *tz);
71 #endif
72
73 #ifndef IN_REPLACEMENTS_C
74 /**** clear_malloc & fill_malloc ****/
75 void *clear_malloc(size_t size);
76 void *fill_malloc(size_t size);
77 #endif
78
79 /*
80 * Now you have 3 ways for the malloc function:
81 *
82 * 1. Do not change anything, use the original malloc
83 *
84 * 2. Use the clear_malloc function instead of the original malloc.
85 * In this case you must use the following define:
86 * #define malloc((_a)) clear_malloc((_a))
87 *
88 * 3. Use the fill_malloc function instead of the original malloc.
89 * In this case you must use the following define:
90 * #define malloc((_a)) fill_malloc((_a))
91 *
92 * We have figured out that there could exist some malloc problems
93 * where variables are using without to be initialise. To find this
94 * places, use the fill_malloc function. With this function we want
95 * to initialize memory to some known bad state. This is quite easily
96 * spotted in the debugger and will trap to an invalid address.
97 *
98 * clear_malloc can be used if you want to set not initialise
99 * variable to 0.
100 *
101 * If you do not want to change the malloc function, to not use one of
102 * the following macros. Which is the default way.
103 */
104
105 /* #define malloc(_a) clear_malloc(_a) */
106 /* #define malloc(_a) fill_malloc(_a) */
107
108 /* GNU extensions to the C library that may be missing on some systems */
109 #ifndef HAVE_STRNDUP
110 extern char* strndup(const char *s, size_t n);
111 #endif /* HAVE_STRNDUP */
112
113 #ifndef HAVE_STRNLEN
114 extern size_t strnlen(const char *s, size_t maxlen);
115 #endif /* HAVE_STRNLEN */
116
117 #ifndef HAVE_USLEEP
118 #ifdef _WIN32
119 static __inline unsigned usleep(unsigned int usecs)
120 {
121 Sleep((usecs/1000));
122 return 0;
123 }
124 #else
125 #if BUILD_ECOSBOARD
126 void usleep(int us);
127 #else
128 #error no usleep defined for your platform
129 #endif
130 #endif
131 #endif /* HAVE_USLEEP */
132
133 /* Windows specific */
134 #ifdef _WIN32
135
136 #define WIN32_LEAN_AND_MEAN
137 #include <windows.h>
138 #include <time.h>
139
140 /* win32 systems do not support ETIMEDOUT */
141
142 #ifndef ETIMEDOUT
143 #define ETIMEDOUT WSAETIMEDOUT
144 #endif
145
146 #if IS_MINGW == 1
147 static __inline unsigned char inb(unsigned short int port)
148 {
149 unsigned char _v;
150 __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port));
151 return _v;
152 }
153
154 static __inline void outb(unsigned char value, unsigned short int port)
155 {
156 __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port));
157 }
158
159 #endif /* IS_MINGW */
160
161 int win_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv);
162
163 #endif /* _WIN32 */
164
165 /* generic socket functions for Windows and Posix */
166 static __inline int write_socket( int handle, const void *buffer, unsigned int count )
167 {
168 #ifdef _WIN32
169 return send(handle, buffer, count, 0);
170 #else
171 return write(handle, buffer, count);
172 #endif
173 }
174
175 static __inline int read_socket( int handle, void *buffer, unsigned int count )
176 {
177 #ifdef _WIN32
178 return recv(handle, buffer, count, 0);
179 #else
180 return read(handle, buffer, count);
181 #endif
182 }
183
184 static __inline int close_socket(int sock)
185 {
186 #ifdef _WIN32
187 return closesocket(sock);
188 #else
189 return close(sock);
190 #endif
191 }
192
193 static __inline void socket_nonblock(int fd)
194 {
195 #ifdef _WIN32
196 unsigned long nonblock = 1;
197 ioctlsocket(fd, FIONBIO, &nonblock );
198 #else
199 int oldopts = fcntl(fd, F_GETFL, 0);
200 fcntl(fd, F_SETFL, oldopts | O_NONBLOCK);
201 #endif
202 }
203
204 static __inline int socket_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *tv)
205 {
206 #ifdef _WIN32
207 return win_select(max_fd, rfds, wfds, efds, tv);
208 #else
209 return select(max_fd, rfds, wfds, efds, tv);
210 #endif
211 }
212
213 #ifndef HAVE_ELF_H
214
215 typedef struct
216 {
217 unsigned char e_ident[16]; /* Magic number and other info */
218 u16 e_type; /* Object file type */
219 u16 e_machine; /* Architecture */
220 u32 e_version; /* Object file version */
221 u32 e_entry; /* Entry point virtual address */
222 u32 e_phoff; /* Program header table file offset */
223 u32 e_shoff; /* Section header table file offset */
224 u32 e_flags; /* Processor-specific flags */
225 u16 e_ehsize; /* ELF header size in bytes */
226 u16 e_phentsize; /* Program header table entry size */
227 u16 e_phnum; /* Program header table entry count */
228 u16 e_shentsize; /* Section header table entry size */
229 u16 e_shnum; /* Section header table entry count */
230 u16 e_shstrndx; /* Section header string table index */
231 } Elf32_Ehdr;
232
233 #define ELFMAG "\177ELF"
234 #define SELFMAG 4
235
236 #define EI_CLASS 4 /* File class byte index */
237 #define ELFCLASS32 1 /* 32-bit objects */
238 #define ELFCLASS64 2 /* 64-bit objects */
239
240 #define EI_DATA 5 /* Data encoding byte index */
241 #define ELFDATA2LSB 1 /* 2's complement, little endian */
242 #define ELFDATA2MSB 2 /* 2's complement, big endian */
243
244 typedef struct
245 {
246 u32 p_type; /* Segment type */
247 u32 p_offset; /* Segment file offset */
248 u32 p_vaddr; /* Segment virtual address */
249 u32 p_paddr; /* Segment physical address */
250 u32 p_filesz; /* Segment size in file */
251 u32 p_memsz; /* Segment size in memory */
252 u32 p_flags; /* Segment flags */
253 u32 p_align; /* Segment alignment */
254 } Elf32_Phdr;
255
256 #define PT_LOAD 1 /* Loadable program segment */
257
258 #endif /* HAVE_ELF_H */
259
260 #endif /* REPLACEMENTS_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)