blob: fe455b8a236fb12547cf6b110788af7b687de13e [file] [log] [blame]
Stefan Reinauer6ceed092013-04-08 16:55:47 -07001
2#include <arch/types.h>
3
4#ifndef __SIZE_TYPE__
5#define __SIZE_TYPE__ unsigned long
6#endif
7typedef __SIZE_TYPE__ size_t;
Stefan Reinauerf8b36502013-05-02 14:02:28 -07008/* There is a GCC macro for a size_t type, but not
9 * for a ssize_t type. Below construct tricks GCC
10 * into making __SIZE_TYPE__ signed.
11 */
12#define unsigned signed
13typedef __SIZE_TYPE__ ssize_t;
14#undef unsigned
Stefan Reinauer6ceed092013-04-08 16:55:47 -070015
16#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
Furquan Shaikh63a3e1e2015-06-11 05:17:32 -070017#define member_size(TYPE, MEMBER) (sizeof(((TYPE *) 0)->MEMBER))
Stefan Reinauer6ceed092013-04-08 16:55:47 -070018
Daisuke Nojirie0a8a882015-06-29 13:33:34 -070019#define check_member(structure, member, offset) _Static_assert( \
20 offsetof(struct structure, member) == offset, \
21 "`struct " #structure "` offset for `" #member "` is not " #offset)
22
Daisuke Nojiri03411692014-03-05 15:46:28 -080023/* Standard units. */
24#define KiB (1<<10)
25#define MiB (1<<20)
26#define GiB (1<<30)
Daisuke Nojirie0a8a882015-06-29 13:33:34 -070027
28#define KHz (1000)
29#define MHz (1000*KHz)
30#define GHz (1000*MHz)