From 7937de6ef0f775ef1d5ef167e5ade7795176caf0 Mon Sep 17 00:00:00 2001 From: Lucia Ceionia Date: Thu, 2 Feb 2023 01:44:35 -0600 Subject: [PATCH] Added fun fault recovery :3 (I think I spotted a race condition in exception handling during testing, but whatever, that can wait) --- kernel.c | 7 ++++++- v86.nasm | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/kernel.c b/kernel.c index 7ce9374..97473ab 100644 --- a/kernel.c +++ b/kernel.c @@ -65,6 +65,7 @@ extern struct Int13DiskPacket_t v86disk_addr_packet; extern void enter_v86(uint32_t ss, uint32_t esp, uint32_t cs, uint32_t eip); extern void v86Test(); +extern void v86TransFlag(); extern void v86GfxMode(); extern void v86TextMode(); extern void v86DiskRead(); @@ -120,10 +121,14 @@ void error_environment() { ensure_v86env(); FARPTR v86_entry = i386LinearToFp(v86TextMode); enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry)); - printStr("Oh noes!!! System error! ;c", &error_screen[80]); + printStr("Oh noes!!! System error! ;c Press E for a fun recovery :3", &error_screen[80]); uint16_t *vga_text = ((uint16_t*)0xB8000); for (int i = 0; i < 80*50; i++) vga_text[i] = error_screen[i]; + uint8_t key; + for (key = get_key(); key != 'e' && key != 'E'; key = get_key()); + v86_entry = i386LinearToFp(v86TransFlag); + enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry)); } /* diff --git a/v86.nasm b/v86.nasm index 7a0e801..4f872c2 100644 --- a/v86.nasm +++ b/v86.nasm @@ -45,6 +45,31 @@ int 3 int 0x30 ; exit jmp $ +global v86TransFlag +v86TransFlag: +push cs +pop es +mov ax, 0x13 +int 0x10 +mov ax,0x1012 +xor bx,bx +mov cx,5 +mov dx,.c +int 0x10 +push 0xa000 +pop es +xor di,di +xor ax,ax +.loop: +mov cx, 12800 +rep stosb +inc ax +cmp ax,5 +jl .loop +int 0x30 +jmp $ +.c: db `\0263>=*.\?\?\?=*.\0263>` + global v86GfxMode v86GfxMode: mov ax, 0x13