Jim Klimov wrote:

[...]


OR...

+ parent struct:
* 4 single-bytes (they do remain single, right?..)
* 4-byte padding (...or the single-bytes should be 4*2-byte words)
++ Sub-structure in the union (8-aligned itself):
** 4-byte isl_len (starts at offset 8 from parent struct)
** 4-byte padding
** 8-byte pointer (8-aligned in both structures)
** 8-byte offset (starts at offset 24 from parent struct)

Does this layout fit the actual drivers? :)

Yes, that is correct. The alignment in inner struct
recursively forces both paddings.

Looking at it again, I see that I also had to #if
the attribute "__attribute__((packed))" at the end
of the structure. I did it for my compiler, but I
now think this is plain wrong and had to be deleted
for all 64-bit compilers (it must probably be kept
for 32-bit ones).

If so, some more #ifdef padding fields are needed, but I guess I can
craft them based on your offset numbers...

Does the first 4-byte padding belong in the child struct or in the
parent, prefixing all variations of the union sub-structures?

You need two paddings, the way you showed above. I suggest
the patch below (possibly damaged by the mailer), which
might be overkill :

--- include/ntoskrnl_var.h.ref  2013-04-26 17:20:58.881730000 +0200
+++ include/ntoskrnl_var.h      2013-04-26 17:59:49.473614000 +0200
@@ -848,10 +848,16 @@
         * io_stack_location structure is opaque to drivers
         * anyway, I'm not going to bother with the extra crap.
         */
+#ifdef __amd64__
+       uint32_t        padding1; /* required for alignement */
+#endif

        union {
                struct {
                        uint32_t                isl_len;
+#ifdef __amd64__
+                       uint32_t                padding1; /* for alignement */
+#endif
                        /* "POINTER_ALIGNMENT" according to msdn */
                        uint32_t                *isl_key;
                        uint64_t                isl_byteoff;
@@ -880,7 +886,7 @@
                        void                    *isl_arg3;
                        void                    *isl_arg4;
                } isl_others;
-#if defined(SOZOBON)
+#ifdef __amd64__
        } isl_parameters;
 #else
        } isl_parameters __attribute__((packed));

_______________________________________________
oi-dev mailing list
[email protected]
http://openindiana.org/mailman/listinfo/oi-dev

Reply via email to