extern "C" status_t init_xhdi(void) { const struct tos_cookie *c; if (gXHDIEntryPoint) return B_OK; c = tos_find_cookie(XHDI_COOKIE); if (!c) return B_ENTRY_NOT_FOUND; if (((uint32 *)c->pvalue)[-1] != XHDI_MAGIC) return B_BAD_VALUE; gXHDIEntryPoint = c->pvalue; gXHDIVersion = XHGetVersion(); return B_OK; }
long xhdi_handler(UWORD *stack) { UWORD opcode = *stack; switch (opcode) { case XHGETVERSION: { return XHGetVersion(); } case XHINQTARGET: { struct XHINQTARGET_args { UWORD opcode; UWORD major; UWORD minor; ULONG *blocksize; ULONG *deviceflags; char *productname; } *args = (struct XHINQTARGET_args *)stack; return XHInqTarget(args->major, args->minor, args->blocksize, args->deviceflags, args->productname); } case XHRESERVE: { struct XHRESERVE_args { UWORD opcode; UWORD major; UWORD minor; UWORD do_reserve; UWORD key; } *args = (struct XHRESERVE_args *)stack; return XHReserve(args->major, args->minor, args->do_reserve, args->key); } case XHLOCK: { struct XHLOCK_args { UWORD opcode; UWORD major; UWORD minor; UWORD do_lock; UWORD key; } *args = (struct XHLOCK_args *)stack; return XHLock(args->major, args->minor, args->do_lock, args->key); } case XHSTOP: { struct XHSTOP_args { UWORD opcode; UWORD major; UWORD minor; UWORD do_stop; UWORD key; } *args = (struct XHSTOP_args *)stack; return XHStop(args->major, args->minor, args->do_stop, args->key); } case XHEJECT: { struct XHEJECT_args { UWORD opcode; UWORD major; UWORD minor; UWORD do_eject; UWORD key; } *args = (struct XHEJECT_args *)stack; return XHEject(args->major, args->minor, args->do_eject, args->key); } case XHDRVMAP: { return XHDrvMap(); } case XHINQDEV: { struct XHINQDEV_args { UWORD opcode; UWORD drv; UWORD *major; UWORD *minor; ULONG *start; BPB *bpb; } *args = (struct XHINQDEV_args *)stack; return XHInqDev(args->drv, args->major, args->minor, args->start, args->bpb); } case XHINQDRIVER: { struct XHINQDRIVER_args { UWORD opcode; UWORD dev; char *name; char *version; char *company; UWORD *ahdi_version; UWORD *maxIPL; } *args = (struct XHINQDRIVER_args *)stack; return XHInqDriver(args->dev, args->name, args->version, args->company, args->ahdi_version, args->maxIPL); } case XHNEWCOOKIE: { struct XHNEWCOOKIE_args { UWORD opcode; ULONG newcookie; } *args = (struct XHNEWCOOKIE_args *)stack; return XHNewCookie(args->newcookie); } case XHREADWRITE: { struct XHREADWRITE_args { UWORD opcode; UWORD major; UWORD minor; UWORD rw; ULONG sector; UWORD count; void *buf; } *args = (struct XHREADWRITE_args *)stack; return XHReadWrite(args->major, args->minor, args->rw, args->sector, args->count, args->buf); } case XHINQTARGET2: { struct XHINQTARGET2_args { UWORD opcode; UWORD major; UWORD minor; ULONG *blocksize; ULONG *deviceflags; char *productname; UWORD stringlen; } *args = (struct XHINQTARGET2_args *)stack; return XHInqTarget2(args->major, args->minor, args->blocksize, args->deviceflags, args->productname, args->stringlen); } case XHINQDEV2: { struct XHINQDEV2_args { UWORD opcode; UWORD drv; UWORD *major; UWORD *minor; ULONG *start; BPB *bpb; ULONG *blocks; char *partid; } *args = (struct XHINQDEV2_args *)stack; return XHInqDev2(args->drv, args->major, args->minor, args->start, args->bpb, args->blocks, args->partid); } case XHDRIVERSPECIAL: { struct XHDRIVERSPECIAL_args { UWORD opcode; ULONG key1; ULONG key2; UWORD subopcode; void *data; } *args = (struct XHDRIVERSPECIAL_args *)stack; return XHDriverSpecial(args->key1, args->key2, args->subopcode, args->data); } case XHGETCAPACITY: { struct XHGETCAPACITY_args { UWORD opcode; UWORD major; UWORD minor; ULONG *blocks; ULONG *blocksize; } *args = (struct XHGETCAPACITY_args *)stack; return XHGetCapacity(args->major, args->minor, args->blocks, args->blocksize); } case XHMEDIUMCHANGED: { struct XHMEDIUMCHANGED_args { UWORD opcode; UWORD major; UWORD minor; } *args = (struct XHMEDIUMCHANGED_args *)stack; return XHMediumChanged(args->major, args->minor); } /* MiNT places itself at the beginning of the chain, We don't need to pass this call. case XHMINTINFO: { return XHMiNTInfo(); } */ case XHDOSLIMITS: { struct XHDOSLIMITS_args { UWORD opcode; UWORD which; ULONG limit; } *args = (struct XHDOSLIMITS_args *)stack; return XHDOSLimits(args->which, args->limit); } case XHLASTACCESS: { struct XHLASTACCESS_args { UWORD opcode; UWORD major; UWORD minor; ULONG *ms; } *args = (struct XHLASTACCESS_args *)stack; return XHLastAccess(args->major, args->minor, args->ms); } case XHREACCESS: { struct XHREACCESS_args { UWORD opcode; UWORD major; UWORD minor; } *args = (struct XHREACCESS_args *)stack; return XHReaccess(args->major, args->minor); } default: { return EINVFN; } } }