<html><head></head><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:16px"><div id="yiv8421765384"><div id="yui_3_16_0_ym19_1_1519681767422_12186"><div style="color:#000;background-color:#fff;font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:16px;" id="yui_3_16_0_ym19_1_1519681767422_12185"><div id="yiv8421765384"><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_10938"><div style="color:#000;background-color:#fff;font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:16px;" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_10937"><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622">Has anyone else seen a hang during coreboot booting on a Broadwell-DE?  The issue appears to be in mp_init.c, in the function smm_do_relocation().  This is coreboot 4.7, but I think the issue exists in 4.6 as well.</div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622"><br></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr">Enabling the printk will stop the hang. Or, just adding a wbinvd() instruction will stop the hang, and things proceed normally.  Code is below.</div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr"><br></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr">Any help would be appreciated.</div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr"><br></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr">btw - This not a commercial motherboard.</div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr"><br></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr">coreboot/src/cpu/x86/mp_init.c</div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr">static void asmlinkage smm_do_relocation(void *arg)<br></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr"><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11182">{</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11183">        const struct smm_module_params *p;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11184">        const struct smm_runtime *runtime;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11185">        int cpu;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11186">        uintptr_t curr_smbase;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11187">        uintptr_t perm_smbase;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11188"><br id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11189"></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11190">        p = arg;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11191">        runtime = p->runtime;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11192">        cpu = p->cpu;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11193">        curr_smbase = runtime->smbase;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11194"><br id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11195"></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11196">        if (cpu >= CONFIG_MAX_CPUS) {</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11197">                printk(BIOS_CRIT,</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11198">                       "Invalid CPU number assigned in SMM stub: %d\n", cpu);</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11199">                return;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11200">        }</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11201"><br id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11202"></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11203">        /*</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11204">         * The permanent handler runs with all cpus concurrently. Precalculate</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11205">         * the location of the new SMBASE. If using SMM modules then this</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11206">         * calculation needs to match that of the module loader.</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11207">         */</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11208">        perm_smbase = mp_state.perm_smbase;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11209">        perm_smbase -= cpu * runtime->save_state_size;</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11210"><br id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11211"></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11212">        printk(BIOS_DEBUG, "New SMBASE 0x%08lx\n", perm_smbase);</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11212"><br></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11212">        /* write cache to DRAM before calling relocation handler */ /* will stop hang */</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11212">        wbinvd();  /* <<=== OR NEW INSTRUCTION w/o printk STOPS HANG */</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11213"><br id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11214"></div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11215">        /* Setup code checks this callback for validity. */</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11216">        mp_state.ops.relocation_handler(cpu, curr_smbase, perm_smbase);</div><div dir="ltr" id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_11217">}</div></div><div id="yiv8421765384yui_3_16_0_ym19_1_1519681767422_4622" dir="ltr"><br></div></div></div></div></div></div></div></div></body></html>