On Fri, 30 Dec 2016, Simon Burge wrote:

One thing to be careful of is 64-bit safe alignment of the sysctl
structures.  The first structure is ok:

+/* info for a single kernhist */
+struct sysctl_history_list_entry {
+       uint32_t        shle_nameoffset;
+       uint32_t        shle_numentries;
+       uint32_t        shle_nextfree;
+       uint32_t        shle_filler;
+};

But for the second structure, I don't think the "struct timeval" is
64-bit alignment safe (unless something has changed in the last few
years):

+/* info for a single history event */
+struct sysctl_history_event {
+       struct timeval  she_tv;
+       uint64_t        she_callnumber;
+       uint64_t        she_values[4];
+       uint32_t        she_cpunum;
+       uint32_t        she_fmtoffset;
+       uint32_t        she_funcoffset;
+       uint32_t        she_filler;
+};

Some of the original sysctl stuff used uint32_t for the seconds part of
a timeval, but I suspect you'd want to use a uint64_t nowadays.  You
might end up with something like:

struct sysctl_history_event {
        uint64_t        she_tv_sec;
        uint32_t        she_tv_usec;
        uint32_t        she_pad1;
        uint64_t        she_callnumber;
        uint64_t        she_values[4];
        ...

Any suggestions on how to ensure proper alignment? There doesn't seem to be any way to kmem_allocate() what alignment is needed... :) It seems to currently always provide 64-bit (8-byte) alignment, but the man page makes no guarantees.

I guess I could allocate an extra 8 bytes, and then manipulate the returned address... But that just "feels wrong". :)



+------------------+--------------------------+------------------------+
| Paul Goyette     | PGP Key fingerprint:     | E-mail addresses:      |
| (Retired)        | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com   |
| Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd.org |
+------------------+--------------------------+------------------------+

Reply via email to