> /*
> * The next two structures are marked "__packed" as they normally end up
> * being padded in 64-bit mode.
> */
> struct netbsd32_vnd_ioctl {
> netbsd32_charp vnd_file; /* pathname of file to mount */
> int vnd_flags; /* flags; see below */
> struct vndgeom vnd_geom; /* geometry to emulate */
> unsigned intvnd_osize; /* (returned) size of disk */
> uint64_tvnd_size; /* (returned) size of disk */
> } __packed;
>
> where the __packed makes the bogus difference.
>
> I don't understand the comment. Of course they end up being padded
> (2 bytes after vnd_flags, 2 bytes after vnd_osize), but that applies to
> both the 64bit and the 32bit ABI.
>
> For which architectures is this __packed important? We need to somehow
> conditionalize it. Or am I missing something?
the packed makes it work on x86-64 where the alignment of
vnd_size is at 7 * 4 bytes, and plain uint64_t will get
padded for 8 byte alignment.
this is bogus (thanks, 9 year old me.) can you try this?
it removes the __packed and replaces references to the
properly aligned types. compile tested only.
thanks.
.mrg.
Index: netbsd32_ioctl.h
===
RCS file: /cvsroot/src/sys/compat/netbsd32/netbsd32_ioctl.h,v
retrieving revision 1.68
diff -p -u -r1.68 netbsd32_ioctl.h
--- netbsd32_ioctl.h20 Aug 2019 09:32:21 - 1.68
+++ netbsd32_ioctl.h3 Sep 2019 18:48:44 -
@@ -473,23 +473,19 @@ struct netbsd32_sioc_sg_req {
/* from */
#defineSIOCGETSGCNT32 _IOWR('u', 52, struct netbsd32_sioc_sg_req) /*
sg pkt cnt */
-/*
- * The next two structures are marked "__packed" as they normally end up
- * being padded in 64-bit mode.
- */
struct netbsd32_vnd_ioctl {
netbsd32_charp vnd_file; /* pathname of file to mount */
int vnd_flags; /* flags; see below */
struct vndgeom vnd_geom; /* geometry to emulate */
unsigned intvnd_osize; /* (returned) size of disk */
- uint64_tvnd_size; /* (returned) size of disk */
-} __packed;
+ netbsd32_uint64 vnd_size; /* (returned) size of disk */
+};
struct netbsd32_vnd_user {
int vnu_unit; /* which vnd unit */
- dev_t vnu_dev;/* file is on this device... */
- ino_t vnu_ino;/* ...at this inode */
-} __packed;
+ netbsd32_dev_t vnu_dev;/* file is on this device... */
+ netbsd32_ino_t vnu_ino;/* ...at this inode */
+};
/* from */
#define VNDIOCSET32_IOWR('F', 0, struct netbsd32_vnd_ioctl)/*
enable disk */