MOS Source Code
Loading...
Searching...
No Matches
sysfs.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2#pragma once
3
5
7
8struct sysfs_file_t;
9
19
20typedef struct _sysfs_item
21{
25 size_t (*store)(sysfs_file_t *file, const char *buf, size_t count, off_t offset);
26 ino_t ino;
27
28 struct
29 {
30 bool (*mmap)(sysfs_file_t *file, vmap_t *vmap, off_t offset);
31 bool (*munmap)(sysfs_file_t *file, vmap_t *vmap, bool *unmapped);
32 size_t size;
33 } mem;
34
36 void (*dyn_iterate)(struct _sysfs_item *item, dentry_t *dentry, vfs_listdir_state_t *iterator_state, dentry_iterator_op op);
37 bool (*dyn_lookup)(inode_t *parent_dir, dentry_t *dentry);
38 bool (*dyn_create)(inode_t *parent_dir, dentry_t *dentry, file_type_t type, file_perm_t perm);
40
41// clang-format off
42#define SYSFS_RO_ITEM(_name, _show_fn) { .name = _name, .type = SYSFS_RO, .show = _show_fn }
43#define SYSFS_RW_ITEM(_name, _show_fn, _store_fn) { .name = _name, .type = SYSFS_RW, .show = _show_fn, .store = _store_fn }
44#define SYSFS_WO_ITEM(_name, _store_fn) { .name = _name, .type = SYSFS_WO, .store = _store_fn }
45#define SYSFS_MEM_ITEM(_name, _mmap_fn, _munmap_fn) { .name = _name, .type = SYSFS_MEM, .mem = { .mmap = _mmap_fn, .munmap = _munmap_fn } }
46#define SYSFS_DYN_ITEMS(_name, _iterate_fn, _lookup_fn) { .type = SYSFS_DYN, .dyn_iterate = _iterate_fn, .dyn_lookup = _lookup_fn }
47#define SYSFS_DYN_DIR(_name, _iterate_fn, _lookup_fn, _create_fn) { .type = SYSFS_DYN, .dyn_iterate = _iterate_fn, .dyn_lookup = _lookup_fn, .dyn_create = _create_fn }
48// clang-format on
49
50#define SYSFS_ITEM_RO_PRINTF(name, fmt, ...) \
51 static bool name(sysfs_file_t *file) \
52 { \
53 sysfs_printf(file, fmt, ##__VA_ARGS__); \
54 return true; \
55 }
56
57#define SYSFS_ITEM_RO_STRING(name, value) SYSFS_ITEM_RO_PRINTF(name, "%s\n", value)
58
59#define SYSFS_DEFINE_DIR(sysfs_name, sysfs_items) static sysfs_dir_t __sysfs_##sysfs_name(#sysfs_name, sysfs_items, MOS_ARRAY_SIZE(sysfs_items))
60
73
79void sysfs_register(sysfs_dir_t *entry);
80
87void sysfs_register_file(sysfs_dir_t *sysfs_dir, sysfs_item_t *item);
88
98
99void sysfs_file_set_data(sysfs_file_t *file, void *data);
102
103inode_t *sysfs_create_inode(file_type_t type, void *data);
104
105__printf(2, 3) ssize_t sysfs_printf(sysfs_file_t *file, const char *fmt, ...);
106ssize_t sysfs_put_data(sysfs_file_t *file, const void *data, size_t count);
u16 file_perm_t
Definition fs_types.h:52
file_type_t
Definition fs_types.h:14
MOSAPI void(1, 2) fatal_abort(const char *fmt
list_node_t list_head
A linked list head.
Definition list.hpp:23
#define should_inline
Definition mos_global.h:37
#define __printf(a, b)
Definition mos_global.h:30
basic_string_view< char > string_view
mos::basic_string< char, mos::default_allocator > string
Definition string.hpp:336
#define NULL
Definition pb_syshdr.h:46
int bool
Definition pb_syshdr.h:57
uint32_t size_t
Definition pb_syshdr.h:42
const size_t num_items
Definition sysfs.hpp:66
sysfs_item_t *const items
Definition sysfs.hpp:65
sysfs_dir_t(mos::string_view name, sysfs_item_t *items, size_t num_items)
Definition sysfs.hpp:68
mos::string name
Definition sysfs.hpp:64
list_head _dynamic_items
for internal use only
Definition sysfs.hpp:71
dentry_t * _dentry
for internal use only
Definition sysfs.hpp:70
void(* dyn_iterate)(struct _sysfs_item *item, dentry_t *dentry, vfs_listdir_state_t *iterator_state, dentry_iterator_op op)
Definition sysfs.hpp:36
sysfs_item_type_t type
Definition sysfs.hpp:23
size_t(* store)(sysfs_file_t *file, const char *buf, size_t count, off_t offset)
Definition sysfs.hpp:25
bool(* mmap)(sysfs_file_t *file, vmap_t *vmap, off_t offset)
Definition sysfs.hpp:30
size_t size
Definition sysfs.hpp:32
const mos::string name
Definition sysfs.hpp:22
bool(* munmap)(sysfs_file_t *file, vmap_t *vmap, bool *unmapped)
Definition sysfs.hpp:31
bool(* dyn_create)(inode_t *parent_dir, dentry_t *dentry, file_type_t type, file_perm_t perm)
Definition sysfs.hpp:38
ino_t ino
Definition sysfs.hpp:26
bool(* dyn_lookup)(inode_t *parent_dir, dentry_t *dentry)
Definition sysfs.hpp:37
bool(* show)(sysfs_file_t *file)
Definition sysfs.hpp:24
Definition mm.hpp:59
ssize_t sysfs_printf(sysfs_file_t *file, const char *fmt,...)
Definition sysfs.cpp:74
ssize_t sysfs_put_data(sysfs_file_t *file, const void *data, size_t count)
Definition sysfs.cpp:94
should_inline void sysfs_register_root_file(sysfs_item_t *item)
Register an entry in the sysfs root directory.
Definition sysfs.hpp:94
void sysfs_register(sysfs_dir_t *entry)
Register a sysfs directory.
Definition sysfs.cpp:49
void sysfs_file_set_data(sysfs_file_t *file, void *data)
Definition sysfs.cpp:106
void sysfs_register_file(sysfs_dir_t *sysfs_dir, sysfs_item_t *item)
Register an entry in a sysfs directory.
Definition sysfs.cpp:383
inode_t * sysfs_create_inode(file_type_t type, void *data)
Definition sysfs.cpp:376
sysfs_item_type_t
Definition sysfs.hpp:11
@ SYSFS_RW
Definition sysfs.hpp:14
@ SYSFS_MEM
memory-backed file
Definition sysfs.hpp:16
@ SYSFS_DYN
dynamic directory items
Definition sysfs.hpp:17
@ _SYSFS_INVALID
Definition sysfs.hpp:12
@ SYSFS_RO
Definition sysfs.hpp:13
@ SYSFS_WO
Definition sysfs.hpp:15
sysfs_item_t * sysfs_file_get_item(sysfs_file_t *file)
Definition sysfs.cpp:116
void * sysfs_file_get_data(sysfs_file_t *file)
Definition sysfs.cpp:111
ssize_t off_t
Definition types.h:80
signed long ssize_t
Definition types.h:79
void dentry_iterator_op(vfs_listdir_state_t *state, u64 ino, mos::string_view name, file_type_t type)
Definition vfs_types.hpp:61