coreboot/payloads/libpayload/include
Julius Werner 702dc50f1d libpayload: ehci: Cache management is hard, let's go copying...
It turns out that my previous commit to make the EHCI stack cache aware
on ARM devices wasn't quite correct, and the problem is actually much
trickier than I thought. After having some fun with more weird transfer
problems that appear/disappear based on stack alignment, this is my
current worst-case threat model that any cache managing implementation
would need to handle correctly:

Some upper layer calls ehci_bulk() with a transfer buffer on its stack.
Due to stack alignment, it happens to start just at the top of a cache
line, so up to 64 - 4 bytes of ehci_bulk's stack will share that line.
ehci_bulk() calls dcache_clean() and initializes the USB transfer.
Between that point and the call to dcache_invalidate() at the end of
ehci_bulk(), any access to the stack variables in that cache line (even
a speculative prefetch) will refetch the line into the cache. Afterwards
any other access to a random memory location that just happens to get
aliased to the same cache line may evict it again, causing the processor
to write out stale data to the transfer buffer and possibly overwrite
data that has already been received over USB.

In short, any dcache_clean/dcache_invalidate-based implementation that
preserves correctness while allowing any arbitrary (non cache-aligned)
memory location as a transfer buffer is presumed to be impossible.
Instead, this patch causes all transfer data to be copied to/from a
cache-coherent bounce buffer. It will still transfer directly if the
supplied buffer is already cache-coherent, which can be used by callers
to optimize their transfers (and is true by default on x86).

CQ-DEPEND=CL:169170
BUG=chrome-os-partner:21969
TEST=Make sure Snow still boots from the USB 2.0 port.

Change-Id: I112908410bdbc8ca028d44f2f5d388c529f8057f
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/169231
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
2013-09-14 01:31:18 +00:00
..
armv7/arch arm: libpayload: Make cache invalidation take pointers instead of integers 2013-08-29 22:48:54 +00:00
arpa Refactor the endianness conversion functions and header files. 2012-11-08 19:49:51 +01:00
pci libpayload: Fix renaming of REG_CLASS_DEV to REG_SUBCLASS 2012-12-10 16:45:00 +01:00
storage libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
sys libpayload: Start using only internal and compiler headers. 2013-03-13 22:04:44 +01:00
usb libpayload: usb mass storage card hot plug 2013-06-09 15:03:16 -07:00
x86/arch libpayload: Make EHCI driver cache-aware 2013-08-29 22:50:51 +00:00
assert.h libpayload: Fix the format string of the assert macro. 2012-11-07 18:36:05 +01:00
cbfs.h libpayload: New CBFS to support multiple firmware media sources. 2013-02-12 11:34:20 +01:00
cbfs_core.h libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
cbfs_ram.h libpayload: expose cbfs ram functions 2013-05-24 16:27:51 -07:00
coreboot_tables.h arm: libpayload: Add cache coherent DMA memory definition and management 2013-08-29 22:48:49 +00:00
ctype.h
endian.h libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
errno.h
getopt.h
inttypes.h libpayload: Start using only internal and compiler headers. 2013-03-13 22:04:44 +01:00
ipchksum.h Move the definition of ipchksum into its own header file. 2012-11-07 18:30:21 +01:00
kconfig.h libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
keycodes.h libpayload: Make keycode constants available outside of curses.h. 2013-03-18 20:45:48 +01:00
lar.h
libpayload.h libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
limits.h libpayload: Improve compatibility 2011-07-16 11:09:28 +02:00
lzma.h LZMA: Add a version of ulzma which takes the input and output buffer sizes. 2013-08-14 17:05:34 -07:00
malloc.h libpayload: Provide atol(), malloc.h 2011-07-07 22:29:53 +02:00
multiboot_tables.h
panel.h libpayload: Add PDCurses and ncurses' libform/libmenu 2011-08-04 08:10:41 +02:00
pci.h libpayload: Add definitions for more config space registers. 2012-11-07 18:36:27 +01:00
stdarg.h libpayload: Don't sneak in compiler includes 2013-04-09 13:45:42 -07:00
stddef.h Make ssize_t an actual ssize_t 2013-05-03 14:09:32 -07:00
stdint.h libpayload: Fix type issues 2013-03-26 19:36:39 +01:00
stdio.h libpayload: Add the format attribute to functions in stdio.h. 2012-11-07 18:36:14 +01:00
stdlib.h libpayload: ehci: Cache management is hard, let's go copying... 2013-09-14 01:31:18 +00:00
string.h libpayload: Implement strlcpy 2011-07-07 22:29:35 +02:00
strings.h libpayload: Implement ffs() 2011-03-01 07:23:49 +00:00
sysinfo.h libpayload: Change CONFIG_* to CONFIG_LP_* in the kconfig. 2013-08-14 17:05:33 -07:00
term.h libpayload: remove trailing whitespace and run dos2unix 2011-11-01 19:08:23 +01:00
unistd.h libpayload: Don't sneak in compiler includes 2013-04-09 13:45:42 -07:00
video_console.h