PatchworkOS  3984a1d
A non-POSIX operating system.
Loading...
Searching...
No Matches
const.c
Go to the documentation of this file.
1#include <kernel/fs/devfs.h>
2#include <kernel/fs/vfs.h>
3#include <kernel/log/log.h>
4#include <kernel/log/panic.h>
5#include <kernel/mem/vmm.h>
9
10#include <stdint.h>
11#include <string.h>
12
13/**
14 * @brief Constant devices
15 * @defgroup modules_drivers_const Constant Devices
16 * @ingroup modules_drivers
17 *
18 * This module provides the constant devices which provide user space with its primary means of allocating memory and
19 * obtaining constant data.
20 *
21 * The constant devices are exposed under the `/dev/const/` directory:
22 * - `/dev/const/one`: A readable and mappable file that returns bytes with all bits set to 1.
23 * - `/dev/const/zero`: A readable and mappable file that returns bytes with all bits set to 0.
24 * - `/dev/const/null`: A readable and writable file that discards all written data and returns EOF on read.
25 *
26 * @{
27 */
28
33
34static uint64_t const_one_read(file_t* file, void* buffer, size_t count, size_t* offset)
35{
36 UNUSED(file);
37
38 memset(buffer, -1, count);
39 *offset += count;
40 return count;
41}
42
43static void* const_one_mmap(file_t* file, void* addr, size_t length, size_t* offset, pml_flags_t flags)
44{
45 UNUSED(file); // Unused
47
48 addr = vmm_alloc(&sched_process()->space, addr, length, flags, VMM_ALLOC_OVERWRITE);
49 if (addr == NULL)
50 {
51 return NULL;
52 }
53
54 memset(addr, -1, length);
55 return addr;
56}
57
60 .mmap = const_one_mmap,
61};
62
63static uint64_t const_zero_read(file_t* file, void* buffer, size_t count, size_t* offset)
64{
65 UNUSED(file);
66
67 memset(buffer, 0, count);
68 *offset += count;
69 return count;
70}
71
72static void* const_zero_mmap(file_t* file, void* addr, size_t length, size_t* offset, pml_flags_t flags)
73{
74 UNUSED(file); // Unused
76
77 addr = vmm_alloc(&sched_process()->space, addr, length, flags, VMM_ALLOC_OVERWRITE);
78 if (addr == NULL)
79 {
80 return NULL;
81 }
82
83 memset(addr, 0, length);
84 return addr;
85}
86
89 .mmap = const_zero_mmap,
90};
91
92static uint64_t const_null_read(file_t* file, void* buffer, size_t count, size_t* offset)
93{
94 UNUSED(file); // Unused
96
97 *offset += count;
98 return 0;
99}
100
101static uint64_t const_null_write(file_t* file, const void* buffer, size_t count, size_t* offset)
102{
103 UNUSED(file); // Unused
104 UNUSED(buffer);
105
106 *offset += count;
107 return count;
108}
109
112 .write = const_null_write,
113};
114
116{
117 constDir = devfs_dir_new(NULL, "const", NULL, NULL);
118 if (constDir == NULL)
119 {
120 LOG_ERR("failed to init const directory\n");
121 return ERR;
122 }
123
125 if (oneFile == NULL)
126 {
128 LOG_ERR("failed to init one file\n");
129 return ERR;
130 }
131
133 if (zeroFile == NULL)
134 {
136 UNREF(oneFile);
137 LOG_ERR("failed to init zero file\n");
138 return ERR;
139 }
140
142 if (nullFile == NULL)
143 {
145 UNREF(oneFile);
147 LOG_ERR("failed to init null file\n");
148 return ERR;
149 }
150
151 return 0;
152}
153
154static void const_deinit(void)
155{
157 UNREF(oneFile);
160}
161
162/** @} */
163
165{
166 switch (event->type)
167 {
169 const_init();
170 break;
172 const_deinit();
173 break;
174 default:
175 break;
176 }
177
178 return 0;
179}
180
181MODULE_INFO("Const Driver", "Kai Norberg", "A constant device driver", OS_VERSION, "MIT", "BOOT_ALWAYS");
int64_t y
Definition main.c:153
uint64_t _module_procedure(const module_event_t *event)
Definition const.c:164
dentry_t * devfs_dir_new(dentry_t *parent, const char *name, const inode_ops_t *inodeOps, void *private)
Create a new directory inside a mounted devfs instance.
Definition devfs.c:86
dentry_t * devfs_file_new(dentry_t *parent, const char *name, const inode_ops_t *inodeOps, const file_ops_t *fileOps, void *private)
Create a new file inside a mounted devfs instance.
Definition devfs.c:125
#define LOG_ERR(format,...)
Definition log.h:93
void * vmm_alloc(space_t *space, void *virtAddr, size_t length, pml_flags_t pmlFlags, vmm_alloc_flags_t allocFlags)
Allocates and maps virtual memory in a given address space.
Definition vmm.c:163
@ VMM_ALLOC_OVERWRITE
If any page is already mapped, overwrite the mapping.
Definition vmm.h:123
#define MODULE_INFO(_name, _author, _description, _version, _licence, _deviceTypes)
Macro to define module information.
Definition module.h:200
@ MODULE_EVENT_LOAD
Definition module.h:239
@ MODULE_EVENT_UNLOAD
Definition module.h:245
process_t * sched_process(void)
Retrieves the process of the currently running thread.
Definition sched.c:620
#define UNREF(ptr)
Decrement reference count.
Definition ref.h:95
#define UNUSED(x)
Mark a variable as unused.
Definition defs.h:100
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static dentry_t * constDir
Definition const.c:29
static uint64_t const_one_read(file_t *file, void *buffer, size_t count, size_t *offset)
Definition const.c:34
static uint64_t const_null_write(file_t *file, const void *buffer, size_t count, size_t *offset)
Definition const.c:101
static file_ops_t zeroOps
Definition const.c:87
static dentry_t * zeroFile
Definition const.c:31
static void * const_one_mmap(file_t *file, void *addr, size_t length, size_t *offset, pml_flags_t flags)
Definition const.c:43
static void * const_zero_mmap(file_t *file, void *addr, size_t length, size_t *offset, pml_flags_t flags)
Definition const.c:72
static void const_deinit(void)
Definition const.c:154
static file_ops_t oneOps
Definition const.c:58
static uint64_t const_init(void)
Definition const.c:115
static uint64_t const_zero_read(file_t *file, void *buffer, size_t count, size_t *offset)
Definition const.c:63
static dentry_t * oneFile
Definition const.c:30
static dentry_t * nullFile
Definition const.c:32
static uint64_t const_null_read(file_t *file, void *buffer, size_t count, size_t *offset)
Definition const.c:92
static file_ops_t nullOps
Definition const.c:110
static uint64_t offset
Definition screen.c:19
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
static const path_flag_t flags[]
Definition path.c:46
static atomic_long count
Definition main.c:11
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC void * memset(void *s, int c, size_t n)
Definition memset.c:4
Directory entry structure.
Definition dentry.h:153
File operations structure.
Definition file.h:54
size_t(* read)(file_t *file, void *buffer, size_t count, size_t *offset)
Definition file.h:58
File structure.
Definition file.h:39
module_event_type_t type
Definition module.h:268
A entry in a page table without a specified address or callback ID.