Skip to content

Commit 1f1e86e

Browse files
vm: refactor file mappings and allow to mmap /dev/fb :^)
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 0ac9d1f commit 1f1e86e

File tree

10 files changed

+179
-111
lines changed

10 files changed

+179
-111
lines changed

misc/aero-doom.png

204 KB
Loading

patches/doomgeneric/doomgeneric.patch

Lines changed: 82 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
From a9634a899b60b3d783c9aabc4d667435bdeb4270 Mon Sep 17 00:00:00 2001
1+
From 0005041b6e5c82519820a22e8d34f827a5abf11d Mon Sep 17 00:00:00 2001
22
From: Andy-Python-Programmer <[email protected]>
33
Date: Sat, 15 Jan 2022 18:07:32 +1100
44
Subject: [PATCH] add aero doom
55

66
Signed-off-by: Andy-Python-Programmer <[email protected]>
77
---
8-
.gitignore | 8 ++
9-
doomgeneric/Makefile.aero | 80 +++++++++++
10-
doomgeneric/aero/framebuffer.h | 243 +++++++++++++++++++++++++++++++
8+
.gitignore | 9 ++
9+
doomgeneric/Makefile.aero | 80 ++++++++++
10+
doomgeneric/aero/framebuffer.h | 243 ++++++++++++++++++++++++++++++
1111
doomgeneric/d_main.c | 4 +
12-
doomgeneric/doomgeneric_aero.c | 255 +++++++++++++++++++++++++++++++++
13-
5 files changed, 590 insertions(+)
12+
doomgeneric/doomgeneric_aero.c | 266 +++++++++++++++++++++++++++++++++
13+
5 files changed, 602 insertions(+)
1414
create mode 100644 .gitignore
1515
create mode 100644 doomgeneric/Makefile.aero
1616
create mode 100644 doomgeneric/aero/framebuffer.h
1717
create mode 100644 doomgeneric/doomgeneric_aero.c
1818

