SMM on AMD K8 Part 2/2
authorRudolf Marek <r.marek@assembler.cz>
Sat, 18 Dec 2010 23:30:59 +0000 (23:30 +0000)
committerStefan Reinauer <stepan@openbios.org>
Sat, 18 Dec 2010 23:30:59 +0000 (23:30 +0000)
Signed-off-by: Rudolf Marek <r.marek@assembler.cz>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6202 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/cpu/amd/smm/smm_init.c
src/southbridge/via/vt8237r/smihandler.c

index d6f728bbba0c1ca4f3775ecfadbdc1b6ce44a974..ad1c112ed053b1249ff37d861f511d3f8f8cde75 100644 (file)
@@ -57,13 +57,13 @@ void smm_init(void)
 
                smm_handler_copied = 1;
 
-               /* MTRR changes don't like an enabled cache */
-               disable_cache();
-
                /* Back up MSRs for later restore */
                syscfg_orig = rdmsr(SYSCFG_MSR);
                mtrr_aseg_orig = rdmsr(MTRRfix16K_A0000_MSR);
 
+               /* MTRR changes don't like an enabled cache */
+               disable_cache();
+
                msr = syscfg_orig;
                /* Allow changes to MTRR extended attributes */
                msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
@@ -78,60 +78,46 @@ void smm_init(void)
                msr.lo = 0x18181818;
                msr.hi = 0x18181818;
                wrmsr(MTRRfix16K_A0000_MSR, msr);
-               enable_cache();
 
-               /* disable the extended features */
+               /* enable the extended features */
                msr = syscfg_orig;
                msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
                msr.lo |= SYSCFG_MSR_MtrrFixDramEn;
                wrmsr(SYSCFG_MSR, msr);
 
-               /* enable the SMM memory window */
-               // TODO does "Enable ASEG SMRAM Range"  have to happen on 
-               // every CPU core?
-               msr = rdmsr(SMM_MASK_MSR);
-               msr.lo |= (1 << 0); // Enable ASEG SMRAM Range
-               msr.lo &= ~(1 << 2); // Open ASEG SMRAM Range
-               wrmsr(SMM_MASK_MSR, msr);
-
+               enable_cache();
                /* copy the real SMM handler */
                memcpy((void *)SMM_BASE, &_binary_smm_start, (size_t)&_binary_smm_size);
                wbinvd();
 
-               msr = rdmsr(SMM_MASK_MSR);
-               msr.lo |= ~(1 << 2); // Close ASEG SMRAM Range
-               wrmsr(SMM_MASK_MSR, msr);
-
-               /* Change SYSCFG so we can restore the MTRR */
-               msr = syscfg_orig;
-               msr.lo |= SYSCFG_MSR_MtrrFixDramModEn;
-               msr.lo &= ~SYSCFG_MSR_MtrrFixDramEn;
-               wrmsr(SYSCFG_MSR, msr);
-
                /* Restore MTRR */
                disable_cache();
-               wrmsr(MTRRfix16K_A0000_MSR, mtrr_aseg_orig);
 
                /* Restore SYSCFG */
                wrmsr(SYSCFG_MSR, syscfg_orig);
+
+               wrmsr(MTRRfix16K_A0000_MSR, mtrr_aseg_orig);
                enable_cache();
        }
 
+
        /* But set SMM base address on all CPUs/cores */
        msr = rdmsr(SMM_BASE_MSR);
        msr.lo = SMM_BASE - (lapicid() * 0x400);
        wrmsr(SMM_BASE_MSR, msr);
-}
-
-void smm_lock(void)
-{
-       // TODO I think this should be running on each CPU
-       msr_t msr;
 
-       printk(BIOS_DEBUG, "Locking SMM.\n");
+       /* enable the SMM memory window */
+       msr = rdmsr(SMM_MASK_MSR);
+       msr.lo |= (1 << 0); // Enable ASEG SMRAM Range
+       wrmsr(SMM_MASK_MSR, msr);
 
        /* Set SMMLOCK to avoid exploits messing with SMM */
        msr = rdmsr(HWCR_MSR);
        msr.lo |= (1 << 0);
        wrmsr(HWCR_MSR, msr);
 }
+
+void smm_lock(void)
+{
+       /* We lock SMM per CPU core */
+}
index 344293dfa855e09e1060d1bf93c5675246a8b057..0c8ff2f7c78b723ea70b1249c72e5febeb8d0d2e 100644 (file)
@@ -208,9 +208,9 @@ smi_handler_t southbridge_smi[32] = {
        NULL,                     //  [1]
        NULL,                     //  [2]
        NULL,                     //  [3]
-       southbridge_smi_cmd,      //  [4]
+       NULL,                     //  [4]
        NULL,                     //  [5]
-       NULL,                     //  [6]
+       southbridge_smi_cmd,      //  [6]
        NULL,                     //  [7]
        NULL,                     //  [8]
        NULL,                     //  [9]