// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include #include // // code common to devctl and iocall // dev_t *devctl_common(ctx_t *ctx, ulong v1, ulong v2) { dev_t *dev = devget(ctx, v1); 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; return NULL; } void copystr(ctx_t *ctx, ulong addr, ulong maxn, char *str) { for (; *str && maxn > 0; str++, addr++, maxn--) { writemem8(ctx, *str, addr); } writemem8(ctx, 0, addr); } IMPL_START_2(devctl) { CHK_SUPERV(); dev_t *dev = devctl_common(ctx, v1, v2); if (dev == NULL) return; switch (v2) { case 0: copystr(ctx, ax0, DEVLEN, dev->type); break; case 1: copystr(ctx, ax0, DEVLEN, dev->name); break; case 2: copystr(ctx, ax0, DEVLEN, dev->modl); break; case 3: copystr(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; } } IMPL_END; IMPL_START_2(iocall) { CHK_SUPERV(); long rc; 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 { rc = dev->fslots[v2](ctx, dev); if (rc < 0) rax = rc; } } IMPL_END;