31 #ifndef CPU_X86_MM_SYSCALLS_H_
32 #define CPU_X86_MM_SYSCALLS_H_
35 #include "prot-domains.h"
38 typedef uint32_t dom_id_bitmap_t;
40 typedef struct syscalls_entrypoint {
43 } syscalls_entrypoint_t;
44 extern syscalls_entrypoint_t ATTR_KERN_ADDR_SPACE syscalls_entrypoints[];
45 extern syscalls_entrypoint_t ATTR_KERN_ADDR_SPACE syscalls_entrypoints_end[];
47 #define SYSCALLS_ACTUAL_CNT (syscalls_entrypoints_end - syscalls_entrypoints)
49 #if X86_CONF_PROT_DOMAINS != X86_CONF_PROT_DOMAINS__NONE
51 #define SYSCALLS_ALLOC_ENTRYPOINT(nm) \
52 syscalls_entrypoint_t __attribute__((section(".syscall_bss"))) \
53 ATTR_KERN_ADDR_SPACE _syscall_ent_##nm
55 #define SYSCALLS_INIT(nm) \
56 KERN_WRITEL(_syscall_ent_##nm.entrypoint, (uintptr_t)_syscall_##nm); \
57 KERN_WRITEL(_syscall_ent_##nm.doms, 0)
59 #define SYSCALLS_DEFINE(nm, ...) \
60 void _syscall_##nm(__VA_ARGS__); \
62 void _syscall_##nm(__VA_ARGS__)
64 #define SYSCALLS_DEFINE_SINGLETON(nm, dcd, ...) \
65 void _syscall_##nm(__VA_ARGS__); \
66 SYSCALLS_STUB_SINGLETON(nm, dcd); \
67 void _syscall_##nm(__VA_ARGS__)
69 #define SYSCALLS_AUTHZ_UPD(nm, drv, set) \
71 dom_id_t _sc_tmp_id; \
72 dom_id_bitmap_t _sc_tmp_bm; \
73 KERN_READL(_sc_tmp_id, (drv).dom_id); \
74 KERN_READL(_sc_tmp_bm, _syscall_ent_##nm.doms); \
76 _sc_tmp_bm |= BIT(_sc_tmp_id); \
78 _sc_tmp_bm &= ~BIT(_sc_tmp_id); \
80 KERN_WRITEL(_syscall_ent_##nm.doms, _sc_tmp_bm); \
111 #if X86_CONF_PROT_DOMAINS_MULTI_SEG
112 #define PROT_DOMAINS_VALIDATE_PTR(validated, untrusted, sz) \
113 validated = untrusted; \
114 if(((uintptr_t)(validated)) < \
115 ((2 * sizeof(uintptr_t)) + (uintptr_t)__builtin_frame_address(0))) { \
119 #define PROT_DOMAINS_VALIDATE_PTR(validated, untrusted, sz) \
120 validated = untrusted; \
121 if((((uintptr_t)(validated)) < \
122 ((2 * sizeof(uintptr_t)) + (uintptr_t)__builtin_frame_address(0))) || \
123 (((uintptr_t)&_edata_addr) <= (((uintptr_t)(validated)) + (sz)))) { \
130 #define SYSCALLS_ALLOC_ENTRYPOINT(nm)
131 #define SYSCALLS_INIT(nm)
132 #define SYSCALLS_DEFINE(nm, ...) void nm(__VA_ARGS__)
133 #define SYSCALLS_DEFINE_SINGLETON(nm, dcd, ...) void nm(__VA_ARGS__)
134 #define SYSCALLS_AUTHZ_UPD(nm, drv, set)
135 #define PROT_DOMAINS_VALIDATE_PTR(validated, untrusted, sz) validated = untrusted
139 #define SYSCALLS_AUTHZ(nm, drv) SYSCALLS_AUTHZ_UPD(nm, drv, true)
140 #define SYSCALLS_DEAUTHZ(nm, drv) SYSCALLS_AUTHZ_UPD(nm, drv, false)