From b890d67ff4368bdf0fde06d5ea8df58047abd918 Mon Sep 17 00:00:00 2001 From: julianb0 Date: Tue, 6 Aug 2019 23:21:37 +0200 Subject: [PATCH] vm --- as/k-as.py | 1 + ka/doskrnl.k | 3 ++- ka/sys/intr/common.k | 14 ++++++++------ ka/sys/intr/excepts.k | 29 +++++++++++++++++++++++++++++ ka/sys/intr/trap0.k | 9 ++++++--- ka/sys/main.k | 23 +++++++++++++++++------ ka/usr/cmd/main.k | 3 +++ 7 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 ka/sys/intr/excepts.k diff --git a/as/k-as.py b/as/k-as.py index f6d0da1..8612a48 100755 --- a/as/k-as.py +++ b/as/k-as.py @@ -239,6 +239,7 @@ def parse(): #------------------------------------------------------------------------------- escape_dict = { + '0': '\0', 'n': '\n', 't': '\t', 'r': '\r', diff --git a/ka/doskrnl.k b/ka/doskrnl.k index 1a039d4..a20e61a 100644 --- a/ka/doskrnl.k +++ b/ka/doskrnl.k @@ -40,9 +40,10 @@ include "sys/drv/cpudev.k" include "sys/drv/memdev.k" include "sys/drv/diskdev.k" +include "sys/intr/excepts.k" include "sys/intr/common.k" include "sys/intr/trap0.k" -include "sys/main.k" include "sys/dumprf.k" +include "sys/main.k" diff --git a/ka/sys/intr/common.k b/ka/sys/intr/common.k index c4ee327..252e355 100644 --- a/ka/sys/intr/common.k +++ b/ka/sys/intr/common.k @@ -2,7 +2,7 @@ ; See the LICENSE file in the project root for more information. TrapHandlers.prolog: - mov rbp, rsp + mov rbp, zero ; rax = caller's cr2 call RFS.LoadReg, r14, $cr2 @@ -34,7 +34,9 @@ ScreenOfDeath: prn PRN_CLEAR prn PRN_FLUSH - call print, .scr1 + push ax1 + call printf, .scr1 + pop zero b.nz r14, zero, .not_con push .scr2_con @@ -66,15 +68,15 @@ ScreenOfDeath: scan rax jmp.axz .loop - b.z rax, 0x0A, trap0_handler.handle_Exit - b.z rax, 0x1B, trap0_handler.handle_Shutdown + b.z rax, 0x0A, DefaultTrapHandler.handle_Exit + b.z rax, 0x1B, DefaultTrapHandler.handle_Shutdown jmp .loop crash -.scr1 = "-------- Unhandled EXCEPTION, TRAP/SYSCALL or INTERRUPT\n" -.scr2 = "Offense description: %s\nOffending frame: %d (%s)\n\n" +.scr1 = "-------- Unhandled EXCEPTION, TRAP/SYSCALL or INTERRUPT (code %d)\n" +.scr2 = "Description: %s\nFrame: %d (%s)\n\n" .scr3 = "Press:\n ENTER to procede to COMMAND.COM\n ESCAPE to shutdown machine\n\n" .scr2_con = "dedicated command.com frame" diff --git a/ka/sys/intr/excepts.k b/ka/sys/intr/excepts.k new file mode 100644 index 0000000..7742829 --- /dev/null +++ b/ka/sys/intr/excepts.k @@ -0,0 +1,29 @@ +; The OS/K Team licenses this file to you under the MIT license. +; See the LICENSE file in the project root for more information. + +DefaultExceptionHandler: + mov rsp, EXCT0_STACK + mov ax1, r12 + + b.z r12, zero, DefaultTrapHandler.handle_Shutdown + b.a r12, 11, .unknown + + mov rsi, .err_ukn + lea ax0, b[rsi + r12 * 32] + call ScreenOfDeath + +.unknown: + call ScreenOfDeath, .err_ukn + crash + +.err_ukn = "Unknown exception number\0\0\0\0\0\0\0" +.err_udf = "Undefined behaviour exception\0\0" +.err_ill = "Ill-formed exception exception\0" +.err_acc = "Invalid memory access exception" +.err_sys = "Supervisor-only exception used\0" +.err_dbf = "Double fault exception~~~~~~~~\0" +.err_imp = "Feat. not implemented exception" +.err_ali = "Misalignmed address exception\0\0" +.err_brk = "BREAK key (Ctrl+C) exception\0\0\0" +.err_ovf = "Overflow flag raised exception\0" +.err_div = "Division by zero exception\0\0\0\0\0" diff --git a/ka/sys/intr/trap0.k b/ka/sys/intr/trap0.k index cfde799..1b34a41 100644 --- a/ka/sys/intr/trap0.k +++ b/ka/sys/intr/trap0.k @@ -1,7 +1,7 @@ ; The OS/K Team licenses this file to you under the MIT license. ; See the LICENSE file in the project root for more information. -trap0_handler: +DefaultTrapHandler: .init: mov rcx, .text @@ -23,7 +23,7 @@ trap0_handler: b.z rax, Sys.FindFirst, .handle_FindFirst b.z rax, Sys.EnterHaltMode, .handle_HaltMode - call ScreenOfDeath, .badsyscall + call ScreenOfDeath, .badsyscall, r13 .fini.savecx: mov ax2, rcx @@ -83,7 +83,7 @@ trap0_handler: call RFS.StoreReg, zero, $cr2 ; Return frame - mov q[rbp-16], zero + mov r14, zero jmp .fini @@ -130,6 +130,9 @@ trap0_handler: ; Misc. ; .handle_Shutdown: + mov ax0, zero + call IDT.DelHandler + stop .handle_HaltMode: diff --git a/ka/sys/main.k b/ka/sys/main.k index c931f68..4bde9e4 100644 --- a/ka/sys/main.k +++ b/ka/sys/main.k @@ -12,20 +12,30 @@ PrintBootMsg: ; InitSyscalls: mov ax0, 1 - -.prepare_next: call RFS.ActivateFrame mov ax1, $rip - mov ax2, trap0_handler + mov ax2, DefaultTrapHandler call RFS.StoreReg - - mov ax1, ax0 - inc ax0, 255 # TRAP no. (ax0 - 1) + + mov ax0, 256 + mov ax1, 1 call IDT.AddHandler ret +InitExcepts: + mov ax0, 2 + call RFS.ActivateFrame + + mov ax1, $rip + mov ax2, DefaultExceptionHandler + call RFS.StoreReg + + mov ax0, zero + mov ax1, 2 + call IDT.AddHandler + SwitchToCMD: mov rax, Sys.Exit trap 0 @@ -36,6 +46,7 @@ SwitchToCMD: main: call PrintBootMsg call InitSyscalls + call InitExcepts call SwitchToCMD ret diff --git a/ka/usr/cmd/main.k b/ka/usr/cmd/main.k index 6e1dc8b..02463a9 100644 --- a/ka/usr/cmd/main.k +++ b/ka/usr/cmd/main.k @@ -40,6 +40,9 @@ main: scan rax jmp.axz .input_loop + ; ESC key pressed? + b.z rax, 0x1B, .handle_EXIT + ; backspace character? b.nz rax, 8, .handle_input