Go to file
Sven Schnelle 47b3fb403d SMM: flush caches after disabling caching
Fixes spurious SMI crashes i've seen, and ACPI/SMM interaction.
For reference, the mail i've sent to ML with the bugreport:

whenever i've docked/undocked the thinkpad from the docking station,
i had to do that twice to get the action actually to happen.

First i thought that would be some error in the ACPI code. Here's a
short explanation how docking/undocking works:

1) ACPI EC Event 0x37 Handler is executed (EC sends event 0x37 on dock)
2) _Q37 does a Trap(SMI_DOCK_CONNECT). Trap is declared as follows:

   a) Store(Arg0, SMIF) // SMIF is in the GNVS Memory Range
   b) Store(0, 0x808)   // Generates I/O Trap to SMM
   c) // SMM is executed
   d) Return (SMIF)    // Return Result in SMIF

I've verified that a) is really executed with ACPI debugging in the
Linux Kernel. It writes the correct value to GNVS Memory. After that,
i've logged the SMIF value in SMM, which contains some random (or
former) value of SMIF.

So i've added the GNVS area to /proc/mtrr which made things work.
I've also tried a wbinvd() in SMM code, with the same result.

After reading the src/cpu/x86/smm/smmhandler.S code, i've recognized
that it starts with:

        movw    $(smm_gdtptr16 - smm_handler_start +
        SMM_HANDLER_OFFSET), %bx
        data32  lgdt %cs:(%bx)

        movl    %cr0, %eax
        andl    $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */
        orl     $0x60000001, %eax /* CD, NW, PE = 1 */
        movl    %eax, %cr0

        /* Enable protected mode */
        data32  ljmp    $0x08, $1f

...which disables caching in SMM code, but doesn't flush the cache.

So the problem is:

- the linux axpi write to the SMIF GNVS Area will be written to Cache,
  because GNVS is WB
- the SMM code runs with cache disabled, and fetches SMIF directly from
  Memory, which is some other value

Possible Solutions:

- enable cache in SMM (yeah, cache poisoning...)

- flush caches in SMM (really expensive)

- mark GNVS as UC in Memory Map (will only work if OS
  really marks that Area as UC. Checked various vendor BIOSes, none
  of them are marking NVS as UC. So this seems rather uncommon.)

- flush only the cache line which contains GNVS. Would fix this
  particular problem, but users/developers could see other Bugs like
  this. And not everyone likes to debug such problems. So i won't like
  this solution.

Change-Id: Ie60bf91c5fd1491bc3452d5d9b7fc8eae39fd77a
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/39
Tested-by: build bot (Jenkins)
2011-06-18 10:02:22 +02:00
documentation Whitespace/typo/cosmetic fixes (trivial). 2010-09-23 18:48:27 +00:00
payloads Allow libpayload to use an OXPCIe 952 card on systems without 2011-04-16 00:13:17 +00:00
src SMM: flush caches after disabling caching 2011-06-18 10:02:22 +02:00
util superiotool: Cosmetics and coding style fixes. 2011-06-09 21:26:47 +02:00
.gitignore Add basic .gitignore 2011-06-09 00:13:10 +02:00
COPYING update license template. 2006-08-12 22:03:36 +00:00
Makefile Add regression test for build directory handling to make lint target 2011-05-21 22:18:59 +00:00
Makefile.inc Change make crossgcc to build without gdb by default 2011-06-09 06:09:17 +02:00
README Update README with newer version of the text from the web page 2011-06-15 10:16:33 +02:00

README

-------------------------------------------------------------------------------
coreboot README
-------------------------------------------------------------------------------

coreboot is a Free Software project aimed at replacing the proprietary BIOS
(firmware) found in most computers.  coreboot performs a little bit of
hardware initialization and then executes additional boot logic, called a
payload.

With the separation of hardware initialization and later boot logic,
coreboot can scale from specialized applications that run directly
firmware, run operating systems in flash, load custom
bootloaders, or implement firmware standards, like PC BIOS services or
UEFI. This allows for systems to only include the features necessary
in the target application, reducing the amount of code and flash space
required.

coreboot was formerly known as LinuxBIOS.


Payloads
--------

After the basic initialization of the hardware has been performed, any
desired "payload" can be started by coreboot.

See http://www.coreboot.org/Payloads for a list of supported payloads.


Supported Hardware
------------------

coreboot supports a wide range of chipsets, devices, and mainboards.

For details please consult:

 * http://www.coreboot.org/Supported_Motherboards
 * http://www.coreboot.org/Supported_Chipsets_and_Devices


Build Requirements
------------------

 * gcc / g++
 * make

Optional:

 * doxygen (for generating/viewing documentation)
 * iasl (for targets with ACPI support)
 * gdb (for better debugging facilities on some targets)
 * ncurses (for 'make menuconfig')
 * flex and bison (for regenerating parsers)


Building coreboot
-----------------

Please consult http://www.coreboot.org/Build_HOWTO for details.


Testing coreboot Without Modifying Your Hardware
------------------------------------------------

If you want to test coreboot without any risks before you really decide
to use it on your hardware, you can use the QEMU system emulator to run
coreboot virtually in QEMU.

Please see http://www.coreboot.org/QEMU for details.


Website and Mailing List
------------------------

Further details on the project, a FAQ, many HOWTOs, news, development
guidelines and more can be found on the coreboot website:

  http://www.coreboot.org

You can contact us directly on the coreboot mailing list:

  http://www.coreboot.org/Mailinglist


Copyright and License
---------------------

The copyright on coreboot is owned by quite a large number of individual
developers and companies. Please check the individual source files for details.

coreboot is licensed under the terms of the GNU General Public License (GPL).
Some files are licensed under the "GPL (version 2, or any later version)",
and some files are licensed under the "GPL, version 2". For some parts, which
were derived from other projects, other (GPL-compatible) licenses may apply.
Please check the individual source files for details.

This makes the resulting coreboot images licensed under the GPL, version 2.