Hi Paul,

Paul Goyette wrote:

> I have managed to provide access to all of the kernel history data via 
> sysctl, and I've come up with a modified version of vmstat(1) that can 
> read the data from sysctl rather than having to use kvm.

Great to see more progress on sysctls instead of kvm(3)!

> Diffs for sys/sys/kernhist.h and sys/kern/kern_history.c can be found at 
> www.netbsd.org/~pgoyette/my_vmstat/kernhist.diffs  In the same directory 
> you can find a source file my_vmstat.c (and its associated Makefile).
> 
> Please review and comment (preferably constructively), and let me know 
> what more needs to be done before it gets committed.

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];
        ...

Cheers,
Simon.

Reply via email to