From 1144444eff64276b7aa11030e4642dea12c47373 Mon Sep 17 00:00:00 2001 From: julianb0 Date: Wed, 5 Jun 2019 19:48:56 +0200 Subject: [PATCH] iocall --- ka/main.k | 2 ++ vm/dv/cpu.c | 19 +++++++++++++++++++ vm/dv/devctl.c | 14 ++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/ka/main.k b/ka/main.k index 669d5be..b246447 100644 --- a/ka/main.k +++ b/ka/main.k @@ -13,6 +13,8 @@ main: mov ax0, .buf call print + iocall 0, 0 + leave ret diff --git a/vm/dv/cpu.c b/vm/dv/cpu.c index 1e39869..c903ace 100644 --- a/vm/dv/cpu.c +++ b/vm/dv/cpu.c @@ -3,6 +3,23 @@ #include +void cpudev_testfn(ctx_t *ctx, dev_t *dev) +{ + assert(dev == &cpudev); + + rax = 4; + rdx = 3; +} + +void cpudev_poweron(ctx_t *ctx, dev_t *dev) +{ + assert(dev == &cpudev); + + dev->fslots[0] = cpudev_testfn; + + dev->state = DEVGOOD; +} + dev_t cpudev = { .type = "cpu", @@ -13,5 +30,7 @@ dev_t cpudev = .major = 0, .minor = 1, .revis = 0, + + .fpwon = cpudev_poweron, }; diff --git a/vm/dv/devctl.c b/vm/dv/devctl.c index 89cca7b..dd25ca0 100644 --- a/vm/dv/devctl.c +++ b/vm/dv/devctl.c @@ -85,6 +85,20 @@ IMPL_END; IMPL_START_2(iocall) { CHK_SUPERV(); + + dev_t *dev = devctl_common(ctx, v1, v2); + + if (dev == NULL) + return; + + if (v2 >= DEVSLOTS) + rax = -6; + + else if (dev->fslots[v2] == NULL) + rax = -6; + + else + dev->fslots[v2](ctx, dev); } IMPL_END;