1

make bluescreen demo more general for paging

This commit is contained in:
2022-07-27 23:43:36 +02:00
parent ac2d46d314
commit 5b556f9446
4 changed files with 81 additions and 36 deletions

View File

@ -1,20 +0,0 @@
#include "user/demo/BlueScreenDemo.h"
#include "kernel/Paging.h"
void BlueScreenDemo::run() {
kout << "Trigger Bluescreen, if you can read this it didn't work" << endl;
// BlueScreen 1
// asm("int $3");
// BlueScreen 2
unsigned int* page = pg_alloc_page();
*page = 42;
pg_write_protect_page(page);
invalidate_tlb_entry(page); // If we don't invalidate after first access the write protection
// won't work as no lookup is performed (address in tlb)
*page = 42; // We map logical to physical 1:1 so no need to do any lookup
// If tlb is invalidated this access produces a pagefault
scheduler.exit();
}

View File

@ -1,16 +0,0 @@
#ifndef BlueScreenDemo_include__
#define BlueScreenDemo_include__
#include "kernel/Globals.h"
#include "kernel/threads/Thread.h"
class BlueScreenDemo : public Thread {
public:
BlueScreenDemo(const BlueScreenDemo& copy) = delete;
BlueScreenDemo() : Thread("BlueScreenDemo") {}
void run() override;
};
#endif

View File

@ -0,0 +1,51 @@
#include "user/demo/PagingDemo.h"
#include "kernel/Paging.h"
void PagingDemo::writeprotect_page() {
kout << "Accessing a writeprotected page triggers bluescreen,\nif you can read this it didn't work" << endl;
// BlueScreen 1
// asm("int $3");
// BlueScreen 2
log.info() << "Allocating page" << endl;
unsigned int* page = pg_alloc_page();
*page = 42;
log.info() << "Writeprotecting page..." << endl;
pg_write_protect_page(page);
log.info() << "Accessing writeprotected page" << endl;
*page = 42; // We map logical to physical 1:1 so no need to do any lookup
// No free because bluescreen
}
void PagingDemo::notpresent_page() {
kout << "Produces pagefault, if you can read this it didn't work" << endl;
log.info() << "Allocating page" << endl;
unsigned int* page = pg_alloc_page();
*page = 42;
log.info() << "Marking page notpresent..." << endl;
pg_notpresent_page(page);
log.info() << "Accessing page" << endl;
kout << "Page not accessible: " << *page << endl;
// No free because bluescreen
}
void PagingDemo::run() {
kout << "Press w for writeprotect demo, n for notpresent demo" << endl;
switch(listener.waitForKeyEvent()) {
case 'w':
writeprotect_page();
break;
case 'n':
notpresent_page();
break;
}
scheduler.exit();
}

View File

@ -0,0 +1,30 @@
#ifndef BlueScreenDemo_include__
#define BlueScreenDemo_include__
#include "kernel/Globals.h"
#include "kernel/threads/Thread.h"
#include "user/event/KeyEventListener.h"
class PagingDemo: public Thread {
private:
void writeprotect_page();
void free_page();
void notpresent_page();
KeyEventListener listener;
public:
PagingDemo(const PagingDemo& copy) = delete;
PagingDemo(): Thread("PagingDemo"), listener(tid) {
kevman.subscribe(listener);
}
~PagingDemo() override {
kevman.unsubscribe(listener);
}
void run() override;
};
#endif