トップ «前の日記(2003年05月07日) 最新 次の日記(2003年05月10日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2003年05月08日 雷雨

[tDiary]

「本日のリンク元」の文字コードがいろいろあって化ける現象を直すための「本日のリンク元強化プラグイン」をインストールした。このプラグインはcpu負荷が高いのだそうだ。表示が遅くなりそうなのでtopで表示する日数を15日に減らすことにした。

昨日「tDiary1.5.2以前のページが表示できなくなった」と書いたが、ここに修正方法が載っていたので直すことができた。.td2ファイルの後ろにゴミがついているのでエディタで削除してcacheをクリアしたらなおった。tDiaryは使いやすいのと、コミュニティーがしっかりしててうれしい(^-^)

[CAT709]

sh-linuxカーネルがrebootの最後にどのようにCPUをリセットするか自分用にまとめておく。kernelのreboot処理の最後は arch/sh/kernel/process.c の
void machine_restart(char * __unused)
{
    /* SR.BL=1 and invoke address error to let CPU reset (manual reset) */
    asm volatile("ldc %0, sr\n\t"
                 "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001));
}
だ。わかりやすく書くと
mov.l 0x10000000,r2   ←RISC CPUなのでこういう風に32bit即値はかけないのだが便宜的に
ldc   r2,sr           ←ステータスレジスタのBLビットを1
mov.l 0x80000001,r1
mov.l @r1,r2
アドレス0x80000001からlognwordアクセスを行ってアドレスエラー例外を発生させている。さて、SH7709Sのハードウェアマニュアル4章例外処理によれば
4.2.5 例外要求とBL ビット
SR のBL ビットが0 のとき、例外、割り込みを受け付けます。
SR のBL ビットが1 のときに、一般例外が発生した場合には、CPU の内部レジスタはリセット後の状態になり、
他のモジュールのレジスタは、一般例外発生前の内容を保持した状態でリセットと同アドレス(H'A0000000)に
分岐します。
と書いてあるとおりでCPUリセットがかかるようだ。さらにreset後ipl-rom内のスタートコードに戻るが、
start:                            0xa0000000番地
        mov.l   0xffffffd4,r0     EXPEVTレジスタ
        mov.l   @r0,r13           /* save EXPEVT */
        略
        mov.l   expevt_on_start,r0
        mov.l   r13,@r0           /* set initial EXPEVT */
 
としてあって、main.cに飛んでから
 
  if (expevt_on_start != 0)
    {                           /* Reboot */
      putString ("!\n");
という具合だ。同じくSH7709Sのハードウェアマニュアル4章例外処理によれば EXPEVT レジスタはパワーオンリセット時には0x000なののでEXPEVTを見ることでパワーオンかreboot処理なのかを区別している(実際には区別しても処理は同じ)