#include <os/device.h>
#include <os/os.h>
addr_t devOpen(const wchar_t* name, const wchar_t* params)
{
addr_t r;
asm("int $0x30" : "=a" (r) : "a" (0x500), "b" (name), "c" (params));
return r;
}
bool devClose(addr_t dev)
{
bool r;
asm("int $0x30" : "=a" (r) : "a" (0x501), "b" (dev));
return r;
}
status_t devUserRequest(addr_t dev, request_t* req, size_t size)
{
status_t r;
asm("int $0x30" : "=a" (r) : "a" (0x502), "b" (dev), "c" (req), "d" (size));
return r;
}
status_t devUserFinishRequest(request_t* req, bool delete_event)
{
status_t r;
asm("int $0x30" : "=a" (r) : "a" (0x503), "b" (req), "c" (delete_event));
return r;
}
size_t devReadSync(addr_t dev, qword pos, void* buffer, size_t length)
{
request_t req;
req.header.code = DEV_READ;
req.params.read.buffer = buffer;
req.params.read.length = length;
req.params.read.pos = pos;
if (devUserRequest(dev, &req, sizeof(req)) == 0)
thrWaitHandle(&req.header.event, 1, true);
devUserFinishRequest(&req, true);
if (req.header.result)
sysSetErrno(req.header.result);
return req.params.read.length;
}
size_t devWriteSync(addr_t dev, qword pos, void* buffer, size_t length)
{
request_t req;
req.header.code = DEV_WRITE;
req.params.write.buffer = buffer;
req.params.write.length = length;
req.params.write.pos = pos;
if (devUserRequest(dev, &req, sizeof(req)) == 0)
thrWaitHandle(&req.header.event, 1, true);
devUserFinishRequest(&req, true);
if (req.header.result)
sysSetErrno(req.header.result);
return req.params.write.length;
}
status_t devUserRequestSync(addr_t dev, request_t* req, size_t size)
{
if (devUserRequest(dev, req, size) == 0)
thrWaitHandle(&req->header.event, 1, true);
devUserFinishRequest(req, true);
return req->header.result;
}
status_t devIoCtl(addr_t dev, dword code, void* params, size_t length)
{
request_t req;
req.header.code = DEV_IOCTL;
req.params.ioctl.buffer = params;
req.params.ioctl.length = length;
req.params.ioctl.code = code;
return devUserRequestSync(dev, &req, sizeof(req));
}