XenevaOS
Loading...
Searching...
No Matches
bordoisila_ptr.h
Go to the documentation of this file.
1
32#ifndef __BORDOISILA_PTR_H__
33#define __BORDOISILA_PTR_H__
34
35#include <stdint.h>
36#include <aurora.h>
37#include <Mm/vmmngr.h>
38
39#ifndef __BORDOISILA_PTR_MIN
40#define __BORDOISILA_PTR_MIN 0x10000ULL
41#endif
42#ifndef __BORDOISILA_PTR_USER_MAX
43#define __BORDOISILA_PTR_USER_MAX 0x0000FFFFFFFFFFFFULL /* TTBR0 range, 48-bit VA */
44#endif
45/*
46 * Kernel memory layout, low to high, fixed for now, should be randomized:
47 * 0xFFFF800000000000 PHYSICAL_MEM_BASE
48 * 0xFFFFC00000000000 kernel image base .text/.data/.bss (static objects live here)
49 * 0xFFFFE00000000000 KERNEL_BASE_ADDRESS kmalloc/tlsf heap base
50 * 0xFFFFFF1000000000 MMIO_BASE AuMapMMIO()
51 */
52#ifndef __BORDOISILA_PTR_PHYS_BASE
53#define __BORDOISILA_PTR_PHYS_BASE 0xFFFF800000000000ULL
54#endif
55#ifndef __BORDOISILA_PTR_KIMG_BASE
56#define __BORDOISILA_PTR_KIMG_BASE 0xFFFFC00000000000ULL
57#endif
58#ifndef __BORDOISILA_PTR_HEAP_BASE
59#define __BORDOISILA_PTR_HEAP_BASE 0xFFFFE00000000000ULL
60#endif
61#ifndef __BORDOISILA_PTR_HEAP_END
62#define __BORDOISILA_PTR_HEAP_END 0xFFFFFF1000000000ULL
63#endif
64#ifndef __BORDOISILA_PTR_KERN_MAX
65#define __BORDOISILA_PTR_KERN_MAX 0xFFFFFFFFFFFFEFFFULL
66#endif
67#define __BORDOISILA_PTR_KERN_MIN __BORDOISILA_PTR_PHYS_BASE
68
69#define __BORDOISILA_PTR_REPEATED_BYTE(v) \
70 ((uint64_t)(v) == (((uint64_t)(v) & 0xFFULL) * 0x0101010101010101ULL))
71
72#define __BORDOISILA_PTR_REPEATED_WORD(v) \
73 ((((uint64_t)(v) >> 32) == ((uint64_t)(v) & 0xFFFFFFFFULL)) || \
74 (((uint64_t)(v) & 0xFFFFFFFFULL) == 0xFFFFFFFFULL))
75
76#define __BORDOISILA_PTR_POISONED(v) \
77 ((uint64_t)(v) == 0xDEADBEEFDEADBEEFULL || (uint64_t)(v) == 0xDEADDEADDEADDEADULL || \
78 (uint64_t)(v) == 0xBAADF00DBAADF00DULL || (uint64_t)(v) == 0xFEEEFEEEFEEEFEEEULL || \
79 (uint64_t)(v) == 0xDEADBEEFULL || (uint64_t)(v) == 0xBAADF00DULL)
80
81#define __BORDOISILA_PTR_VALIDATE(p) \
82 ({ \
83 uint64_t _v = (uint64_t)(uintptr_t)(p); \
84 (_v >= __BORDOISILA_PTR_MIN) && !__BORDOISILA_PTR_REPEATED_BYTE(_v) && \
85 !__BORDOISILA_PTR_REPEATED_WORD(_v) && !__BORDOISILA_PTR_POISONED(_v) && \
86 ((_v <= __BORDOISILA_PTR_USER_MAX) || \
87 (_v >= __BORDOISILA_PTR_KERN_MIN && _v <= __BORDOISILA_PTR_KERN_MAX)); \
88 })
89
90#define __BORDOISILA_HEAP_PTR_VALIDATE(p) \
91 ({ \
92 uint64_t _h = (uint64_t)(uintptr_t)(p); \
93 __BORDOISILA_PTR_OK(_h) && \
94 _h >= __BORDOISILA_PTR_HEAP_BASE&& _h < __BORDOISILA_PTR_HEAP_END; \
95 })
96
97#define __BORDOISILA_PHYS_PTR_VALIDATE(p) \
98 ({ \
99 uint64_t _f = (uint64_t)(uintptr_t)(p); \
100 __BORDOISILA_PTR_VALIDATE(_f) && \
101 _f >= __BORDOISILA_PTR_PHYS_BASE&& _f < __BORDOISILA_PTR_KIMG_BASE; \
102 })
103
104#define __BORDOISILA_KE_IMAGE_PTR_VALIDATE(p) \
105 ({ \
106 uint64_t _i = (uint64_t)(uintptr_t)(p); \
107 __BORDOISILA_PTR_VALIDATE(_i) && \
108 _i >= __BORDOISILA_PTR_KIMG_BASE&& _i < __BORDOISILA_PTR_HEAP_BASE; \
109 })
110
111#define __BORDOISILA_KE_PTR_VALIDATE(p) \
112 ({ \
113 uint64_t _k = (uint64_t)(uintptr_t)(p); \
114 __BORDOISILA_HEAP_PTR_VALIDATE(_k) || __BORDOISILA_PHYS_PTR_VALIDATE(_k) || \
115 __BORDOISILA_KIMG_PTR_VALIDATE(_k); \
116 })
117
118/* User-only. */
119#define __BORDOISILA_UPTR_VALIDATE(p) \
120 ({ \
121 uint64_t _u = (uint64_t)(uintptr_t)(p); \
122 __BORDOISILA_PTR_VALIDATE(_u) && _u <= __BORDOISILA_PTR_USER_MAX; \
123 })
124
125/* User buffer: pointer ok, in user range, and [p, p+len) cannot wrap or reach kernel space. */
126#define __BORDOISILA_UBUF_VALIDATE(p, len) \
127 ({ \
128 uint64_t _bp = (uint64_t)(uintptr_t)(p); \
129 uint64_t _bl = (uint64_t)(len); \
130 __BORDOISILA_UPTR_VALIDATE(_bp) && _bl <= (__BORDOISILA_PTR_USER_MAX - _bp + 1ULL); \
131 })
132
133#define __BORDOISILA_PTR_VALIDATE_ALIGNED(p, align) \
134 (__BORDOISILA_PTR_VALIDATE(p) && (((uintptr_t)(p) & ((align) - 1)) == 0))
135
136#define __BORDOISILA_RETURN_ON_BADPTR(p, ret) \
137 do { \
138 if (!__BORDOISILA_PTR_VALIDATE(p)) \
139 return (ret); \
140 } while (0)
141#define __BORDOISILA_CONTINUE_IF_BADPTR(p) \
142 if (!__BORDOISILA_PTR_VALIDATE(p)) \
143 continue
144#endif