1/* @title: Per-Domain dynamic objects */
2#pragma once
3#include <compiler.h>
4#include <linker/symbols.h>
5#include <smp/domain.h>
6#include <stddef.h>
7#include <stdint.h>
8
9struct perdomain_descriptor;
10typedef void (*perdomain_descriptor_constructor)(void *, size_t);
11
12struct perdomain_descriptor {
13 const char *name;
14 size_t size;
15 size_t align;
16 void **perdomain_ptrs;
17 perdomain_descriptor_constructor constructor;
18};
19
20LINKER_SECTION_DEFINE(struct perdomain_descriptor, perdomain_desc);
21
22#define PERDOMAIN_DECLARE(__n, __type, __ctor) \
23 extern __type __perdomain_##__n; \
24 static void __perdomain_ctor_##__n(void *inst, size_t cpu) { \
25 if ((__ctor) != NULL) \
26 __ctor((__type *) inst, cpu); \
27 } \
28 LINKER_SECTION_OBJECT(struct perdomain_descriptor, perdomain_desc) \
29 __perdomain_desc_##__n = { \
30 .name = #__n, \
31 .size = sizeof(__type), \
32 .align = _Alignof(__type), \
33 .perdomain_ptrs = NULL, \
34 .constructor = __perdomain_ctor_##__n, \
35 }; \
36 __type __perdomain_##__n
37
38void perdomain_obj_init(void);
39
40#define PERDOMAIN_PTR_FOR_DOMAIN(name, d) \
41 ((typeof(__perdomain_##name) *) __perdomain_desc_##name.perdomain_ptrs[d])
42#define PERDOMAIN_READ_FOR_DOMAIN(name, d) \
43 (*((typeof(__perdomain_##name) *) PERDOMAIN_PTR_FOR_DOMAIN(name, d)))
44
45#define PERDOMAIN_PTR(name) PERDOMAIN_PTR_FOR_DOMAIN(name, domain_local_id())
46#define PERDOMAIN_READ(name) \
47 (*((typeof(__perdomain_##name) *) PERDOMAIN_PTR(name)))
48
49#define PERDOMAIN_WRITE(name, val) (PERDOMAIN_READ(name) = (val))
50