Re: ioctl VNDIOCSET vs netbsd32

2019-09-04 Thread Martin Husemann
On Wed, Sep 04, 2019 at 04:51:06AM +1000, matthew green wrote:
> 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.

That works on mips, thanks!

Martin


re: ioctl VNDIOCSET vs netbsd32

2019-09-03 Thread matthew green
> /*
>  * 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 */