kvisc/ka/sys/intr/trap0.k

133 lines
2.3 KiB
Plaintext
Raw Normal View History

2019-07-09 19:51:03 +02:00
; 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:
.init:
2019-07-10 12:28:20 +02:00
mov rcx, .text
2019-07-17 22:25:50 +02:00
mov rsp, TRAP0_STACK
2019-07-09 19:51:03 +02:00
jmp TrapHandlers.prolog
2019-07-10 12:28:20 +02:00
.text:
2019-07-09 19:51:03 +02:00
mov ax0, r12
2019-07-10 12:26:15 +02:00
mov ax1, $rax
call RFS.LoadReg
2019-07-09 19:51:03 +02:00
call RFS.LoadArgs
2019-07-10 17:17:45 +02:00
b.z rax, Sys.Exit, .handle_Exit
2019-07-10 22:37:59 +02:00
b.z rax, Sys.Shutdown, .handle_Shutdown
2019-07-10 12:26:15 +02:00
b.z rax, Sys.FindNext, .handle_FindNext
b.z rax, Sys.FindFirst, .handle_FindFirst
2019-07-13 12:38:03 +02:00
b.z rax, Sys.OpenFile, .handle_OpenFile
b.z rax, Sys.CloseFile, .handle_CloseFile
b.z rax, Sys.ReadFile, .handle_ReadFile
b.z rax, Sys.EnterHaltMode, .handle_HaltMode
mov rax, 1 << 63
2019-07-09 19:51:03 +02:00
.fini:
jmp TrapHandlers.epilog
2019-07-10 20:11:35 +02:00
;------------------------------------------------;
; Syscall implementations ;
;------------------------------------------------;
2019-07-10 17:17:45 +02:00
2019-07-09 19:51:03 +02:00
;
2019-07-10 17:17:45 +02:00
; Pass control to COMMAND.COM in frame 0
2019-07-09 19:51:03 +02:00
;
2019-07-10 17:17:45 +02:00
.handle_Exit:
; Open COMMAND.COM
2019-07-18 22:49:31 +02:00
call DISK.OpenFile, .cmdcom
2019-07-10 17:17:45 +02:00
; Crash on failure
2019-07-17 22:25:50 +02:00
cmp rax, zero
2019-07-10 17:17:45 +02:00
crash.l
; Load at CMDCOM_LOADP
mov ax1, CMDCOM_LOADP
mov ax2, CMDCOM_MAXSZ
2019-07-18 22:49:31 +02:00
call DISK.ReadFile, rax
2019-07-10 17:17:45 +02:00
; Assume that COMMAND.COM being
; less then 4KB means something
; went wrong
cmp rax, 0x1000
crash.b
; Close the handle
2019-07-18 22:49:31 +02:00
call DISK.CloseFile, rax
2019-07-10 17:17:45 +02:00
; Code address
mov ax2, 0x100000
2019-07-18 22:49:31 +02:00
call RFS.StoreReg, zero, $rip
2019-07-10 17:17:45 +02:00
; Usermode
mov ax2, 3
2019-07-18 22:49:31 +02:00
call RFS.StoreReg, zero, $cr0
2019-07-10 17:17:45 +02:00
mov rcx, CMDCOM_LOADP
2019-07-17 22:25:50 +02:00
sub rcx, rcx, 0x100000
2019-07-09 19:51:03 +02:00
2019-07-10 17:17:45 +02:00
; Code offset
mov ax2, rcx
2019-07-18 22:49:31 +02:00
call RFS.StoreReg, zero, $cr1
2019-07-10 17:17:45 +02:00
; Data offset
mov ax2, rcx
2019-07-18 22:49:31 +02:00
call RFS.StoreReg, zero, $cr2
2019-07-10 17:17:45 +02:00
; Return frame
2019-07-17 22:25:50 +02:00
mov q[rbp-16], zero
2019-07-10 17:17:45 +02:00
jmp .fini
.cmdcom = "command.com"
;
; Disk API
;
2019-07-10 12:26:15 +02:00
.handle_FindFirst:
2019-07-17 22:25:50 +02:00
add ax0, ax0, nx0
2019-07-10 12:26:15 +02:00
call DISK.FindFirst
jmp .fini
.handle_FindNext:
2019-07-17 22:25:50 +02:00
add ax0, ax0, nx0
2019-07-10 12:26:15 +02:00
call DISK.FindNext
2019-07-09 19:51:03 +02:00
jmp .fini
2019-07-13 12:38:03 +02:00
.handle_OpenFile:
2019-07-17 22:25:50 +02:00
add ax0, ax0, nx0
2019-07-13 12:38:03 +02:00
call DISK.OpenFile
jmp .fini
.handle_CloseFile:
call DISK.CloseFile
jmp .fini
.handle_ReadFile:
2019-07-17 22:40:13 +02:00
add ax1, ax1, nx0
2019-07-13 12:38:03 +02:00
call DISK.ReadFile
jmp .fini
2019-07-10 17:17:45 +02:00
;
; Misc.
;
2019-07-10 22:37:59 +02:00
.handle_Shutdown:
2019-07-17 22:25:50 +02:00
mov nx0, zero
2019-07-10 22:37:59 +02:00
stop
2019-07-13 12:38:03 +02:00
.handle_HaltMode:
2019-07-09 19:51:03 +02:00
hlt
.HLT.loop:
2019-07-18 22:49:31 +02:00
pause
pause
pause
2019-07-09 19:51:03 +02:00
scan rax
2019-07-17 22:25:50 +02:00
b.z rax, zero, .HLT.loop
2019-07-09 19:51:03 +02:00
prn rax
jmp .HLT.loop