2009年6月22日月曜日

validate_cpu

main関数から呼び出している関数のうち、前回までにcopy_boot_params、init_heapの2つを
見てきました。今回は3つめ「validate_cpu」を見てみましょう。

arch/x86/boot/cpu.c
======
int validate_cpu(void)
{
  /*変数宣言(省略) */

  /* CPUのチェック */
  check_cpu(&cpu_level, &req_level, &err_flags);

  /* CPUレベルと要求レベルの比較 */
  if (cpu_level < req_level) {
    /* エラー処理(省略) */
  }

  /* エラーフラグが立っているか?*/
  if (err_flags) {
    /* エラー処理(省略)*/
  } else {
    return 0;
  }
}

=======

check_cpuという関数を呼び出して、関数内で設定された値をチェックして必要に応じてエラーメッセージを表示しているのみ。なので、実機能はcheck_cpuにあります。

arch/x86/boot/cpucheck.c
=======
int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
{
int err;

/* とりあえずCPUレベル3をセット */
memset(&cpu.flags, 0, sizeof cpu.flags);
cpu.level = 3;

/* アライメントチェックフラグがあればレベル4 */
if (has_eflag(X86_EFLAGS_AC))
cpu.level = 4;

/* CPUID命令でプロセッサを識別する。必要ならレベルも更新 */
get_flags();
/* エラーがないかチェックする */
err = check_flags();

/* 64bitかどうか */
if (test_bit(X86_FEATURE_LM, cpu.flags))
cpu.level = 64;

if (/*AMDの場合*/) {
~省略~
} else if (/* VIA C3の場合 */) {
~省略~
} else if (/* Transmetaの場合 */) {
~省略~
}

if (err_flags_ptr)
*err_flags_ptr = err ? err_flags : NULL;
if (cpu_level_ptr)
*cpu_level_ptr = cpu.level;
if (req_level_ptr)
*req_level_ptr = req_level;

return (cpu.level < req_level || err) ? -1 : 0;
}

=======

どんなCPUを使っているの?という情報をとってきてパラメータに格納しています。

0 件のコメント:

コメントを投稿