[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pbsd-mg2] Re: Telios cannot load kernel



takemura@sm.sony.co.jp writes:
>  >  I-cache, D-cache のフラッシュを削る(これは、R3000用に書きかえる???)
> 
> 以前は flush してませんでした。flush しないと、2 回に 1 回ぐらい
> 起動できないことがありました。動作が不安定な場合は、ここを
> 疑ったほうがいいと思います。sys/arch/mips/mips/mips1_なんとか.S あたり
> を探せば使えるコードを見つけることができると思います。

メモリ上の命令を書き換えているので、write back方式のdata cacheの場合はま
ずdata cacheの書き戻しの操作が必要です。

その後、instruction cacheの無効化を実行する必要があります。

こうしないと、書き換えたつもりの命令をCPUが確実に実行しないからです。

CPU固有のcache操作をしたくない場合は、たとえば以下のような方法でcacheの
掃き出しを行なうことができます。

[data cache]

大きな配列のデータを全部読み出す(書き込む)。結果として、今までdata cache
に入っていた内容は追い出される。

	bzero(large_array, array_size);

[instruction cache]

サイズの大きな関数を呼び出す。たとえば、

void large_func(void)
{
	asm volatile (".space 32768");
}

こうすると、nop(0x00000000)で埋まった32KBの関数を実行できます。

篠原