console.c void panic(char *s)

トップページ
jupiteroak.hatenablog.com


console.c
https://github.com/mit-pdos/xv6-public/blob/master/console.c#L106

void panic(char *s)
{
  int i;
  uint pcs[10];

  cli();
  cons.locking = 0;
  // use lapiccpunum so that we can call panic from mycpu()
  cprintf("lapicid %d: panic: ", lapicid());
  cprintf(s);
  cprintf("\n");
  getcallerpcs(&s, pcs);
  for(i=0; i<10; i++)
    cprintf(" %p", pcs[i]);
  panicked = 1; // freeze other CPU
  for(;;)
    ;
}

panic関数は、エラーメッセージを出力してOSの動作を停止させます。

引数 char *s
エラーメッセージの文字列を指定するアドレスです。


処理の内容

 cli();

cli関数を呼び出して、ハードウェア割り込みを無効化します。

  cons.locking = 0;

コンソールの操作に関連するロックを取得しないようにします。

  cprintf("lapicid %d: panic: ", lapicid());
  cprintf(s);
  cprintf("\n");

cprintf関数で、panic関数を呼び出したプロセッサのローカルAPIC IDの値、エラーメッセージ、改行を出力します

  getcallerpcs(&s, pcs);
  for(i=0; i<10; i++)
    cprintf(" %p", pcs[i]);

getcallerpcs関数を呼び出して、今まで呼び出された各関数で使用されているコールスタックから、リターンアドレスを取得します。
取得したリターンアドレスは配列pcsに格納されているので、この配列pcsとcprintf関数を用いてスタックトレースを表示します。

panicked = 1;
for(;;)
   ;

最後にpanic関数が呼び出されたことを示すフラグをセットして、無限ループの処理に入ります。