How to flush instruction cache on MacBSD ?

How to flush instruction cache on MacBSD ?

Post by Satoshi Adac » Wed, 07 May 1997 04:00:00

Dear Developers of NetBSD,

I am now porting an interpreter/compiler system for the language ML (SML/NJ)
to NetBSD running over Macintosh PowerBook 550C (CPU=MC68040).

I found that the interpreter/compiler is very unstable when it is executed.
I am now doughting that this unstability may be resulted from the lack of the
functionality on MacBSD to flush the instruction cache according to
the request from a user process.

The object modules in ML are first loaded/generated as data into the system.
Then, they are regarded as programs later.

In order to keep the consistency among main memory/data cache and instruction
cache, the instruction cache have to be flushed explicitly at several points
in the runtime system of SML/NJ.

Actually, a header file "ml_os.h" in SML/NJ has the following fragment of

/* cache-flushing stuff */

#if defined(MIPS)
#ifdef sony_news
#include <machine/sysnews.h>
#    define FlushICache(addr, size)       \
        sysnews(NEWS_CACHEFLUSH, addr, size, FLUSH_ICACHE)
/* SYS_sysnews will be defined in syscall.h, in OS 4.1 */
#undef SYS_sysnews
#ifndef MACH
#include <sys/sysmips.h>
#include <errno.h>
extern int errno;               /* some header files are missing this decl */
#  ifdef SGI
/* NOTE: need to flush both caches on R4000 machines, since the
 * primary data cache is write-back.
#  include <sys/cachectl.h>
#  define  FlushICache(addr, size)      \
        (cacheflush((void *)(addr), size, BCACHE))
#  else
#    include <sys/syscall.h>
#    include <mips/cachectl.h>
#    ifdef MACH
#    define MIPS_CACHEFLUSH 0x104
#    endif
#    define FlushICache(addr, size)       \
        (syscall(SYS_sysmips, MIPS_CACHEFLUSH, (addr), (size), ICACHE, 0))
#  endif
#ifdef NeXT
#  define FlushICache(addr, size)     asm ("trap #2")
#ifdef RS6000
   extern FlushICache();
   extern iCacheLineSize();
#ifdef SPARC
   extern FlushICache();
#ifdef HPPA
#  define FlushICache(addr, size) flush_icache(addr, size)
#ifdef THINK_C
#  define FlushICache(addr, size)     FlushCacheRange((void *)(addr), size)
#  define FlushICache(addr, size)

From this fragment, we know how the instruction cache can be fulshed for
many platforms.

I inspected carefully the kernel source code of NetBSD 1.2D for Mac68K
to search some system call to flush the instruction cache.
However, I could not find such a system call.

Maybe, NetBSD 1.2D (Mac68K) does not have such an interface to
flush the instruction cache according to the request from a user process.

If this is true, it seems to be a severe deficiency of NetBSD,
since the functionality to flush the instruction cache is necessary
not only for ML systems, but also Lisp systems and many other language systems
in which a generated module is first treated as data and becomes a program

Furthermore, the functionality to flush the instruction cache is necessary
even for GNU C compiler to compile a nested function correctly.
(See the configuration file in GCC for NEXTSTEP (M68K).)

I wonder what I shall do...

Is there some project in NetBSD on its way to add the new system call
to flush the instruction cache ?

If there is no such project, is it OK for me to modify and extend
the existing souce code of NetBSD to support the system call for
flushing instruction cache ?
(After the modification, if SML/NJ system becomes stable, I may distribute
the modified source code of NetBSD and the patch for SML/NJ to Internet.)

In this case, what is the cleanest interface (system call) to flush
the instruction and/or data cache(s) ?

Do you have some suggestion ?

Thank you for your attention.
Any suggestions are really welcome.

Sincerely yours,

Satoshi Adachi

Department of Applied Physics,
Tokyo Institute of Technology

Oookayama 2-12-1, Meguro,
Tokyo 152, JAPAN


1. How do I manually flush out swap disk and cache?

How do I manually flush out swap disk and cache?

And I do have a good reason for doing it! Linux is NOT being optimal
with allocating resources so I have to give it a boost.

My system appears to be reaching a saturation point when running
memory intensive apps.

When running a bunch of apps, and using that master of all memory hogs
Communicator, the systems runs fine at the start, but after a while I
notice my disk drive is accessed more and more frequently.  When I see
it doing that I check my memory and find, not only that there is very
little memory free - that in itself would be fine - but the system is
now swapping to disk!  It didn't swap to disk at the start, it ran
just fine with all the apps I had for over an hour!  There's no reason
why it shouldn't run just as smoothe after an hour as it did an hour
before.  I have 64 megs of ram.

This is why I need to flush out swap and cache, i.e., to get the
system to run smoothly again without having to swap to disk.

BTW-It never gets to this saturation point if I don't run massive apps like


2. man and MANPATH

3. shmem missing cache flush

4. About Radius server integrate with LDAP server

5. Way to flush cache memory?

6. Hostname remains changed to ISP in Kppp

7. cache flush bug in mm/filemap.c (all kernels >= 2.5.30(at least))

8. Two workgroups with Novell--Linux bridges between them Win95 clients from Workgroup1 don't see Workgroup2 in theirs Network neibourhood, and vice versa

9. cache memory not flushed?

10. How can I flush out buffer cache?

11. Regarding frequency of flushing cache to disk

12. flushing Directory Name Lookup Cache (DNLC) on Solaris 2.4

13. Flushing buffer and page cache