Subject: Re: Driver hierarchy
To: Chris G. Demetriou <cgd@netbsd.org>
From: Simon Burge <simonb@netbsd.org>
List: tech-kern
Date: 03/20/2000 13:28:20
Chris G. Demetriou wrote:

> Simon Burge <simonb@netbsd.org> writes:
> > [ ... ]
> > 
> > I like your idea of one userland per MACHINE_ARCH.  I believe the main
> > stumbling block at the moment is the maximum partitions per disklabel
> > (and affected programs like disklabel) - anything else?
> 
> >From the way you quote this, it sounds like you're attributing this
> idea to Todd.  That's hardly the case: it's the way things were
> intended since day one when MACHINE_ARCH was done.

Sorry for the confusion - I guess I should have said something more
along the lines of "I like your renewed push for one userland per
MACHINE_ARCH".

> * For disklabel, it's not just 'maximum number of partitions', it's also
> location.  There's also the notion of native label formats.
> 
> * things like bus_space type sizes, and other userland-visible type
> sizes, have to be kept consistent across different members of
> MACHINE_ARCH.
> 
> * MD vm and structure sizes also have to be kept consistent, or have
> to be special-cased in code that uses them (e.g. kvm).

Is it USRSTACK that always gets a mention here?  I would naively guess
that this shouldn't be too hard to sysctl.

> I've been contemplating for a couple of years how to do this, more in
> the last few days.  This also gets wrapped up in arch vs. cpu stuff,
> and how you get your headers.
> 
> The way i'm current thinking might make sense is:
> 
> 	* have common headers and code for a given MACHINE_ARCH in
> 	  in sys/cpu/$(MACHINE_ARH) or similar, as e.g. sys/arch/m68k
> 	  and sys/arch/mips are now, except _more_ stuff.
> 
> 	  in it, provide things like MACHINE_ARCH MACHINE-independent
> 	  types structures and definitions.
> 
> 	* install those headers into /usr/include, as well as the
> 	  headers for all MACHINEs of the given MACHINE_ARCH.
> 
> 	  (probably need to have make variables for that, e.g.
> 	  MACHINES_m68k or something.  also, we need to have the
> 	  notion of CPU_${MACHINE_ARCH}, to generically do e.g.
> 	  the MACHINE_ARCH=mipsel -> CPU=mips translation, rather than
> 	  whacking it in all of the makefiles all over the source tree
> 	  where needed.)

Something like (no guarantee of correctness ;) :

	ARCHDIRS.alpha= alpha
	ARCHDIRS.arm32= arm32
	ARCHDIRS.i386=  i386
	ARCHDIRS.m68k=  m68k    amiga atari hp300 luna68k mac68k mvme68k \
				news68k next68k sun3 x68k
	ARCHDIRS.mipseb=mips    arc hpcmips newsmips pmax
	ARCHDIRS.mipsel=${ARCHDIRS.mipseb}
	ARCHDIRS.ns32k= pc532
	ARCHDIRS.ppc=   powerpc bebox macppc ofppc
	ARCHDIRS.sh3=   sh3     evbsh3 mmeye
	ARCHDIRS.sparc= sparc   sparc64
	ARCHDIRS.sparc64=${ARCHDIRS.sparc}
	ARCHDIRS.vax=   vax

	MACHINE_ARCH_DIRS= ${ARCHDIRS.${MACHINE_ARCH}}

in <bsd.own.mk> doesn't seem too bad.  Then things like sys/arch/Makefile
just have

	SUBDIR=	${MACHINE_ARCH_DIRS}

> 	* for the /usr/include/machine symlink, point to the _generic
> 	  cpu_ headers, and see what breaks.  everything that breaks
> 	  is either:
> 
> 		* something that is but doesn't need to be MACHINE
> 		  dependent, or,
> 
> 		* something that needs to have code written, so it
> 		  will be properly decided at run-time based on the
> 		  MACHINE value.

Almost sounds like a case for domain-os like symlinks :-)

> by decided at run-time, i mean use sysctl (or whatever) to find our
> the current MACHINE type, then pick from separately-compiled
> machine-specific versions of code, and do the right thing with a
> function switch or whatever.

I can see programs like disklabel becoming a bit of a nightmare with
.../disklabel/arch/m68k/machdep.c having large case statements.  It
would however probably be a Big Step In The Right Direction...

> Somebody who's got time and machines to actually test this on should
> look into it.  I think mips and m68k are the best first candidates to
> test it on.

Todd? :-)

Simon.