Subject: Re: cacheflush() proposal
To: Chris G. Demetriou <cgd@netbsd.org>
From: Todd Whitesel <toddpw@best.com>
List: tech-userlevel
Date: 12/03/1998 01:37:47
> >      cacheflush(addr, nbytes, cache)
> >      char *addr;
> >      int nbytes, cache;
> 
> "how do you flush all of memory?"
> 
> no, addr == 0 and nbytes == INT_MAX won't do it.
> 
> even if nbytes is unsigned and you use UINT_MAX, you lose.  8-)
> 
> maybe 'unsigned long' or 'size_t' nbytes.

For that to work, either sizeof(nbytes) > sizeof(void *), or you disallow a
starting address of NULL.

Two complete solutions:

    1. addr,nbytes where ADDR is a start address pointer and NBYTES is the
	offset from ADDR to the last byte in the desired region (i.e. length-1).
	NBYTES can be any unsigned type whose sizeof == sizeof(void*).

    2. addr,endaddr which are two pointers, first and last address. Of course,
	you'd need a VOIDSTAR_MAX macro or guarantee that ~(void*)NULL worked.

> also, is there reason to use 'char *' rather than 'void *'?  the
> memory's type doesn't really matter...

char* in this context is only useful if people expect to mix this interface
with code that must be compiled using -traditional. Otherwise void* is the
correct choice -- it's practically the only new language feature that ANSI C
did entirely right. (Except that pointer arithmetic on void* wasn't defined
well enough!!)

Todd Whitesel
toddpw @ best.com