kvisc/vm/in/super.c

117 lines
2.9 KiB
C
Raw Normal View History

2019-05-30 12:44:56 +02:00
// The OS/K Team licenses this file to you under the MIT license.
2019-05-29 16:57:22 +02:00
// See the LICENSE file in the project root for more information.
2019-06-20 12:31:36 +02:00
#include <unistd.h>
2019-06-23 12:40:18 +02:00
#include <pc/device.h>
2019-06-05 12:53:09 +02:00
#include <in/instrs.h>
2019-06-20 17:44:48 +02:00
#include <pc/console.h>
2019-05-29 16:57:22 +02:00
2019-07-17 20:26:03 +02:00
//----------------------------------------------------------------------------//
2019-06-30 13:46:44 +02:00
2019-07-10 17:17:45 +02:00
void do_hlt(ctx_t *ctx)
2019-06-19 23:16:30 +02:00
{
2019-06-20 12:31:36 +02:00
SDL_Event evt;
while (1)
{
if (SDL_WaitEvent(&evt) == 1)
{
if (evt.type == SDL_QUIT)
die(0);
2019-06-26 21:25:59 +02:00
if (evt.type == SDL_KEYDOWN)
2019-06-30 13:46:44 +02:00
{
2019-06-26 21:25:59 +02:00
console_handle_input(ctx, evt.key.keysym.sym);
2019-06-30 13:46:44 +02:00
if (evt.key.keysym.sym == SDLK_RETURN)
break;
}
2019-06-20 12:31:36 +02:00
}
}
2019-06-19 23:16:30 +02:00
}
2019-07-10 17:17:45 +02:00
2019-07-17 20:26:03 +02:00
//----------------------------------------------------------------------------//
IMPL_START_0(hlt) { CHK_SUPERV(); do_hlt(ctx); } IMPL_END;
IMPL_START_0(stop) { CHK_SUPERV(); _except(ctx, E_SHT, "STOP INSTR"); } IMPL_END;
IMPL_START_0(crash) { CHK_SUPERV(); _except(ctx, 1023, "CRASH instruction"); } IMPL_END;
//----------------------------------------------------------------------------//
IMPL_START_1(trap) {
if (v1 > 255) _except(ctx, E_ILL, "TRAP number greater than 255");
_except(ctx, v1 + 256, "TRAP instruction");
} IMPL_END;
2019-07-10 17:17:45 +02:00
2019-07-17 20:26:03 +02:00
IMPL_START_0(iret) {
2019-07-17 22:25:50 +02:00
if (ctx->dumpsw)
trace("\nReturning from exception #%ld\n\n", R(R11));
2019-07-17 20:26:03 +02:00
// should do more checks
R(RIP) = R(R13);
rfs_current_idx = R(R12);
ctx->rf = rfs[R(R12)];
2019-07-10 17:17:45 +02:00
}
2019-06-19 23:16:30 +02:00
IMPL_END;
2019-05-29 16:57:22 +02:00
2019-07-18 22:49:31 +02:00
IMPL_START_0(cli) { CHK_SUPERV(); R(CR0) &= ~IF; } IMPL_END;
IMPL_START_0(sti) { CHK_SUPERV(); R(CR0) |= IF; } IMPL_END;
2019-07-17 20:26:03 +02:00
//----------------------------------------------------------------------------//
2019-06-23 12:40:18 +02:00
//
// code common to devctl and iocall
//
dev_t *devctl_common(ctx_t *ctx, ulong v1, ulong v2)
2019-05-29 16:57:22 +02:00
{
2019-06-23 12:40:18 +02:00
dev_t *dev = devget(ctx, v1);
2019-07-17 22:25:50 +02:00
if (!dev) rax = -2;
else if (dev->state == DEVPWOF) rax = -3;
else if (dev->state == DEVFERR) rax = -4;
else if (dev->state == DEVPLUG) rax = -5;
else return dev;
2019-06-23 12:40:18 +02:00
return NULL;
}
IMPL_START_2(devctl)
2019-05-29 16:57:22 +02:00
{
CHK_SUPERV();
2019-06-23 12:40:18 +02:00
dev_t *dev = devctl_common(ctx, v1, v2);
if (dev == NULL)
return 0;
switch (v2) {
2019-07-17 22:25:50 +02:00
case 0: writestr(ctx, ax0, DEVLEN, dev->type); break;
case 1: writestr(ctx, ax0, DEVLEN, dev->name); break;
case 2: writestr(ctx, ax0, DEVLEN, dev->modl); break;
case 3: writestr(ctx, ax0, DEVLEN, dev->vend); break;
case 4: rax = dev->major; rdx = dev->minor; break;
case 5: rax = dev->feats; rdx = dev->revis; break;
default: rax = -6; break;
2019-06-23 12:40:18 +02:00
}
2019-05-29 16:57:22 +02:00
}
IMPL_END;
2019-06-23 12:40:18 +02:00
IMPL_START_2(iocall)
2019-05-29 16:57:22 +02:00
{
2019-06-02 16:33:28 +02:00
CHK_SUPERV();
2019-06-23 12:40:18 +02:00
long rc;
dev_t *dev = devctl_common(ctx, v1, v2);
2019-07-17 22:25:50 +02:00
if (dev == NULL) return 0;
else if (v2 >= DEVSLOTS || dev->fslots[v2] == NULL) rax = -6;
2019-06-23 12:40:18 +02:00
else {
rc = dev->fslots[v2](ctx, dev);
2019-07-17 22:25:50 +02:00
if (rc < 0) { rax = rc; rdx = 0; }
2019-06-23 12:40:18 +02:00
}
2019-05-29 16:57:22 +02:00
}
IMPL_END;
2019-07-17 20:26:03 +02:00
//----------------------------------------------------------------------------//