/[dynamips]/trunk/utils.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/utils.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (hide annotations)
Sat Oct 6 16:26:06 2007 UTC (16 years, 6 months ago) by dpavlin
Original Path: upstream/dynamips-0.2.7-RC3/utils.h
File MIME type: text/plain
File size: 9666 byte(s)
dynamips-0.2.7-RC3

1 dpavlin 1 /*
2 dpavlin 7 * Cisco router simulation platform.
3 dpavlin 1 * Copyright (c) 2005,2006 Christophe Fillot (cf@utc.fr)
4     */
5    
6     #ifndef __UTILS_H__
7     #define __UTILS_H__
8    
9     #include <stdarg.h>
10     #include <sys/types.h>
11     #include <sys/mman.h>
12     #include <sys/time.h>
13     #include <time.h>
14     #include <netinet/in.h>
15    
16     /* True/False definitions */
17     #ifndef FALSE
18     #define FALSE 0
19     #endif
20    
21     #ifndef TRUE
22     #define TRUE 1
23     #endif
24    
25 dpavlin 9 /* Host CPU Types */
26     #define CPU_x86 0
27     #define CPU_amd64 1
28     #define CPU_nojit 2
29    
30     /* Number of host registers available for JIT */
31     #if JIT_CPU == CPU_x86
32     #define JIT_HOST_NREG 8
33     #elif JIT_CPU == CPU_amd64
34     #define JIT_HOST_NREG 16
35     #else
36     #define JIT_HOST_NREG 0
37     #endif
38    
39 dpavlin 1 /* Endianness */
40     #define ARCH_BIG_ENDIAN 0x4321
41     #define ARCH_LITTLE_ENDIAN 0x1234
42    
43     #if defined(PPC) || defined(__powerpc__) || defined(__ppc__)
44     #define ARCH_BYTE_ORDER ARCH_BIG_ENDIAN
45     #elif defined(__sparc) || defined(__sparc__)
46     #define ARCH_BYTE_ORDER ARCH_BIG_ENDIAN
47     #elif defined(__alpha) || defined(__alpha__)
48     #define ARCH_BYTE_ORDER ARCH_LITTLE_ENDIAN
49     #elif defined(__i386) || defined(__i386__) || defined(i386)
50     #define ARCH_BYTE_ORDER ARCH_LITTLE_ENDIAN
51     #elif defined(__x86_64__)
52     #define ARCH_BYTE_ORDER ARCH_LITTLE_ENDIAN
53     #endif
54    
55     #ifndef ARCH_BYTE_ORDER
56     #error Please define your architecture in utils.h!
57     #endif
58    
59     /* Host to VM (big-endian) conversion functions */
60     #if ARCH_BYTE_ORDER == ARCH_BIG_ENDIAN
61     #define htovm16(x) (x)
62     #define htovm32(x) (x)
63     #define htovm64(x) (x)
64    
65     #define vmtoh16(x) (x)
66     #define vmtoh32(x) (x)
67     #define vmtoh64(x) (x)
68     #else
69     #define htovm16(x) (htons(x))
70     #define htovm32(x) (htonl(x))
71     #define htovm64(x) (swap64(x))
72    
73     #define vmtoh16(x) (ntohs(x))
74     #define vmtoh32(x) (ntohl(x))
75     #define vmtoh64(x) (swap64(x))
76     #endif
77    
78     /* Useful attributes for functions */
79     #define asmlinkage __attribute__((regparm(0)))
80     #define fastcall __attribute__((regparm(3)))
81    
82     #if __GNUC__ > 2
83     #define forced_inline inline __attribute__((always_inline))
84     #define no_inline __attribute__ ((noinline))
85     #else
86     #define forced_inline inline
87     #define no_inline
88     #endif
89    
90     #if __GNUC__ > 2
91     /* http://kerneltrap.org/node/4705 */
92     #define likely(x) __builtin_expect((x),1)
93     #define unlikely(x) __builtin_expect((x),0)
94     #else
95     #define likely(x) (x)
96     #define unlikely(x) (x)
97     #endif
98    
99     /* Common types */
100     typedef unsigned char m_uint8_t;
101     typedef signed char m_int8_t;
102    
103     typedef unsigned short m_uint16_t;
104     typedef signed short m_int16_t;
105    
106     typedef unsigned int m_uint32_t;
107     typedef signed int m_int32_t;
108    
109     typedef unsigned long long m_uint64_t;
110     typedef signed long long m_int64_t;
111    
112     typedef unsigned long m_iptr_t;
113     typedef m_uint64_t m_tmcnt_t;
114    
115     /* Forward declarations */
116 dpavlin 9 typedef struct cpu_gen cpu_gen_t;
117 dpavlin 1 typedef struct vm_instance vm_instance_t;
118 dpavlin 7 typedef struct mips64_jit_tcb mips64_jit_tcb_t;
119     typedef struct ppc32_jit_tcb ppc32_jit_tcb_t;
120 dpavlin 9 typedef struct jit_op jit_op_t;
121 dpavlin 7
122     /* Translated block function pointer */
123     typedef void (*insn_tblock_fptr)(void);
124    
125     /* Host executable page */
126 dpavlin 1 typedef struct insn_exec_page insn_exec_page_t;
127 dpavlin 7 struct insn_exec_page {
128     u_char *ptr;
129     insn_exec_page_t *next;
130     };
131 dpavlin 1
132     /* MIPS instruction */
133     typedef m_uint32_t mips_insn_t;
134    
135 dpavlin 7 /* PowerPC instruction */
136     typedef m_uint32_t ppc_insn_t;
137    
138 dpavlin 1 /* Max and min macro */
139     #define m_max(a,b) (((a) > (b)) ? (a) : (b))
140     #define m_min(a,b) (((a) < (b)) ? (a) : (b))
141    
142     /* A simple macro for adjusting pointers */
143     #define PTR_ADJUST(type,ptr,size) (type)((char *)(ptr) + (size))
144    
145     /* Size of a field in a structure */
146     #define SIZEOF(st,field) (sizeof(((st *)NULL)->field))
147    
148     /* Compute offset of a field in a structure */
149     #define OFFSET(st,f) ((long)&((st *)(NULL))->f)
150    
151     /* MMAP */
152     #ifndef MAP_ANONYMOUS
153     #define MAP_ANONYMOUS MAP_ANON
154     #endif
155    
156     /* List item */
157     typedef struct m_list m_list_t;
158     struct m_list {
159     void *data;
160     m_list_t *next;
161     };
162    
163     /* MTS mapping info */
164     typedef struct {
165     m_uint64_t vaddr;
166     m_uint64_t paddr;
167     m_uint64_t len;
168     m_uint32_t cached;
169     m_uint32_t tlb_index;
170     }mts_map_t;
171    
172 dpavlin 7 /* Invalid VTLB entry */
173     #define MTS_INV_ENTRY_MASK 0x00000001
174    
175     /* MTS entry flags */
176 dpavlin 8 #define MTS_FLAG_DEV 0x000000001 /* Virtual device used */
177     #define MTS_FLAG_COW 0x000000002 /* Copy-On-Write */
178     #define MTS_FLAG_EXEC 0x000000004 /* Exec page */
179 dpavlin 7
180     /* Virtual TLB entry (32-bit MMU) */
181     typedef struct mts32_entry mts32_entry_t;
182     struct mts32_entry {
183     m_uint32_t gvpa; /* Guest Virtual Page Address */
184     m_uint32_t gppa; /* Guest Physical Page Address */
185     m_iptr_t hpa; /* Host Page Address */
186     m_uint32_t flags; /* Flags */
187     }__attribute__ ((aligned(16)));
188    
189     /* Virtual TLB entry (64-bit MMU) */
190     typedef struct mts64_entry mts64_entry_t;
191     struct mts64_entry {
192     m_uint64_t gvpa; /* Guest Virtual Page Address */
193     m_uint64_t gppa; /* Guest Physical Page Address */
194     m_iptr_t hpa; /* Host Page Address */
195     m_uint32_t flags; /* Flags */
196     }__attribute__ ((aligned(16)));
197    
198 dpavlin 9 /* Host register allocation */
199     #define HREG_FLAG_ALLOC_LOCKED 1
200     #define HREG_FLAG_ALLOC_FORCED 2
201    
202     struct hreg_map {
203     int hreg,vreg;
204     int flags;
205     struct hreg_map *prev,*next;
206     };
207    
208 dpavlin 1 /* Global logfile */
209     extern FILE *log_file;
210    
211     /* Check status of a bit */
212     static inline int check_bit(u_int old,u_int new,u_int bit)
213     {
214     int mask = 1 << bit;
215    
216     if ((old & mask) && !(new & mask))
217     return(1); /* bit unset */
218    
219     if (!(old & mask) && (new & mask))
220     return(2); /* bit set */
221    
222     /* no change */
223     return(0);
224     }
225    
226     /* Sign-extension */
227     static forced_inline m_int64_t sign_extend(m_int64_t x,int len)
228     {
229     len = 64 - len;
230     return (x << len) >> len;
231     }
232    
233 dpavlin 7 /* Sign-extension (32-bit) */
234     static forced_inline m_int32_t sign_extend_32(m_int32_t x,int len)
235     {
236     len = 32 - len;
237     return (x << len) >> len;
238     }
239    
240 dpavlin 1 /* Extract bits from a 32-bit values */
241     static inline int bits(m_uint32_t val,int start,int end)
242     {
243     return((val >> start) & ((1 << (end-start+1)) - 1));
244     }
245    
246     /* Normalize a size */
247     static inline u_int normalize_size(u_int val,u_int nb,int shift)
248     {
249     return(((val+nb-1) & ~(nb-1)) >> shift);
250     }
251    
252     /* Convert a 16-bit number between little and big endian */
253     static forced_inline m_uint16_t swap16(m_uint16_t value)
254     {
255     return((value >> 8) | ((value & 0xFF) << 8));
256     }
257    
258     /* Convert a 32-bit number between little and big endian */
259     static forced_inline m_uint32_t swap32(m_uint32_t value)
260     {
261     m_uint32_t result;
262    
263     result = value >> 24;
264     result |= ((value >> 16) & 0xff) << 8;
265     result |= ((value >> 8) & 0xff) << 16;
266     result |= (value & 0xff) << 24;
267     return(result);
268     }
269    
270     /* Convert a 64-bit number between little and big endian */
271     static forced_inline m_uint64_t swap64(m_uint64_t value)
272     {
273     m_uint64_t result;
274    
275     result = (m_uint64_t)swap32(value & 0xffffffff) << 32;
276     result |= swap32(value >> 32);
277     return(result);
278     }
279    
280     /* Get current time in number of msec since epoch */
281     static inline m_tmcnt_t m_gettime(void)
282     {
283     struct timeval tvp;
284    
285     gettimeofday(&tvp,NULL);
286     return(((m_tmcnt_t)tvp.tv_sec * 1000) + ((m_tmcnt_t)tvp.tv_usec / 1000));
287     }
288    
289     /* Get current time in number of usec since epoch */
290     static inline m_tmcnt_t m_gettime_usec(void)
291     {
292     struct timeval tvp;
293    
294     gettimeofday(&tvp,NULL);
295     return(((m_tmcnt_t)tvp.tv_sec * 1000000) + (m_tmcnt_t)tvp.tv_usec);
296     }
297    
298 dpavlin 3 #ifdef __CYGWIN__
299     #define GET_TIMEZONE _timezone
300     #else
301     #define GET_TIMEZONE timezone
302     #endif
303    
304     /* Get current time in number of ms (localtime) */
305     static inline m_tmcnt_t m_gettime_adj(void)
306     {
307     struct timeval tvp;
308     struct tm tmx;
309     time_t gmt_adjust;
310     time_t ct;
311    
312     gettimeofday(&tvp,NULL);
313     ct = tvp.tv_sec;
314     localtime_r(&ct,&tmx);
315    
316     #if defined(__CYGWIN__) || defined(SUNOS)
317     gmt_adjust = -(tmx.tm_isdst ? GET_TIMEZONE - 3600 : GET_TIMEZONE);
318     #else
319     gmt_adjust = tmx.tm_gmtoff;
320     #endif
321    
322     tvp.tv_sec += gmt_adjust;
323     return(((m_tmcnt_t)tvp.tv_sec * 1000) + ((m_tmcnt_t)tvp.tv_usec / 1000));
324     }
325    
326 dpavlin 1 /* Add an element to a list */
327     m_list_t *m_list_add(m_list_t **head,void *data);
328    
329     /* Dynamic sprintf */
330     char *dyn_sprintf(const char *fmt,...);
331    
332     /* Split a string */
333     int m_strsplit(char *str,char delim,char **array,int max_count);
334    
335     /* Tokenize a string */
336     int m_strtok(char *str,char delim,char **array,int max_count);
337    
338     /* Quote a string */
339     char *m_strquote(char *buffer,size_t buf_len,char *str);
340    
341     /* Ugly function that dumps a structure in hexa and ascii. */
342     void mem_dump(FILE *f_output,u_char *pkt,u_int len);
343    
344     /* Logging function */
345     void m_flog(FILE *fd,char *module,char *fmt,va_list ap);
346    
347     /* Logging function */
348     void m_log(char *module,char *fmt,...);
349    
350     /* Returns a line from specified file (remove trailing '\n') */
351     char *m_fgets(char *buffer,int size,FILE *fd);
352    
353     /* Read a file and returns it in a buffer */
354     ssize_t m_read_file(char *filename,char **buffer);
355    
356     /* Allocate aligned memory */
357     void *m_memalign(size_t boundary,size_t size);
358    
359 dpavlin 3 /* Block specified signal for calling thread */
360     int m_signal_block(int sig);
361    
362     /* Unblock specified signal for calling thread */
363     int m_signal_unblock(int sig);
364    
365     /* Set non-blocking mode on a file descriptor */
366     int m_fd_set_non_block(int fd);
367    
368 dpavlin 4 /* Map a memory zone from a file */
369     u_char *memzone_map_file(int fd,size_t len);
370    
371     /* Map a memory zone from a file, with copy-on-write (COW) */
372     u_char *memzone_map_cow_file(int fd,size_t len);
373    
374     /* Create a file to serve as a memory zone */
375     int memzone_create_file(char *filename,size_t len,u_char **ptr);
376    
377     /* Open a file to serve as a COW memory zone */
378     int memzone_open_cow_file(char *filename,size_t len,u_char **ptr);
379    
380     /* Open a file and map it in memory */
381     int memzone_open_file(char *filename,u_char **ptr,off_t *fsize);
382    
383     /* Compute NVRAM checksum */
384     m_uint16_t nvram_cksum(m_uint16_t *ptr,size_t count);
385    
386 dpavlin 7 /* Byte-swap a memory block */
387     void mem_bswap32(void *ptr,size_t len);
388    
389 dpavlin 8 /* Reverse a byte */
390     m_uint8_t m_reverse_u8(m_uint8_t val);
391    
392 dpavlin 1 #endif

  ViewVC Help
Powered by ViewVC 1.1.26