On 01.11.2008 22:28, Carl-Daniel Hailfinger wrote: > On 01.11.2008 20:11, Carl-Daniel Hailfinger wrote: > >> On 01.11.2008 18:56, Corey Osgood wrote: >> >> >>> System reset seems to occur between 2 and 3, both of those logs attached, >>> along with arch/x86/via/stage1.o With HALT_AFTER=3, the post code keeps >>> changing, as expected with the system rebooting, with HALT_AFTER=2 it was >>> 0xc2. >>> >>> >>> >> Great results, thanks a lot! >> One bug spotted and fixed. Can you retest with the same method and the >> updated patch attached to this mail? I hope it will die much later, >> perhaps at HALT_AFTER=13 or so. >> >> > > Thanks for the information that HALT_AFTER=5 is the last working setting. >
OK, I reread every line of the code and reimplemented the problematic stuff from scratch. Can you try the new patch with HALT_AFTER=5 and 6? I'm pretty confident that if 6 works, all later numbers should also not reboot. By the way, the new code should be even better than the (working) v2 code. Regards, Carl-Daniel -- http://www.hailfinger.org/
Index: corebootv3-via_car/arch/x86/via/stage1.c =================================================================== --- corebootv3-via_car/arch/x86/via/stage1.c (Revision 978) +++ corebootv3-via_car/arch/x86/via/stage1.c (Arbeitskopie) @@ -29,6 +29,7 @@ #include <string.h> #include <mtrr.h> #include <via_c7.h> +#include <uart8250.h> /** * Disable Cache As RAM (CAR) after memory is setup. @@ -53,26 +54,163 @@ printk(BIOS_DEBUG, "disable_car global_vars pointer adjusted\n"); printk(BIOS_DEBUG, "entering asm code now\n"); +#define HALT_AFTER 5 __asm__ __volatile__( + + " movb $0xC1, %%al\n" + " outb %%al, $0x80\n" + " movl %[newesp], %%esp \n" -#if ENABLE_BROKEN_CAR_DISABLING + " movb $0xC3, %%al\n" + " outb %%al, $0x80\n" + /* We don't need cache as ram for now on */ /* disable cache */ " movl %%cr0, %%eax \n" " orl $(0x1<<30),%%eax \n" " movl %%eax, %%cr0 \n" - /* The MTRR setup below causes the machine to reset. Must investigate. */ + " movb $0xC4, %%al\n" + " outb %%al, $0x80\n" + + " movl $99, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $99, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $104, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $105, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $115, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $108, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $10, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + + " movb $0xC5, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 5 + " hlt\n" +#endif + /* disable fixed mtrr from now on, it will be enabled by coreboot_ram again*/ - " movl %[_SYSCFG_MSR], %%ecx \n" - " rdmsr \n" - " andl %[_SYSCFG_MSR_newval], %%eax\n" -// " andl $(~(SYSCFG_MSR_MtrrFixDramModEn | SYSCFG_MSR_MtrrFixDramEn)), %%eax\n" /* clear sth */ + " xorl %%eax, %%eax \n" + " xorl %%edx, %%edx \n" + " movl $0x201, %%ecx \n" " wrmsr \n" -#warning Must clear MTRR 0x200 and 0x201 + " movl $0x200, %%ecx \n" + " wrmsr \n" + " movb $0xC6, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 6 + " hlt\n" +#endif + + " movl $102, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $105, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $120, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $109, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $116, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $114, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $114, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $105, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $115, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $108, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $10, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + + " movb $0xC7, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 7 + " hlt\n" +#endif + /* Set the default memory type and disable fixed and enable variable MTRRs */ " movl %[_MTRRdefType_MSR], %%ecx \n" " xorl %%edx, %%edx \n" @@ -80,20 +218,212 @@ " movl $0x00000800, %%eax \n" " wrmsr \n" + " movb $0xC8, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 8 + " hlt\n" +#endif + + " movl $118, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $114, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $105, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $108, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $109, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $116, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $114, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $114, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $115, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $110, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $108, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $10, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + + " movb $0xC9, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 9 + " hlt\n" +#endif + /* enable cache */ " movl %%cr0, %%eax \n" " andl $0x9fffffff,%%eax \n" " movl %%eax, %%cr0 \n" + + " movb $0xCA, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 10 + " hlt\n" #endif + " movl $99, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $99, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $104, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $110, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $97, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $108, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $10, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + + " movb $0xCB, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 11 + " hlt\n" +#endif + " wbinvd \n" + " movb $0xCC, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 12 + " hlt\n" +#endif + + " movl $119, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $98, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $105, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $110, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $118, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $32, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $100, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $111, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $110, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $101, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + " movl $10, %%edx\n" + " movl %[_TTYSx_BASE], %%eax\n" + " call uart8250_tx_byte\n" + + " movb $0xCD, %%al\n" + " outb %%al, $0x80\n" + +#if HALT_AFTER == 13 + " hlt\n" +#endif + " call stage1_phase3 \n" :: [newesp] "i" (newlocation), [_SYSCFG_MSR] "i" (SYSCFG_MSR), [_SYSCFG_MSR_newval] "i" (~(SYSCFG_MSR_MtrrFixDramModEn | SYSCFG_MSR_MtrrFixDramEn)), [_SYSCFG_MSR_MtrrFixDramModEn] "i" (SYSCFG_MSR_MtrrFixDramModEn), [_SYSCFG_MSR_MtrrFixDramEn] "i" (SYSCFG_MSR_MtrrFixDramEn), - [_MTRRdefType_MSR] "i" (MTRRdefType_MSR) + [_MTRRdefType_MSR] "i" (MTRRdefType_MSR), + [_TTYSx_BASE] "i" (TTYSx_BASE) : "memory"); }
-- coreboot mailing list: coreboot@coreboot.org http://www.coreboot.org/mailman/listinfo/coreboot