1 
2 #ifndef __SYS_SYSCTL_H__
3 #define __SYS_SYSCTL_H__
4 
5 #include <stdbool.h>
6 
7 /*
8  * System Control Macros
9  * SYSCTL_STR(PATH, FLAGS, DESCRIPTION, DEFAULT)
10  * SYSCTL_INT(PATH, FLAGS, DESCRIPTION, DEFAULT)
11  * SYSCTL_BOOL(PATH, FLAGS, DESCRIPTION, DEFAULT)
12  * SYSCTL_END()
13  */
14 
15 #define SYSCTL_TYPE_INVALID	0
16 #define SYSCTL_TYPE_STR		1
17 #define SYSCTL_TYPE_INT		2
18 #define SYSCTL_TYPE_BOOL	3
19 
20 #define SYSCTL_FLAG_RO		1
21 #define SYSCTL_FLAG_RW		2
22 
23 #define SYSCTL_LIST \
24     SYSCTL_STR(kern_ostype, SYSCTL_FLAG_RO, "OS Type", "Castor") \
25     SYSCTL_INT(kern_hz, SYSCTL_FLAG_RW, "Tick frequency", 100) \
26     SYSCTL_INT(time_tzadj, SYSCTL_FLAG_RW, "Time zone offset in seconds", 0) \
27     SYSCTL_INT(log_syscall, SYSCTL_FLAG_RW, "Syscall log level", 1) \
28     SYSCTL_INT(log_loader, SYSCTL_FLAG_RW, "Loader log level", 1) \
29     SYSCTL_INT(log_vfs, SYSCTL_FLAG_RW, "VFS log level", 1) \
30     SYSCTL_INT(log_o2fs, SYSCTL_FLAG_RW, "O2FS log level", 0) \
31     SYSCTL_INT(log_ide, SYSCTL_FLAG_RW, "IDE log level", 0)
32 
33 #define SYSCTL_STR_MAXLENGTH	128
34 
35 typedef struct SysCtlString {
36     char	path[64];
37     char	value[SYSCTL_STR_MAXLENGTH];
38 } SysCtlString;
39 
40 typedef struct SysCtlInt {
41     char	path[64];
42     int64_t	value;
43 } SysCtlInt;
44 
45 typedef struct SysCtlBool {
46     char	path[64];
47     bool	value;
48 } SysCtlBool;
49 
50 #define SYSCTL_STR(_PATH, _FLAGS, _DESCRIPTION, _DEFAULT) \
51 extern SysCtlString SYSCTL_##_PATH;
52 #define SYSCTL_INT(_PATH, _FLAGS, _DESCRIPTION, _DEFAULT) \
53 extern SysCtlInt SYSCTL_##_PATH;
54 #define SYSCTL_BOOL(_PATH, _FLAGS, _DESCRIPTION, _DEFAULT) \
55 extern SysCtlBool SYSCTL_##_PATH;
56 SYSCTL_LIST
57 #undef SYSCTL_STR
58 #undef SYSCTL_INT
59 #undef SYSCTL_BOOL
60 
61 #define SYSCTL_GETSTR(_PATH) SYSCTL_##_PATH.value
62 #define SYSCTL_SETSTR(_PATH, _VALUE) strncpy(SYSCTL_##_PATH.value, _VALUE, SYSCTL_STR_MAXLENGTH);
63 #define SYSCTL_GETINT(_PATH) SYSCTL_##_PATH.value
64 #define SYSCTL_SETINT(_PATH, _VALUE) SYSCTL_##_PATH.value = _VALUE
65 #define SYSCTL_GETBOOL(_PATH) SYSCTL_##_PATH.value
66 #define SYSCTL_SETBOOL(_PATH, _VALUE) SYSCTL_##_PATH.value = _VALUE
67 
68 uint64_t SysCtl_GetType(const char *node);
69 void *SysCtl_GetObject(const char *node);
70 uint64_t SysCtl_SetObject(const char *node, void *obj);
71 
72 #endif /* __SYS_SYSCTL_H__ */
73 
74