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 209f0ae301SCornelia Huck #ifndef _LIBCFLAT_H_ 219f0ae301SCornelia Huck #define _LIBCFLAT_H_ 227d36db35SAvi Kivity 23*0cc3a351SSean Christopherson #ifndef __ASSEMBLER__ 24a2d06852SNikos Nikoleris 257dfe5473SSean Christopherson #include <linux/compiler.h> 267d36db35SAvi Kivity #include <stdarg.h> 2775e777a0SAndrew Jones #include <stddef.h> 2875e777a0SAndrew Jones #include <stdint.h> 29782ebe33SAndrew Jones #include <string.h> 306e44b71eSNadav Amit #include <stdbool.h> 317d36db35SAvi Kivity 3292fca209SWei Huang #define xstr(s...) xxstr(s) 3392fca209SWei Huang #define xxstr(s...) #s 340a44f220SPaolo Bonzini 35d1da56b4SAndrew Jones #define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) 36d1da56b4SAndrew Jones #define __ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) 37d1da56b4SAndrew Jones #define ALIGN(x, a) __ALIGN((x), (a)) 38f3e081d7SAaron Lewis #define ALIGN_DOWN(x, a) __ALIGN((x) - ((a) - 1), (a)) 39845d3f1fSPeter Xu #define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a) - 1)) == 0) 40845d3f1fSPeter Xu 41633e2198SPeter Xu #define MIN(a, b) ((a) < (b) ? (a) : (b)) 42633e2198SPeter Xu #define MAX(a, b) ((a) > (b) ? (a) : (b)) 43633e2198SPeter Xu 4475e777a0SAndrew Jones typedef uint8_t u8; 4575e777a0SAndrew Jones typedef int8_t s8; 4675e777a0SAndrew Jones typedef uint16_t u16; 4775e777a0SAndrew Jones typedef int16_t s16; 4875e777a0SAndrew Jones typedef uint32_t u32; 4975e777a0SAndrew Jones typedef int32_t s32; 5075e777a0SAndrew Jones typedef uint64_t u64; 5175e777a0SAndrew Jones typedef int64_t s64; 527d36db35SAvi Kivity typedef unsigned long ulong; 5375e777a0SAndrew Jones 548d2ff97fSAndrew Jones #if __SIZEOF_LONG__ == 8 55529046c3SAlex Bennée # define __PRI32_PREFIX 568d2ff97fSAndrew Jones # define __PRI64_PREFIX "l" 578d2ff97fSAndrew Jones # define __PRIPTR_PREFIX "l" 588d2ff97fSAndrew Jones #else 59529046c3SAlex Bennée #if defined(__U32_LONG_FMT__) 60529046c3SAlex Bennée # define __PRI32_PREFIX "l" 61529046c3SAlex Bennée #else 62529046c3SAlex Bennée # define __PRI32_PREFIX 63529046c3SAlex Bennée #endif 648d2ff97fSAndrew Jones # define __PRI64_PREFIX "ll" 658d2ff97fSAndrew Jones # define __PRIPTR_PREFIX 668d2ff97fSAndrew Jones #endif 67529046c3SAlex Bennée #define PRId32 __PRI32_PREFIX "d" 68529046c3SAlex Bennée #define PRIu32 __PRI32_PREFIX "u" 69529046c3SAlex Bennée #define PRIx32 __PRI32_PREFIX "x" 708d2ff97fSAndrew Jones #define PRId64 __PRI64_PREFIX "d" 718d2ff97fSAndrew Jones #define PRIu64 __PRI64_PREFIX "u" 728d2ff97fSAndrew Jones #define PRIx64 __PRI64_PREFIX "x" 738d2ff97fSAndrew Jones #define PRIxPTR __PRIPTR_PREFIX "x" 748d2ff97fSAndrew Jones 757d764581SAlexander Gordeev typedef u64 phys_addr_t; 76b8b9fcf5SAlexander Gordeev #define INVALID_PHYS_ADDR (~(phys_addr_t)0) 777d764581SAlexander Gordeev 7875e777a0SAndrew Jones extern void puts(const char *s); 791aee4297SAndrew Jones extern int __getchar(void); 801aee4297SAndrew Jones extern int getchar(void); 8196d79976SAndre Przywara extern void exit(int code) __attribute__((noreturn)); 8296d79976SAndre Przywara extern void abort(void) __attribute__((noreturn)); 831b708e8cSJason Wang extern long atol(const char *ptr); 8469205bf1SAndrew Jones extern char *getenv(const char *name); 85f3cdd159SJan Kiszka 864f4ef3a5SAndrew Jones extern int printf(const char *fmt, ...) 874f4ef3a5SAndrew Jones __attribute__((format(printf, 1, 2))); 884f4ef3a5SAndrew Jones extern int snprintf(char *buf, int size, const char *fmt, ...) 894f4ef3a5SAndrew Jones __attribute__((format(printf, 3, 4))); 904f4ef3a5SAndrew Jones extern int vsnprintf(char *buf, int size, const char *fmt, va_list va) 914f4ef3a5SAndrew Jones __attribute__((format(printf, 3, 0))); 924f4ef3a5SAndrew Jones extern int vprintf(const char *fmt, va_list va) 934f4ef3a5SAndrew Jones __attribute__((format(printf, 1, 0))); 944f4ef3a5SAndrew Jones 954a3245a1SRadim Krčmář void report_prefix_pushf(const char *prefix_fmt, ...) 964a3245a1SRadim Krčmář __attribute__((format(printf, 1, 2))); 97e7c68b43SAndrew Jones extern void report_prefix_push(const char *prefix); 98e7c68b43SAndrew Jones extern void report_prefix_pop(void); 99b2a8279bSJames Raphael Tiovalen extern void report_prefix_popn(int n); 1003064cb57SAndrew Jones extern bool report(bool pass, const char *msg_fmt, ...) 101a299895bSThomas Huth __attribute__((format(printf, 2, 3), nonnull(2))); 1023064cb57SAndrew Jones extern bool report_xfail(bool xfail, bool pass, const char *msg_fmt, ...) 103a299895bSThomas Huth __attribute__((format(printf, 3, 4), nonnull(3))); 1043064cb57SAndrew Jones extern bool report_kfail(bool kfail, bool pass, const char *msg_fmt, ...) 1057cd02206SNicholas Piggin __attribute__((format(printf, 3, 4), nonnull(3))); 1064a3245a1SRadim Krčmář extern void report_abort(const char *msg_fmt, ...) 10796d79976SAndre Przywara __attribute__((format(printf, 1, 2))) 10896d79976SAndre Przywara __attribute__((noreturn)); 1094a3245a1SRadim Krčmář extern void report_skip(const char *msg_fmt, ...) 1104a3245a1SRadim Krčmář __attribute__((format(printf, 1, 2))); 1114a3245a1SRadim Krčmář extern void report_info(const char *msg_fmt, ...) 1124a3245a1SRadim Krčmář __attribute__((format(printf, 1, 2))); 1137b18fa38SJanis Schoetterl-Glausch extern void report_pass(const char *msg_fmt, ...) 1147b18fa38SJanis Schoetterl-Glausch __attribute__((format(printf, 1, 2))); 1157b18fa38SJanis Schoetterl-Glausch extern void report_fail(const char *msg_fmt, ...) 1167b18fa38SJanis Schoetterl-Glausch __attribute__((format(printf, 1, 2))); 1177b18fa38SJanis Schoetterl-Glausch extern void report_passed(void); 118e7c68b43SAndrew Jones extern int report_summary(void); 119ce42dc88SAndrew Jones 120875b97b3SPeter Feiner bool simple_glob(const char *text, const char *pattern); 121875b97b3SPeter Feiner 12252266791SPeter Feiner extern void dump_stack(void); 12352266791SPeter Feiner extern void dump_frame_stack(const void *instruction, const void *frame); 12452266791SPeter Feiner 12575e777a0SAndrew Jones #define ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0])) 12675e777a0SAndrew Jones 12775e777a0SAndrew Jones #define container_of(ptr, type, member) ({ \ 12875e777a0SAndrew Jones const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 12975e777a0SAndrew Jones (type *)( (char *)__mptr - offsetof(type,member) );}) 13075e777a0SAndrew Jones 131ce42dc88SAndrew Jones #define assert(cond) \ 132ce42dc88SAndrew Jones do { \ 133fa7ac722SPeter Feiner if (!(cond)) { \ 134b34d0ebcSPeter Feiner printf("%s:%d: assert failed: %s\n", \ 135fa7ac722SPeter Feiner __FILE__, __LINE__, #cond); \ 136fa7ac722SPeter Feiner dump_stack(); \ 137ce42dc88SAndrew Jones abort(); \ 138fa7ac722SPeter Feiner } \ 139ce42dc88SAndrew Jones } while (0) 140ce42dc88SAndrew Jones 141fb480798SPeter Feiner #define assert_msg(cond, fmt, args...) \ 142fb480798SPeter Feiner do { \ 143fb480798SPeter Feiner if (!(cond)) { \ 144ecec0cdfSPeter Feiner printf("%s:%d: assert failed: %s: " fmt "\n", \ 145fb480798SPeter Feiner __FILE__, __LINE__, #cond, ## args); \ 146fb480798SPeter Feiner dump_stack(); \ 147fb480798SPeter Feiner abort(); \ 148fb480798SPeter Feiner } \ 149fb480798SPeter Feiner } while (0) 150fb480798SPeter Feiner 151840375e1SPeter Feiner /* 152840375e1SPeter Feiner * One byte per bit, a ' between each group of 4 bits, and a null terminator. 153840375e1SPeter Feiner */ 154840375e1SPeter Feiner #define BINSTR_SZ (sizeof(unsigned long) * 8 + sizeof(unsigned long) * 2) 155840375e1SPeter Feiner void binstr(unsigned long x, char out[BINSTR_SZ]); 156840375e1SPeter Feiner void print_binstr(unsigned long x); 157840375e1SPeter Feiner 158*0cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */ 159a2d06852SNikos Nikoleris 160a2d06852SNikos Nikoleris #define SZ_256 (1 << 8) 161a2d06852SNikos Nikoleris #define SZ_4K (1 << 12) 162a2d06852SNikos Nikoleris #define SZ_8K (1 << 13) 163a2d06852SNikos Nikoleris #define SZ_16K (1 << 14) 164a2d06852SNikos Nikoleris #define SZ_64K (1 << 16) 16513182cd7SNikos Nikoleris #define SZ_128K (1 << 17) 166cb8f060dSClaudio Imbrenda #define SZ_1M (1 << 20) 167a2d06852SNikos Nikoleris #define SZ_2M (1 << 21) 168a2d06852SNikos Nikoleris #define SZ_1G (1 << 30) 169cb8f060dSClaudio Imbrenda #define SZ_2G (1ul << 31) 170a2d06852SNikos Nikoleris 1717d36db35SAvi Kivity #endif 172