17d36db35SAvi Kivity /* 27d36db35SAvi Kivity * This program is free software; you can redistribute it and/or modify 37d36db35SAvi Kivity * it under the terms of the GNU General Public License, version 2, as 47d36db35SAvi Kivity * published by the Free Software Foundation. 57d36db35SAvi Kivity * 67d36db35SAvi Kivity * This program is distributed in the hope that it will be useful, 77d36db35SAvi Kivity * but WITHOUT ANY WARRANTY; without even the implied warranty of 87d36db35SAvi Kivity * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 97d36db35SAvi Kivity * GNU General Public License for more details. 107d36db35SAvi Kivity * 117d36db35SAvi Kivity * You should have received a copy of the GNU General Public License 127d36db35SAvi Kivity * along with this program; if not, write to the Free Software 137d36db35SAvi Kivity * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 147d36db35SAvi Kivity * 157d36db35SAvi Kivity * Copyright IBM Corp. 2008 167d36db35SAvi Kivity * 177d36db35SAvi Kivity * Authors: Hollis Blanchard <hollisb@us.ibm.com> 187d36db35SAvi Kivity */ 197d36db35SAvi Kivity 207d36db35SAvi Kivity #ifndef __LIBCFLAT_H 217d36db35SAvi Kivity #define __LIBCFLAT_H 227d36db35SAvi Kivity 237d36db35SAvi Kivity #include <stdarg.h> 2475e777a0SAndrew Jones #include <stddef.h> 2575e777a0SAndrew Jones #include <stdint.h> 26782ebe33SAndrew Jones #include <string.h> 277d36db35SAvi Kivity 28f7f76b85SAndrew Jones #define __unused __attribute__((__unused__)) 29f7f76b85SAndrew Jones 300a44f220SPaolo Bonzini #define xstr(s) xxstr(s) 310a44f220SPaolo Bonzini #define xxstr(s) #s 320a44f220SPaolo Bonzini 33d1da56b4SAndrew Jones #define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) 34d1da56b4SAndrew Jones #define __ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) 35d1da56b4SAndrew Jones #define ALIGN(x, a) __ALIGN((x), (a)) 36d1da56b4SAndrew Jones 3775e777a0SAndrew Jones typedef uint8_t u8; 3875e777a0SAndrew Jones typedef int8_t s8; 3975e777a0SAndrew Jones typedef uint16_t u16; 4075e777a0SAndrew Jones typedef int16_t s16; 4175e777a0SAndrew Jones typedef uint32_t u32; 4275e777a0SAndrew Jones typedef int32_t s32; 4375e777a0SAndrew Jones typedef uint64_t u64; 4475e777a0SAndrew Jones typedef int64_t s64; 457d36db35SAvi Kivity typedef unsigned long ulong; 4675e777a0SAndrew Jones 477d36db35SAvi Kivity typedef _Bool bool; 487d36db35SAvi Kivity #define false 0 4975e777a0SAndrew Jones #define true 1 507d36db35SAvi Kivity 518d2ff97fSAndrew Jones #if __SIZEOF_LONG__ == 8 528d2ff97fSAndrew Jones # define __PRI64_PREFIX "l" 538d2ff97fSAndrew Jones # define __PRIPTR_PREFIX "l" 548d2ff97fSAndrew Jones #else 558d2ff97fSAndrew Jones # define __PRI64_PREFIX "ll" 568d2ff97fSAndrew Jones # define __PRIPTR_PREFIX 578d2ff97fSAndrew Jones #endif 588d2ff97fSAndrew Jones #define PRId64 __PRI64_PREFIX "d" 598d2ff97fSAndrew Jones #define PRIu64 __PRI64_PREFIX "u" 608d2ff97fSAndrew Jones #define PRIx64 __PRI64_PREFIX "x" 618d2ff97fSAndrew Jones #define PRIxPTR __PRIPTR_PREFIX "x" 628d2ff97fSAndrew Jones 6375e777a0SAndrew Jones extern void puts(const char *s); 647d36db35SAvi Kivity extern void exit(int code); 65ce42dc88SAndrew Jones extern void abort(void); 661b708e8cSJason Wang extern long atol(const char *ptr); 67f3cdd159SJan Kiszka 684f4ef3a5SAndrew Jones extern int printf(const char *fmt, ...) 694f4ef3a5SAndrew Jones __attribute__((format(printf, 1, 2))); 704f4ef3a5SAndrew Jones extern int snprintf(char *buf, int size, const char *fmt, ...) 714f4ef3a5SAndrew Jones __attribute__((format(printf, 3, 4))); 724f4ef3a5SAndrew Jones extern int vsnprintf(char *buf, int size, const char *fmt, va_list va) 734f4ef3a5SAndrew Jones __attribute__((format(printf, 3, 0))); 744f4ef3a5SAndrew Jones extern int vprintf(const char *fmt, va_list va) 754f4ef3a5SAndrew Jones __attribute__((format(printf, 1, 0))); 764f4ef3a5SAndrew Jones 77e7c68b43SAndrew Jones extern void report_prefix_push(const char *prefix); 78e7c68b43SAndrew Jones extern void report_prefix_pop(void); 79e7c68b43SAndrew Jones extern void report(const char *msg_fmt, bool pass, ...); 80e7c68b43SAndrew Jones extern void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...); 81e7c68b43SAndrew Jones extern void report_abort(const char *msg_fmt, ...); 82e7c68b43SAndrew Jones extern int report_summary(void); 83ce42dc88SAndrew Jones 8452266791SPeter Feiner extern void dump_stack(void); 8552266791SPeter Feiner extern void dump_frame_stack(const void *instruction, const void *frame); 8652266791SPeter Feiner 8775e777a0SAndrew Jones #define ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0])) 8875e777a0SAndrew Jones 8975e777a0SAndrew Jones #define container_of(ptr, type, member) ({ \ 9075e777a0SAndrew Jones const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 9175e777a0SAndrew Jones (type *)( (char *)__mptr - offsetof(type,member) );}) 9275e777a0SAndrew Jones 93ce42dc88SAndrew Jones #define assert(cond) \ 94ce42dc88SAndrew Jones do { \ 95*fa7ac722SPeter Feiner if (!(cond)) { \ 96b34d0ebcSPeter Feiner printf("%s:%d: assert failed: %s\n", \ 97*fa7ac722SPeter Feiner __FILE__, __LINE__, #cond); \ 98*fa7ac722SPeter Feiner dump_stack(); \ 99ce42dc88SAndrew Jones abort(); \ 100*fa7ac722SPeter Feiner } \ 101ce42dc88SAndrew Jones } while (0) 102ce42dc88SAndrew Jones 1037d36db35SAvi Kivity #endif 104