bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC: drm server] limitations of MiG for ioctls


From: Flávio Cruz
Subject: Re: [RFC: drm server] limitations of MiG for ioctls
Date: Mon, 4 Nov 2024 22:08:45 -0500

Hello Damien

On Mon, Nov 4, 2024 at 2:44 AM Damien Zammit via Bug reports for the GNU Hurd <bug-hurd@gnu.org> wrote:
Hi,

I am currently attempting to implement a drm server to provide
a way to use libdrm with multiboot framebuffer exposed by new device(mbinfo).

I am running into a problem that I am unable to implement a compatible
ioctl api because of the layout of the structures.

I would prefer to reuse the same api as drm ioctls rather than implement
a modified version using traditional RPCs with many arguments.
This is because libdrm would need to be modified substantially and I don't want
to clutter the client with more parameters and conditional code.

The main problem is that a few of the OUT ioctls expect the server to copy data
through the RPC, and MiG is confused by nested structs, it doesn't seem to
support something like:

        type drm_version_t = struct {
                int foo;
                int bar_length;
                data_t bar;
        };

Yes. MiG only supports fixed-sized structs and doesn't know how to deal with members that are pointers. This would be a significant change.
 

You _can_ specify individual parameters in the routine like so:

        routine drm_version (
                port: drm_t;
                foo: int;
                out bar: data_t SCP);

but then the bar_length parameter comes AFTER the bar parameter,
and has type unsigned int, (not int), and you cannot seem to pack the whole thing
into a struct compatible with an ioctl like:

        routine drm_version (
                port: drm_t;
                out bar: drm_version_t);

This part is hard coded in MiG, but could be changed easily.


How do I solve this?  Can we extend MiG to be smarter about nested structures when
data needs to be transferred within structs?  How do we solve the ordering problem of
the *_length parameter?

Can you provide more details on how this would be used? I assume clients would use ioctl but I am not too familiar with how glibc maps ioctl into RPCs.


My attempt at coding this is currently here [1] and [2].

Damien


[1] https://git.zammit.org/hurd-sv.git/commit/?h=drm-server
[2] https://git.zammit.org/hurd-sv.git/commit/?h=drm-server-ioctl



Regards
Flavio

reply via email to

[Prev in Thread] Current Thread [Next in Thread]