vmm: refactor userspace's emsr_fakewrite()
[akaros.git] / user / vmm / include / vmm / util.h
1 /* Copyright (c) 2015 Google Inc.
2  * Ron Minnich <rminnich@google.com>
3  * See LICENSE for details.
4  *
5  * util.h */
6
7 #pragma once
8
9 #include <vmm/sched.h>
10 #include <parlib/stdio.h>
11
12 /* Test for alignment, e.g. 2^6 */
13 #define ALIGNED(p, a)   (!(((uintptr_t)(p)) & ((a)-1)))
14 /* Aligns x up to the mask, e.g. (2^6 - 1) (round up if any mask bits are set)*/
15 #define __ALIGN_MASK(x, mask) (((uintptr_t)(x) + (mask)) & ~(mask))
16 /* Aligns x up to the alignment, e.g. 2^6. */
17 #define ALIGN(x, a) ((typeof(x)) __ALIGN_MASK(x, (a) - 1))
18 /* Aligns x down to the mask, e.g. (2^6 - 1)
19  * (round down if any mask bits are set)*/
20 #define __ALIGN_MASK_DOWN(x, mask) ((uintptr_t)(x) & ~(mask))
21 /* Aligns x down to the alignment, e.g. 2^6. */
22 #define ALIGN_DOWN(x, a) ((typeof(x)) __ALIGN_MASK_DOWN(x, (a) - 1))
23 /* Will return false for 0.  Debatable, based on what you want. */
24 #define IS_PWR2(x) ((x) && !((x) & (x - 1)))
25
26 ssize_t cat(char *file, void *where, size_t size);
27 void backtrace_guest_thread(FILE *f, struct guest_thread *vm_thread);