/* * This file is part of the coreboot project. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ /* * input %esp: return address (not pointer to return address!) * clobber the content of eax, ecx, edx */ #include <cpu/x86/mtrr.h> .section .text .global check_mtrr check_mtrr: /* Use the MTRR default type MSR as a proxy for detecting INIT#. * Reset the system if any known bits are set in that MSR. That is * an indication of the CPU not being properly reset. */ check_for_clean_reset: movl $MTRR_DEF_TYPE_MSR, %ecx rdmsr andl $(MTRR_DEF_TYPE_EN | MTRR_DEF_TYPE_FIX_EN), %eax cmp $0, %eax jnz warm_reset jmp *%esp /* perform warm reset */ warm_reset: movw $0xcf9, %dx movb $0x06, %al outb %al, %dx /* Should not reach this*/ .Lhlt: hlt jmp .Lhlt