見てきました。今回は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 件のコメント:
コメントを投稿