blob: 4b61f5b1836c1b221fcf2353a9aa2264ae2fbc3e [file] [log] [blame]
Author: Chirantan Ekbote
Email: ekbotec@chromium.org
Date: 2013/06/20
fthread - Cooperative Multithreading Framework
==============================================
Overview
--------
fthread is a framework for cooperative multithreading in U-Boot. It
uses a simple priority-queue based scheduler to handle thread
management. Scheduling is non-preemptive, so a thread must hand
control back to the scheduler, either explicitly by yielding or
implicitly by joining with another thread or sleeping for some time.
This avoids locking complexity and race conditions since each thread
can ensure that it only hands control back in safe, non-critical
regions of code. Each thread has its own stack and set of register
values and is completely isolated and independent from any other
thread.
Motivation
----------
U-Boot is responsible for initialising all Chromebook hardware before
handing control off to the kernel. This includes all the verified
boot logic, device initialisation, loading software, verifying with
RSA/hashing and checking rollback counters in TPM.
Currently, a lot of time is wasted waiting for peripherals to come
online. For example on the Samsung ARM Chromebook, around 550ms is
spent talking to the TPM, 250ms waiting for the eMMC to start up and
80ms waiting for the kernel to load. It should be possible to overlap
some of these tasks with multithreading to reduce the overall boot time.
Usage
-----
To enable fthread support, build U-Boot with:
#define CONFIG_FTHREAD
To enable fthread commands at the U-Boot prompt, also build with:
#define CONFIG_CMD_FTHREAD
Both of these options are enabled by default for sandbox. To test
fthread, launch U-Boot and run the following command at the prompt:
> fthread test
Additionally, to view runtime statistics for all threads spawned by
the library, build with:
#define CONFIG_FTHREAD_REPORT
This will print out a table of of runtime statistics when the library
is killed with fthread_shutdown(). To enable the report command at
the the U-Boot prompt, build with:
#define CONFIG_CMD_FTHREAD_REPORT
Thread information that is reported includes the thread's state,
spawned time, running time, the last time it was run, and its name.
Please see include/fthread.h for the public API and
common/cmd_fthread.c for examples on how to use the library.
Porting
-------
fthread relies on some platform-specific features to provide the
context switching necessary to make it work. Any platform that wants
to use fthread must provide implementations of the following:
struct fthread_mctx;
This struct holds all the information necessary to save and
load contexts, including the link register, program counter,
stack pointer, and general purpose registers.
struct fthread_mctx *fthread_mctx_alloc();
Allocates enough memory to hold all the context information
for a particular thread.
void fthread_mctx_free(struct fthread_mctx *mctx);
Frees the memory allocated for the context.
int fthread_mctx_set(struct fthread_mctx *mctx, void
(*func)(void), char *sk_addr_lo,
char *sk_addr_hi);
Stores context information in mctx such that when it is
restored, execution will start from the beginning of func.
void fthread_mctx_switch(struct fthread_mctx *octx,
struct fthread_mctx *nctx);
Saves the current context in octx and loads the context from
nctx.
More extensive documentation on these functions is available in
lib/fthread/fthread_priv.h. Please see
arch/sandbox/cpu/fthread_mctx.c and arch/arm/lib/fthread_mctx.c for
examples of how these are implemented for sandbox and ARM,
respectively.