76 lines
2.0 KiB
C
76 lines
2.0 KiB
C
#ifndef JOS_INC_TYPES_H
|
|
#define JOS_INC_TYPES_H
|
|
|
|
#ifndef NULL
|
|
#define NULL ((void*) 0)
|
|
#endif
|
|
|
|
// Represents true-or-false values
|
|
typedef _Bool bool;
|
|
enum { false, true };
|
|
|
|
// Explicitly-sized versions of integer types
|
|
typedef __signed char int8_t;
|
|
typedef unsigned char uint8_t;
|
|
typedef short int16_t;
|
|
typedef unsigned short uint16_t;
|
|
typedef int int32_t;
|
|
typedef unsigned int uint32_t;
|
|
typedef long long int64_t;
|
|
typedef unsigned long long uint64_t;
|
|
|
|
// Pointers and addresses are 32 bits long.
|
|
// We use pointer types to represent virtual addresses,
|
|
// uintptr_t to represent the numerical values of virtual addresses,
|
|
// and physaddr_t to represent physical addresses.
|
|
typedef int32_t intptr_t;
|
|
typedef uint32_t uintptr_t;
|
|
typedef uint32_t physaddr_t;
|
|
|
|
// Page numbers are 32 bits long.
|
|
typedef uint32_t ppn_t;
|
|
|
|
// size_t is used for memory object sizes.
|
|
typedef uint32_t size_t;
|
|
// ssize_t is a signed version of ssize_t, used in case there might be an
|
|
// error return.
|
|
typedef int32_t ssize_t;
|
|
|
|
// off_t is used for file offsets and lengths.
|
|
typedef int32_t off_t;
|
|
|
|
// Efficient min and max operations
|
|
#define MIN(_a, _b) \
|
|
({ \
|
|
typeof(_a) __a = (_a); \
|
|
typeof(_b) __b = (_b); \
|
|
__a <= __b ? __a : __b; \
|
|
})
|
|
#define MAX(_a, _b) \
|
|
({ \
|
|
typeof(_a) __a = (_a); \
|
|
typeof(_b) __b = (_b); \
|
|
__a >= __b ? __a : __b; \
|
|
})
|
|
|
|
// Rounding operations (efficient when n is a power of 2)
|
|
// Round down to the nearest multiple of n
|
|
#define ROUNDDOWN(a, n) \
|
|
({ \
|
|
uint32_t __a = (uint32_t) (a); \
|
|
(typeof(a)) (__a - __a % (n)); \
|
|
})
|
|
// Round up to the nearest multiple of n
|
|
#define ROUNDUP(a, n) \
|
|
({ \
|
|
uint32_t __n = (uint32_t) (n); \
|
|
(typeof(a)) (ROUNDDOWN((uint32_t) (a) + __n - 1, __n)); \
|
|
})
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
|
|
|
|
// Return the offset of 'member' relative to the beginning of a struct type
|
|
#define offsetof(type, member) ((size_t) (&((type*)0)->member))
|
|
|
|
#endif /* !JOS_INC_TYPES_H */
|