tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
re: ioctl VNDIOCSET vs netbsd32
> /*
> * 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 int vnd_osize; /* (returned) size of disk */
> uint64_t vnd_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.h 20 Aug 2019 09:32:21 -0000 1.68
+++ netbsd32_ioctl.h 3 Sep 2019 18:48:44 -0000
@@ -473,23 +473,19 @@ struct netbsd32_sioc_sg_req {
/* from <sys/sockio.h> */
#define SIOCGETSGCNT32 _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 int vnd_osize; /* (returned) size of disk */
- uint64_t vnd_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 <dev/vndvar.h> */
#define VNDIOCSET32 _IOWR('F', 0, struct netbsd32_vnd_ioctl) /* enable disk */
Home |
Main Index |
Thread Index |
Old Index