PatchworkOS
Loading...
Searching...
No Matches
fb.c
Go to the documentation of this file.
2
3#include <kernel/fs/file.h>
4#include <kernel/fs/sysfs.h>
5#include <kernel/fs/vfs.h>
6#include <kernel/log/log.h>
8
9#include <assert.h>
10#include <stdatomic.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include <sys/fb.h>
14
15static atomic_uint64_t newId = ATOMIC_VAR_INIT(0);
16
18
19static void* fb_buffer_mmap(file_t* file, void* addr, uint64_t length, uint64_t* offset, pml_flags_t flags)
20{
22
24 return fb->mmap(fb, addr, length, offset, flags);
25}
26
29};
30
32{
34 if (*offset >= sizeof(fb_info_t))
35 {
36 return 0;
37 }
38
39 return BUFFER_READ(buffer, count, offset, &fb->info, sizeof(fb_info_t));
40}
41
44};
45
46static void fb_dir_cleanup(inode_t* inode)
47{
48 fb_t* fb = inode->private;
49 free(fb);
50}
51
55
57{
58 if (info == NULL || mmap == NULL)
59 {
60 errno = EINVAL;
61 return NULL;
62 }
63
64 if (fbDir == NULL)
65 {
67 if (fbDir == NULL)
68 {
69 return NULL;
70 }
71 }
72
73 fb_t* fb = malloc(sizeof(fb_t));
74 if (fb == NULL)
75 {
76 return NULL;
77 }
78 memcpy(&fb->info, info, sizeof(fb_info_t));
79 fb->mmap = mmap;
80
81 char id[MAX_NAME];
82 if (snprintf(id, MAX_NAME, "%llu", atomic_fetch_add(&newId, 1)) < 0)
83 {
84 free(fb);
85 return NULL;
86 }
87
89 if (fb->dir == NULL)
90 {
91 free(fb);
92 return NULL;
93 }
94 fb->bufferFile = sysfs_file_new(fb->dir, "buffer", NULL, &bufferOps, fb);
95 if (fb->bufferFile == NULL)
96 {
97 DEREF(fb->dir); // fb will be freed in fb_dir_cleanup
98 return NULL;
99 }
100 fb->infoFile = sysfs_file_new(fb->dir, "info", NULL, &infoOps, fb);
101 if (fb->infoFile == NULL)
102 {
103 DEREF(fb->dir);
105 return NULL;
106 }
107
108 return fb;
109}
110
112{
113 if (fb == NULL)
114 {
115 return;
116 }
117
118 DEREF(fb->dir);
120 DEREF(fb->infoFile);
121 // fb is freed in fb_dir_cleanup
122}
#define MAX_NAME
Maximum length of names.
Definition MAX_NAME.h:11
static atomic_uint64_t newId
Definition fb.c:15
static dentry_t * fbDir
Definition fb.c:17
static uint64_t fb_info_read(file_t *file, void *buffer, uint64_t count, uint64_t *offset)
Definition fb.c:31
static void * fb_buffer_mmap(file_t *file, void *addr, uint64_t length, uint64_t *offset, pml_flags_t flags)
Definition fb.c:19
static file_ops_t infoOps
Definition fb.c:42
static void fb_dir_cleanup(inode_t *inode)
Definition fb.c:46
static inode_ops_t dirInodeOps
Definition fb.c:52
static file_ops_t bufferOps
Definition fb.c:27
void fb_free(fb_t *fb)
Free and deinitialize a framebuffer structure.
Definition fb.c:111
void *(* fb_mmap_t)(fb_t *, void *, uint64_t, uint64_t *, pml_flags_t)
Framebuffer mmap callback type.
Definition fb.h:27
fb_t * fb_new(const fb_info_t *info, fb_mmap_t mmap)
Allocate and initialize a framebuffer structure.
Definition fb.c:56
#define BUFFER_READ(buffer, count, offset, src, size)
Helper macros for implementing file operations dealing with simple buffers.
Definition vfs.h:372
void log_screen_disable(void)
Disable logging to the screen.
Definition log.c:85
#define DEREF(ptr)
Decrement reference count.
Definition ref.h:80
#define EINVAL
Invalid argument.
Definition errno.h:142
#define errno
Error number variable.
Definition errno.h:27
void * mmap(fd_t fd, void *address, uint64_t length, prot_t prot)
System call to map memory from a file.
Definition mmap.c:6
#define NULL
Pointer error value.
Definition NULL.h:23
static fb_t * fb
Definition gop.c:17
static fb_info_t info
Definition gop.c:41
static dentry_t * file
Definition log_file.c:17
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
static atomic_long count
Definition main.c:9
#define ATOMIC_VAR_INIT(value)
Definition stdatomic.h:74
#define atomic_fetch_add(object, operand)
Definition stdatomic.h:283
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC int snprintf(char *_RESTRICT s, size_t n, const char *_RESTRICT format,...)
Definition snprintf.c:3
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC void * memcpy(void *_RESTRICT s1, const void *_RESTRICT s2, size_t n)
Definition memcpy.c:4
Directory entry structure.
Definition dentry.h:83
inode_t * inode
Definition dentry.h:87
Framebuffer info struct.
Definition fb.h:39
Framebuffer structure.
Definition fb.h:34
fb_mmap_t mmap
Definition fb.h:36
dentry_t * infoFile
Definition fb.h:39
dentry_t * dir
Definition fb.h:37
dentry_t * bufferFile
Definition fb.h:38
fb_info_t info
Definition fb.h:35
File operations structure.
Definition file.h:57
uint64_t(* read)(file_t *file, void *buffer, uint64_t count, uint64_t *offset)
Definition file.h:61
void *(* mmap)(file_t *file, void *address, uint64_t length, uint64_t *offset, pml_flags_t flags)
Definition file.h:66
File structure.
Definition file.h:37
void(* cleanup)(inode_t *inode)
Definition inode.h:98
Inode structure.
Definition inode.h:54
void * private
Definition inode.h:66
A entry in a page table without a specified address or callback ID.
dentry_t * sysfs_dir_new(dentry_t *parent, const char *name, const inode_ops_t *inodeOps, void *private)
Create a new directory inside a mounted SysFS instance.
Definition sysfs.c:174
dentry_t * sysfs_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 SysFS instance.
Definition sysfs.c:216