1919
diff --git a/.gitignore b/.gitignore
2020
new file mode 100644
21-
index 0000000..6ac1485
21+
index 0000000..e610a33
2222
--- /dev/null
2323
+++ b/.gitignore
24-
@@ -0,0 +1,8 @@
24+
@@ -0,0 +1,9 @@
2525
+build
2626
+
2727
+doomgeneric/doomgeneric
@@ -30,7 +30,7 @@ index 0000000..6ac1485
3030
+doom1.wad
3131
+
3232
+.vscode
33-
\ No newline at end of file
33+
+.clang-format
3434
diff --git a/doomgeneric/Makefile.aero b/doomgeneric/Makefile.aero
3535
new file mode 100644
3636
index 0000000..3cde87c
@@ -389,10 +389,10 @@ index c7cf977..435e76a 100644
389389
if (iwadfile == NULL)
390390
diff --git a/doomgeneric/doomgeneric_aero.c b/doomgeneric/doomgeneric_aero.c
391391
new file mode 100644
392-
index 0000000..6dd20b0
392+
index 0000000..a5adc60
393393
--- /dev/null
394394
+++ b/doomgeneric/doomgeneric_aero.c
395-
@@ -0,0 +1,255 @@
395+
@@ -0,0 +1,266 @@
396396
+/*
397397
+ * Copyright (C) 2021-2022 The Aero Project Developers.
398398
+ *
@@ -417,23 +417,26 @@ index 0000000..6dd20b0
417417
+
418418
+#include "aero/framebuffer.h"
419419
+
420-
+#include <stdint.h>
421420
+#include <fcntl.h>
422-
+#include <stdlib.h>
423-
+#include <stdio.h>
424421
+#include <stdarg.h>
422+
+#include <stdbool.h>
423+
+#include <stdint.h>
424+
+#include <stdio.h>
425+
+#include <stdlib.h>
426+
+#include <string.h>
425427
+#include <termios.h>
426428
+#include <unistd.h>
427-
+#include <stdbool.h>
428429
+
430+
+#include <sys/mman.h>
429431
+#include <sys/time.h>
430432
+
431-
+#define LOG_INFO 0
432-
+#define KEYBOARD_QUEUE_SIZE 16
433+
+#define LOG_INFO 0
434+
+#define KEYBOARD_QUEUE_SIZE 16
433435
+
434-
+FILE *framebuffer = NULL;
435436
+FILE *keyboard = NULL;
436437
+
438+
+static uint32_t *framebuffer_ptr = NULL;
439+
+
437440
+static uint32_t s_screen_width = 0;
438441
+static uint32_t s_screen_height = 0;
439442
+
@@ -485,49 +488,49 @@ index 0000000..6dd20b0
485488
+ uint8_t key = 0;
486489
+
487490
+ switch (scancode) {
488-
+ case 28: // enter
489-
+ key = KEY_ENTER;
490-
+ break;
491-
+
492-
+ case 1: // escape
493-
+ key = KEY_ESCAPE;
494-
+ break;
495-
+
496-
+ case 105: // left
497-
+ key = KEY_LEFTARROW;
498-
+ break;
499-
+
500-
+ case 106: // right
501-
+ key = KEY_RIGHTARROW;
502-
+ break;
503-
+
504-
+ case 103: // up
505-
+ key = KEY_UPARROW;
506-
+ break;
507-
+
508-
+ case 108: // down
509-
+ key = KEY_DOWNARROW;
510-
+ break;
511-
+
512-
+ case 29: // left control
513-
+ case 97: // right control
514-
+ key = KEY_FIRE;
515-
+ break;
516-
+
517-
+ case 57: // spacebar
518-
+ key = KEY_USE;
519-
+ break;
520-
+
521-
+ case 54: // rightshift
522-
+ key = KEY_RSHIFT;
523-
+ break;
524-
+
525-
+ case 21: // y
526-
+ key = 'y';
527-
+ break;
528-
+
529-
+ default:
530-
+ break;
491+
+ case 28: // enter
492+
+ key = KEY_ENTER;
493+
+ break;
494+
+
495+
+ case 1: // escape
496+
+ key = KEY_ESCAPE;
497+
+ break;
498+
+
499+
+ case 105: // left
500+
+ key = KEY_LEFTARROW;
501+
+ break;
502+
+
503+
+ case 106: // right
504+
+ key = KEY_RIGHTARROW;
505+
+ break;
506+
+
507+
+ case 103: // up
508+
+ key = KEY_UPARROW;
509+
+ break;
510+
+
511+
+ case 108: // down
512+
+ key = KEY_DOWNARROW;
513+
+ break;
514+
+
515+
+ case 29: // left control
516+
+ case 97: // right control
517+
+ key = KEY_FIRE;
518+
+ break;
519+
+
520+
+ case 57: // spacebar
521+
+ key = KEY_USE;
522+
+ break;
523+
+
524+
+ case 54: // rightshift
525+
+ key = KEY_RSHIFT;
526+
+ break;
527+
+
528+
+ case 21: // y
529+
+ key = 'y';
530+
+ break;
531+
+
532+
+ default:
533+
+ break;
531534
+ }
532535
+
533536
+ return key;
@@ -561,13 +564,13 @@ index 0000000..6dd20b0
561564
+ }
562565
+}
563566
+
564-
+/// Initialize doomgeneric. This includes setting up the framebuffer and keyboard
565-
+/// devices.
567+
+/// Initialize doomgeneric. This includes setting up the framebuffer and
568+
+/// keyboard devices.
566569
+void DG_Init() {
567570
+ log_info("initializing framebuffer");
568571
+
569572
+ // Open up the framebuffer device.
570-
+ framebuffer = fopen("/dev/fb", "r+");
573+
+ size_t framebuffer = fopen("/dev/fb", "r+");
571574
+
572575
+ // Make sure the there were no errors.
573576
+ if (framebuffer == NULL) {
@@ -588,11 +591,16 @@ index 0000000..6dd20b0
588591
+ s_screen_width = vinfo.xres;
589592
+ s_screen_height = vinfo.yres;
590593
+
591-
+ log_info("framebuffer: (width=%lu, height=%lu)", (uint64_t)s_screen_width, (uint64_t)s_screen_height);
594+
+ log_info("framebuffer: (width=%lu, height=%lu)", (uint64_t)s_screen_width,
595+
+ (uint64_t)s_screen_height);
592596
+
593597
+ s_position_x = (s_screen_width - DOOMGENERIC_RESX) / 2;
594598
+ s_position_y = (s_screen_height - DOOMGENERIC_RESY) / 2;
595599
+
600+
+ uint32_t size = s_screen_width * s_screen_height * vinfo.bits_per_pixel / 8;
601+
+ framebuffer_ptr = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE,
602+
+ MAP_PRIVATE, fileno(framebuffer), 0);
603+
+
596604
+ enable_raw_tty();
597605
+ atexit(disable_raw_tty);
598606
+
@@ -610,16 +618,19 @@ index 0000000..6dd20b0
610618
+
611619
+void DG_DrawFrame() {
612620
+ for (int i = 0; i < DOOMGENERIC_RESY; i++) {
613-
+ fseek(framebuffer, s_position_x + (i + s_position_y) * s_screen_width, SEEK_SET);
614-
+ fwrite(DG_ScreenBuffer + i * DOOMGENERIC_RESX, 1, DOOMGENERIC_RESX * 4, framebuffer);
621+
+ size_t index = s_position_x + (i + s_position_y) * s_screen_width;
622+
+ size_t count = DOOMGENERIC_RESX * 4;
623+
+
624+
+ uint32_t *dest_ptr = &framebuffer_ptr[index];
625+
+ uint32_t *src_ptr = DG_ScreenBuffer + i * DOOMGENERIC_RESX;
626+
+
627+
+ memcpy(dest_ptr, src_ptr, count);
615628
+ }
616629
+
617630
+ handle_keyboard_input();
618631
+}
619632
+
620-
+void DG_SleepMs(uint32_t ms) {
621-
+ usleep(ms * 1000000);
622-
+}
633+
+void DG_SleepMs(uint32_t ms) { usleep(ms * 1000000); }
623634
+
624635
+uint32_t DG_GetTicksMs() {
625636
+ struct timeval tp;
@@ -646,7 +657,7 @@ index 0000000..6dd20b0
646657
+ return 1;
647658
+}
648659
+
649-
+// We dont need to set the window title :)
660+
+// NOTE: We dont need to set the window title :)
650661
+void DG_SetWindowTitle(const char *title) {}
651662
--
652663
2.25.1

src/aero_kernel/src/arch/x86_64/task.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ impl ArchTask {
312312
USERLAND_STACK_SIZE as usize,
313313
MMapProt::PROT_WRITE | MMapProt::PROT_READ,
314314
MMapFlags::MAP_FIXED | MMapFlags::MAP_PRIVATE | MMapFlags::MAP_ANONYOMUS,
315+
0,
316+
None,
315317
);
316318

317319
vm.log();

src/aero_kernel/src/fs/devfs.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use spin::{Once, RwLock};
3131
use crate::fs::lookup_path;
3232
use crate::fs::Path;
3333
use crate::logger;
34+
use crate::mem::paging::PhysAddr;
3435
use crate::rendy::RendyInfo;
3536

3637
use super::cache::DirCacheItem;
@@ -39,7 +40,7 @@ use super::ramfs::RamFs;
3940
use super::FileSystemError;
4041
use super::{FileSystem, Result, MOUNT_MANAGER};
4142

42-
use aero_syscall::prelude::*;
43+
use aero_syscall::{prelude::*, MMapFlags};
4344

4445
lazy_static::lazy_static! {
4546
static ref DEV_FILESYSTEM: Arc<DevFs> = DevFs::new();
@@ -120,6 +121,10 @@ impl INodeInterface for DevINode {
120121
self.0.inode().read_at(offset, buffer)
121122
}
122123

124+
fn mmap(&self, offset: usize, flags: MMapFlags) -> Result<PhysAddr> {
125+
self.0.inode().mmap(offset, flags)
126+
}
127+
123128
fn ioctl(&self, command: usize, arg: usize) -> Result<usize> {
124129
self.0.inode().ioctl(command, arg)
125130
}
@@ -273,6 +278,31 @@ impl INodeInterface for DevFb {
273278
.expect("/dev/fb: terminal not initialized")
274279
}
275280

281+
fn mmap(&self, offset: usize, _flags: MMapFlags) -> Result<PhysAddr> {
282+
// NOTE: We dont need to check for the mmap flags here.
283+
let rinfo = crate::rendy::get_rendy_info();
284+
285+
// Make sure we are in bounds.
286+
if offset > rinfo.byte_len {
287+
return Ok(PhysAddr::zero());
288+
}
289+
290+
crate::rendy::DEBUG_RENDY
291+
.get()
292+
.map(|e| unsafe {
293+
let mut lock = e.lock_irq();
294+
let fb = lock.get_framebuffer();
295+
296+
let fb_ptr = fb.as_ptr() as *const u8;
297+
let fb_ptr = fb_ptr.add(offset);
298+
299+
let fb_phys_ptr = fb_ptr.sub(crate::PHYSICAL_MEMORY_OFFSET.as_u64() as usize);
300+
301+
Ok(PhysAddr::new_unchecked(fb_phys_ptr as u64))
302+
})
303+
.expect("/dev/fb: terminal not initialized")
304+
}
305+
276306
fn ioctl(&self, command: usize, arg: usize) -> Result<usize> {
277307
match command {
278308
FBIOGET_VSCREENINFO => {

src/aero_kernel/src/fs/file_table.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ impl FileHandle {
106106
Ok(new_offset)
107107
}
108108

109+
pub fn dirnode(&self) -> DirCacheItem {
110+
self.inode.clone()
111+
}
112+
109113
pub fn inode(&self) -> INodeCacheItem {
110114
self.inode.inode()
111115
}

src/aero_kernel/src/fs/inode.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
use core::sync::atomic::{AtomicUsize, Ordering};
2121

22+
use aero_syscall::MMapFlags;
2223
use aero_syscall::{OpenFlags, SocketAddr};
2324

2425
use alloc::string::String;
@@ -28,6 +29,7 @@ use alloc::sync::Weak;
2829
use alloc::vec::Vec;
2930
use spin::Once;
3031

32+
use crate::mem::paging::PhysAddr;
3133
use crate::utils::sync::Mutex;
3234
use crate::utils::Downcastable;
3335

@@ -135,6 +137,10 @@ pub trait INodeInterface: Send + Sync + Downcastable {
135137
Err(FileSystemError::NotSupported)
136138
}
137139

140+
fn mmap(&self, _offset: usize, _flags: MMapFlags) -> Result<PhysAddr> {
141+
Err(FileSystemError::NotSupported)
142+
}
143+
138144
// Socket operations
139145
fn bind(&self, _address: &SocketAddr, _length: usize) -> Result<()> {
140146
Err(FileSystemError::NotSupported)

0 commit comments

Comments
 (0)