This was my original email, see below.  It has it's own topic.  Hopefully it may it's way to the mailer.


On Monday, February 26, 2018 2:39 PM, mark pleso <mpleso@yahoo.com> wrote:


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.

Enabling the printk will stop the hang. Or, just adding a wbinvd() instruction will stop the hang, and things proceed normally.  Code is below.

Any help would be appreciated.

btw - This not a commercial motherboard.

coreboot/src/cpu/x86/mp_init.c
static void asmlinkage smm_do_relocation(void *arg)
{
        const struct smm_module_params *p;
        const struct smm_runtime *runtime;
        int cpu;
        uintptr_t curr_smbase;
        uintptr_t perm_smbase;

        p = arg;
        runtime = p->runtime;
        cpu = p->cpu;
        curr_smbase = runtime->smbase;

        if (cpu >= CONFIG_MAX_CPUS) {
                printk(BIOS_CRIT,
                       "Invalid CPU number assigned in SMM stub: %d\n", cpu);
                return;
        }

        /*
         * The permanent handler runs with all cpus concurrently. Precalculate
         * the location of the new SMBASE. If using SMM modules then this
         * calculation needs to match that of the module loader.
         */
        perm_smbase = mp_state.perm_smbase;
        perm_smbase -= cpu * runtime->save_state_size;

        printk(BIOS_DEBUG, "New SMBASE 0x%08lx\n", perm_smbase);

        /* write cache to DRAM before calling relocation handler */ /* will stop hang */
        wbinvd();  /* <<=== OR NEW INSTRUCTION w/o printk STOPS HANG */

        /* Setup code checks this callback for validity. */
        mp_state.ops.relocation_handler(cpu, curr_smbase, perm_smbase);
}