Subject: Re: new sysctl(KERN_PROC, ...) interface (was: sysinfo(2))
To: Simon Burge <simonb@netbsd.org>
From: Eduardo Horvath <eeh@turbolinux.com>
List: tech-kern
Date: 04/17/2000 11:34:27
On Mon, 17 Apr 2000, Simon Burge wrote:

> Eduardo Horvath wrote:
> 
> > On Sat, 15 Apr 2000 erh@nimenees.com wrote:
> > 
> > If I recall correctly, the original source for this discussion was my
> > mentioning that sysctl() and kernel grovelling does not work well for
> > binaries under 32-bit emulation.
> 
> I thought the original motivation (and has been my main motivation) was
> fixing ps's "proc size mismatch" errors, but 32 bit emulation is another
> canditate as well.  Indeed, I don't think I'd seen a reference until
> you sent one just after I sent my message about an implementation being
> available.  Crossed wires or whatever...

Maybe it was started on a different list...

> > You should either get rid of all these pointers and convert them to a
> > u_int64_t so the structure does not change, or provide some mechanism to
> > repack te structure before the copyout() so this entire mess does not need
> > to be reimplemented inside COMPAT_NETBSD32 code.
> 
> Ok, I've just about changed it so that _all_ fields are {u_,}intXX_t's,
> except for the char[] fields.  One remaining hassle is sigset_t which is
> defined as a structure of 4 u_int32_t's.  Instead of
> 
> 	sigset_t p_siglist;
> 
> I could have
> 
> 	u_int32_t p_siglist[SIGSET_LEN];
> 
> but that seems sorta ugly.

That's a fixed sized structure in a MI header file.  It should be O.K.

> To deal with pointers, I've changed all pointers in kinfo_proc2 to
> u_int64_t's, and got in fill_kproc2():

That's good.

> 	#define PTRTOINT64(foo) ((u_int64_t)(long)(foo))

That's not.  This is probably architecture dependent.  For sparc64 you
would want to use ((u_int64_t)(unsigned long)(foo)) since the 32-bit
address space is all in the low 4GB.  This is a H/W thing.  Other
architectures may use sign extension and the bottom and top 2GB.

For 32-bit architectures this is a noop, but for 64-bit machines it's
probably good to allow this to be overridden by an MD header file.

> One more thing - I guess I have to worry about structure packing,
> especially for the compat32 case, right?  If so, I'll arrange for
> everything to be aligned at 8 bytes then.
> 
> Will these changes address all of your compat32 concerns?  I don't have
> anything to test this against - I imagine sparc64 with sparc userland is
> the only user of this at the moment?

Yes, I think that should be sufficient.

Eduardo Horvath