1
0
mirror of https://gitlab.os-k.eu/os-k-team/kvisc.git synced 2023-08-25 14:05:46 +02:00
kvisc/vm/dv/CPUDEV
julianb0 ce8411be8e
vm
2019-07-22 13:18:13 +02:00

76 lines
4.3 KiB
Plaintext

# The OS/K Team licenses this file to you under the MIT license.
# See the LICENSE file in the project root for more information.
CPU device function slots:
slot ax0 ax1 ax2 thr name desc
0-15 - - - - (reserved) (reserved)
16 - - - - getmaxidx rax = maximal index for a register frame
17 - - - - getrfusage rax = number of register frames active
18 - - - - getcuridx rax = index of the current register frame
19 - - - - leastavail rax = least index among inactive frames, -1 if none
20 i - - - isactive rax = is register frame #ax0 active?
21 i - - y activate activates register frame #ax0 (filling it with 0's)
22 i - - y deactivate deactivates register frame #ax0 (losing all its contents!)
23 i i - y copyframe copy contents of frame #ax1 into (active) frame #ax0
24 i i - y moveframe move frame #ax1 to (inactive) frame index #ax0
25 i - - - switchrf switch to register frame #ax0
26-31 - - - - (reserved) (reserved)
32 i - - - loadargs load registers ax0-ax5 from frame #ax0
33 i r - - loadreg rax = register #ax1 from frame #ax0
34-47 - - - - (reserved) (reserved)
48 i r i y storereg store ax2 into register #ax1 from frame #ax0
49-63 - - - - (reserved) (reserved)
64 i i - y idtadd mark E/I #ax0 as handled by register frame #ax1
65 i - - y idtdel mark E/I #ax0 as unhandled
66 i - - - idtquery rax = E/I #ax0 has handler? rdx = index of handling frame
67 i - - - idtdone signals that handler for E/I #ax0 is done handling
68+ - - - - (reserved) (reserved)
Arguments:
i immediate
r register index (0=inv, 1=rip, etc...)
Terminology:
interrupt: asynchronous transfer of control to another RFRAME due to some device
exception: general term for synchronous transfer of control to another RFRAME
fault: hardware exception (slots 1-255)
trap: software exception (slots 256-511)
IDT slots:
0 a handler at this slot will receive all exceptions
1-255 hardware exceptions (see vm/except.h), OVERRIDES slot 0
256-511 software exceptions (TRAP instruction), OVERRIDES slot 0
512 a handler at this slot will receive all maskable hardware interrupts
513-767 maskable hardware interrupts (see ...), OVERRIDES slot 512
768 a handler in this slot will receive all non-maskable hardware interrupts
769-1022 non-maskable hardware interrupts (see ...), OVERRIDES slot 768
1023 Uncatchable exception, guarantees shutdown. Only throwable by supervisor
via the CRASH instruction, or by the machine in case of irrecoverable failure
A handler for some E/I must use the 'idtdone' iocall to show that it is done dealing with
a certain E/I. If that same E/I happens again before that, the following happens:
- if this E/I is a fault (hardware exception), but not #DBF, then a #DBF exception is thrown
- if this E/I is #DBF (double fault), the system crashes ("triple fault")
- if this E/I is a hardware interrupt, it is queued (*** XXX ***)
When called, a handler will receive the number of the E/I it is handling in R12,
and its own RFRAME ID in R13. (in particular, if exception #25 happens and there are no
handler for it, the handler #0 that will be called will receive '25' in R12, and '0' in R13).
R13 is the value that must be passed to the 'initdone' iocall.
The handler will also receive the previous RFRAME ID in R14.
R15 is also modified but its value is meaningful only to the processor.
To return from an E/I, *after* having called 'idtdone' (using the value originally in R11),
the handler must simply restore R14's and R15's values to what they were when the handler
started executing, and then use the 'IRET' instruction.
Clearing the interrupt flag prevents (and queues) maskable hardware interrupts
Note: RFRAME #0 *cannot* handle interrupts, as a value of 0 in an IDT slot
indicates than there are no handler for the corresponding exception/interrupt