From c659bd3c234bcc10cf108d5dc5a7120c7a9d47f7 Mon Sep 17 00:00:00 2001 From: no92 Date: Wed, 5 Feb 2025 12:58:17 +0100 Subject: [PATCH] sysdeps/managarm: support `DRM_IOCTL_MODE_CURSOR2` --- sysdeps/managarm/generic/drm.cpp | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/sysdeps/managarm/generic/drm.cpp b/sysdeps/managarm/generic/drm.cpp index 9c16941de..18d81d89e 100644 --- a/sysdeps/managarm/generic/drm.cpp +++ b/sysdeps/managarm/generic/drm.cpp @@ -1009,6 +1009,45 @@ int ioctl_drm(int fd, unsigned long request, void *arg, int *result, HelHandle h return 0; } } + case DRM_IOCTL_MODE_CURSOR2: { + auto param = reinterpret_cast(arg); + + managarm::fs::GenericIoctlRequest req(getSysdepsAllocator()); + req.set_command(request); + + req.set_drm_flags(param->flags); + req.set_drm_crtc_id(param->crtc_id); + req.set_drm_x(param->x); + req.set_drm_y(param->y); + req.set_drm_width(param->width); + req.set_drm_height(param->height); + req.set_drm_handle(param->handle); + + auto [offer, send_ioctl_req, send_req, recv_resp] = exchangeMsgsSync( + handle, + helix_ng::offer( + helix_ng::sendBragiHeadOnly(ioctl_req, getSysdepsAllocator()), + helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()), + helix_ng::recvInline() + ) + ); + HEL_CHECK(offer.error()); + HEL_CHECK(send_ioctl_req.error()); + HEL_CHECK(send_req.error()); + HEL_CHECK(recv_resp.error()); + + managarm::fs::GenericIoctlReply resp(getSysdepsAllocator()); + resp.ParseFromArray(recv_resp.data(), recv_resp.length()); + + if (resp.error() == managarm::fs::Errors::NO_BACKING_DEVICE) { + return ENXIO; + } else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { + return EINVAL; + } else { + *result = resp.result(); + return 0; + } + } case DRM_IOCTL_MODE_DESTROY_DUMB: { auto param = reinterpret_cast(arg);