Skip to content

Commit 2a9eea9

Browse files
committed
Merge remote-tracking branch 'origin/main' into hw/keyboard
2 parents 0099ef1 + 86e34f4 commit 2a9eea9

4 files changed

Lines changed: 21 additions & 88 deletions

File tree

kernel/include/kernel/fs/chardev.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
#include <kernel/fs/vfs.h>
55

6-
int register_stderr (struct file* f);
7-
int register_stdin (struct file* f);
8-
int register_stdout (struct file* f);
6+
void init_tty1 (inode* absolute_root);
97

108
#endif

kernel/src/kclib/string.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void kitos (int32_t i, char* buf, uint32_t b) {
3939
} while (i);
4040
if (ctr == 0) buf[0] = '0';
4141
if (negative) buf[ctr++] = '-';
42-
buf[ctr + 1] = 0;
42+
buf[ctr++] = 0;
4343
kreverse (buf);
4444
}
4545

kernel/src/kernel/entry.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ __attribute__ ((noreturn)) void _start_stage2 (void) {
107107
init_console (framebuffer->width, framebuffer->height, 40, 40, 1, 1, 2);
108108
init_kb ();
109109

110+
for (int i = 0; i < 3; i++) // open stdin, stdout and stderr
111+
do_syscall (SYSCALL_SYS_OPEN, (uint64_t)"/dev/tty1", 0, 0);
112+
110113
print_info ();
111114

112115
kprintf ("\n[Stage 2] Running as PID %lld\n", get_current_process ()->p_id);
@@ -186,6 +189,7 @@ void _start (void) {
186189
init_process ();
187190

188191
init_vfs (init_ramfs_root ());
192+
init_tty1 (get_absolute_root ());
189193

190194
// Launch Stage 2 as the first process (PID 1)
191195
process* stage2_proc = kmalloc (sizeof (process));
@@ -196,15 +200,6 @@ void _start (void) {
196200
stage2_proc->p_state = TASK_READY;
197201
stage2_proc->p_wd = stage2_proc->p_root = get_absolute_root ();
198202

199-
for (int i = 0; i < 3; i++) {
200-
stage2_proc->p_fds[i] = kmalloc (sizeof (struct file));
201-
kmemset (stage2_proc->p_fds[i], 0, sizeof (struct file));
202-
}
203-
204-
register_stdin (stage2_proc->p_fds[0]);
205-
register_stdout (stage2_proc->p_fds[1]);
206-
register_stderr (stage2_proc->p_fds[2]);
207-
208203
void* kstack = alloc_vpages (STACK_SIZE / PAGE_SIZE, false);
209204
stage2_proc->p_kstack = (uintptr_t)kstack + STACK_SIZE;
210205

kernel/src/kernel/fs/chardev.c

Lines changed: 15 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -18,83 +18,23 @@ static int stdout_write (inode* node, file* f, void* buf, size_t len) {
1818
return len;
1919
}
2020

21-
static int stderr_write (inode* node, file* f, void* buf, size_t len) {
22-
(void)node, (void)f; // args not used
23-
bool stdio_buf = get_update_on_putch ();
24-
set_update_on_putch (false);
25-
26-
for (size_t i = 0; i < len; i++)
27-
putchar (((char*)buf)[i]);
28-
29-
update ();
30-
set_update_on_putch (stdio_buf);
31-
return len;
32-
}
33-
34-
int register_stdin (struct file* f) {
35-
if (!f) return -EINVARG;
36-
37-
inode* new_inode = kmalloc (sizeof (inode));
38-
if (!new_inode) return -ENOMEM;
39-
40-
kmemset (new_inode, 0, sizeof (inode));
41-
42-
new_inode->i_cnt = 1;
43-
new_inode->i_type = CHAR_DEV;
44-
45-
f->f_inode = new_inode;
46-
47-
return 0;
48-
}
49-
50-
int register_stdout (struct file* f) {
51-
if (!f) return -EINVARG;
52-
53-
inode* new_inode = kmalloc (sizeof (inode));
54-
if (!new_inode) return -ENOMEM;
55-
56-
file_operations* stdout_fops = kmalloc (sizeof (file_operations));
57-
if (!stdout_fops) {
58-
kfree (new_inode);
59-
return -ENOMEM;
60-
}
61-
62-
kmemset (new_inode, 0, sizeof (inode));
63-
kmemset (stdout_fops, 0, sizeof (file_operations));
64-
65-
stdout_fops->write = stdout_write;
66-
67-
new_inode->i_cnt = 1;
68-
new_inode->i_type = CHAR_DEV;
69-
70-
f->f_inode = new_inode;
71-
f->f_fops = stdout_fops;
72-
73-
return 0;
74-
}
75-
76-
int register_stderr (struct file* f) {
77-
if (!f) return -EINVARG;
78-
79-
inode* new_inode = kmalloc (sizeof (inode));
80-
if (!new_inode) return -ENOMEM;
81-
82-
file_operations* stdout_fops = kmalloc (sizeof (file_operations));
83-
if (!stdout_fops) {
84-
kfree (new_inode);
85-
return -ENOMEM;
86-
}
87-
88-
kmemset (new_inode, 0, sizeof (inode));
89-
kmemset (stdout_fops, 0, sizeof (file_operations));
21+
void init_tty1 (inode* absolute_root) {
22+
inode* dev_dir = nullptr;
23+
int error = do_mkdir ("dev", &dev_dir, absolute_root);
24+
if (!(error == 0 || error == -EPEXISTS)) return;
9025

91-
stdout_fops->write = stderr_write;
26+
inode* tty1_file = nullptr;
27+
error = do_create ("tty1", &tty1_file, dev_dir);
28+
if (error != 0 || !tty1_file) return;
9229

93-
new_inode->i_cnt = 1;
94-
new_inode->i_type = CHAR_DEV;
30+
file_operations* tty1_fops = kmalloc (sizeof (file_operations));
31+
if (!tty1_fops) return;
9532

96-
f->f_inode = new_inode;
97-
f->f_fops = stdout_fops;
33+
kmemset (tty1_fops, 0, sizeof (file_operations));
34+
tty1_fops->write = stdout_write;
35+
// tty1_fops->read = // connect to keyboard get_next_char when available
9836

99-
return 0;
37+
tty1_file->i_iops = nullptr;
38+
tty1_file->i_fops = tty1_fops;
39+
tty1_file->i_type = CHAR_DEV;
10040
}

0 commit comments

Comments
 (0)