Bitdefender Hypervisor Memory Introspection
common.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Bitdefender
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #ifndef _COMMON_H_
6 #define _COMMON_H_
7 
8 #include <stdint.h>
9 #include <signal.h>
10 #include <stddef.h>
11 #include <stdbool.h>
12 #include <errno.h>
13 
14 #define MAX_ERRNO 4095
15 #define GFP_KERNEL 0x14000c0
16 
17 #define O_RDONLY 00000000
18 #define O_WRONLY 00000001
19 #define O_RDWR 00000002
20 #define O_CREAT 00000100
21 #define O_EXCL 00000200
22 #define O_TRUNC 00001000
23 
24 #define S_IRWXU 00700
25 #define S_IRUSR 00400
26 #define S_IWUSR 00200
27 #define S_IXUSR 00100
28 #define S_IRWXG 00070
29 #define S_IRGRP 00040
30 #define S_IWGRP 00020
31 #define S_IXGRP 00010
32 #define S_IRWXO 00007
33 #define S_IROTH 00004
34 #define S_IWOTH 00002
35 #define S_IXOTH 00001
36 
37 #define UMH_NO_WAIT 0
38 #define UMH_WAIT_EXEC 1
39 #define UMH_WAIT_PROC 2
40 #define UMH_KILLABLE 4
41 #define LIX_NAME_MAX 128
42 
43 #define __VMALLOC_BASE_L4 0xffffc90000000000UL
44 #define __VMALLOC_BASE_L5 0xffa0000000000000UL
45 
46 #define VMALLOC_SIZE_TB_L4 32UL
47 #define VMALLOC_SIZE_TB_L5 12800UL
48 
49 #define __VMEMMAP_BASE_L4 0xffffea0000000000UL
50 #define __VMEMMAP_BASE_L5 0xffd4000000000000UL
51 
52 # define VMALLOC_START __VMALLOC_BASE_L4
53 # define VMALLOC_SIZE_TB VMALLOC_SIZE_TB_L4
54 # define VMEMMAP_START __VMEMMAP_BASE_L4
55 
56 #define VMALLOC_END (VMALLOC_START + (VMALLOC_SIZE_TB << 40) - 1)
57 
58 #define PAGE_KERNEL_EXEC 0x163
59 
60 #define KERNEL_VERSION(K, Patch, Sublevel) ((Sublevel) | ((Patch) << 16) | ((K) << 24))
61 
62 # define __unreachable __builtin_unreachable()
63 # define __likely(x) __builtin_expect(!!(x), 1)
64 # define __unlikely(x) __builtin_expect(!!(x), 0)
65 
66 #define IS_ERR_VALUE(x) __unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO)
67 
68 #define BIT(x) (1ULL << (x))
69 #define UNUSED_PARAMETER(P) ((void)(P))
70 #define PAGE_SIZE 0x1000
71 
72 // The default alignment of agents should be 1, since we don't have that much space and speed insn't a real issue
73 #define __fn_aligned __attribute__((aligned(1)))
74 #define __fn_save_all __attribute__((no_caller_saved_registers))
75 
76 #define __section(S) __attribute__((section (S)))
77 
78 #define __default_fn_attr __fn_save_all __fn_aligned
79 #define __fn_naked __attribute__((naked))
80 #define __fn_section(x) __attribute__((__section__(x)))
81 
82 #define __aligned(x) __attribute__((aligned(x)))
83 
89 #define __agent_data(x) __section("." x "_data") __aligned(1)
90 
96 #define __agent_text(x) __default_fn_attr __section("." x "_text")
97 
103 #define __agent_trampoline(x) __fn_naked __section("." x "_trampoline")
104 
106 #define __agent_exit(x) \
107  asm(".global __exit_" x); \
108  asm("__exit_" x ":"); \
109  asm("int3")
110 
112 #define GNUASM_DEFINE_STR(SYMBOL, STR) \
113  asm volatile ("#define " SYMBOL " " #STR);
114 
116 #define GNUASM_DEFINE_VAL(SYMBOL, VALUE) \
117  asm volatile ("#define " SYMBOL " %0" :: "n"(VALUE))
118 
120 #define __exit \
121  asm(".global __exit"); \
122  asm("__exit:"); \
123  asm("int3")
124 
126 #define __do_exit(address, do_exit_fn, vfree_fn) \
127  asm volatile("mov rdi, %[_address];" \
128  "push %[_do_exit_fn];" \
129  "jmp %[_vfree_fn];" \
130  : : [_address] "rm" (address), [_do_exit_fn] "rm"(do_exit_fn), [_vfree_fn] "rm"(vfree_fn) :)
131 
132 
134 #define __breakpoint_param_1(param) \
135  register size_t __p1 asm("r8") = (size_t)(param); asm volatile("" :: "r" (__p1));
136 
138 #define __breakpoint_param_2(param) \
139  register size_t __p2 asm("r9") = (size_t)(param); asm volatile("" :: "r" (__p2));
140 
142 #define __breakpoint_param_3(param) \
143  register size_t __p3 asm("r10") = (size_t)(param); asm volatile("" :: "r" (__p3));
144 
146 #define __breakpoint_param_4(param) \
147  register size_t __p4 asm("r11") = (size_t)(param); asm volatile("" :: "r" (__p4));
148 
150 #define __breakpoint_param_5(param) \
151  register size_t __p5 asm("r12") = (size_t)(param); asm volatile("" :: "r" (__p5));
152 
154 #define __breakpoint_param_6(param) \
155  register size_t __p6 asm("r13") = (size_t)(param); asm volatile("" :: "r" (__p6));
156 
158 #define __breakpoint_param_7(param) \
159  register size_t __p7 asm("r14") = (size_t)(param); asm volatile("" :: "r" (__p7));
160 
162 #define __breakpoint_param_8(param) \
163  register size_t __p8 asm("r15") = (size_t)(param); asm volatile("" :: "r" (__p8));
164 
165 
167 static inline unsigned long breakpoint(unsigned long token)
171 {
172  asm volatile("int3" : "+a"(token) : );
173  return token;
174 }
175 
177 #define breakpoint_1(token, p1) \
178 ({ \
179  __breakpoint_param_1(p1); \
180  breakpoint(token); \
181 })
182 
183 
185 #define breakpoint_2(token, p1, p2) \
186 ({ \
187  __breakpoint_param_1(p1); \
188  __breakpoint_param_2(p2); \
189  breakpoint(token); \
190 })
191 
193 #define breakpoint_3(token, p1, p2, p3) \
194 ({ \
195  __breakpoint_param_1(p1); \
196  __breakpoint_param_2(p2); \
197  __breakpoint_param_3(p3); \
198  breakpoint(token); \
199 })
200 
202 #define breakpoint_4(token, p1, p2, p3, p4) \
203 ({ \
204  __breakpoint_param_1(p1); \
205  __breakpoint_param_2(p2); \
206  __breakpoint_param_3(p3); \
207  __breakpoint_param_4(p4); \
208  breakpoint(token); \
209 })
210 
212 #define breakpoint_5(token, p1, p2, p3, p4, p5) \
213 ({ \
214  __breakpoint_param_1(p1); \
215  __breakpoint_param_2(p2); \
216  __breakpoint_param_3(p3); \
217  __breakpoint_param_4(p4); \
218  __breakpoint_param_5(p5); \
219  breakpoint(token); \
220 })
221 
223 #define breakpoint_6(token, p1, p2, p3, p4, p5, p6) \
224 ({ \
225  __breakpoint_param_1(p1); \
226  __breakpoint_param_2(p2); \
227  __breakpoint_param_3(p3); \
228  __breakpoint_param_4(p4); \
229  __breakpoint_param_5(p5); \
230  __breakpoint_param_6(p6); \
231  breakpoint(token); \
232 })
233 
234 #endif // !_COMMON_H_
struct data::@0 token
The tokens used to communicate with Intocore.
static __default_fn_attr unsigned long breakpoint(unsigned long token)
Generate INT3 instruction for hypercall.
Definition: common.h:167
#define __default_fn_attr
Definition: common.h:78