<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.coreboot.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.coreboot.org/api.php?action=feedcontributions&amp;user=JCrouse&amp;feedformat=atom</id>
		<title>coreboot - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.coreboot.org/api.php?action=feedcontributions&amp;user=JCrouse&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Special:Contributions/JCrouse"/>
		<updated>2013-05-24T13:01:17Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.5</generator>

	<entry>
		<id>http://www.coreboot.org/Vendors</id>
		<title>Vendors</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Vendors"/>
				<updated>2008-09-02T14:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* AMD */  Expand&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Vendors ==&lt;br /&gt;
&lt;br /&gt;
== AMD ==&lt;br /&gt;
&lt;br /&gt;
*[http://www.amd.com AMD] has has been very actively supporting coreboot for a few years now. They have added support for many of their CPUs including:&lt;br /&gt;
** [http://www.amd.com/us-en/ConnectivitySolutions/ProductInformation/0,,50_2330,00.html|AMD Geode LX CPU]&lt;br /&gt;
** [http://www.amd.com/us-en/ConnectivitySolutions/ProductInformation/0,,50_2330_9863_13022^13054,00.html CS5536 Chipset]&lt;br /&gt;
** [http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_9485_9488,00.html K8/FAM 0F CPUs (Athlon, Opteron)]&lt;br /&gt;
** [http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_15331,00.html FAM10 CPUs (Barcelona, Phenom)]&lt;br /&gt;
* The [[AMD SimNow]] simulator is a fast and configurable x86 and AMD64 dynamically-translating instruction-level platform simulator. With SimNow users can connect complex software models to form a PC platform emulation environment. SimNow™ emulates AMD Athlon™ 64 and AMD Opteron™ uniprocessor and multiprocessor based systems that run several commercial operating systems and applications.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*[[AMD Geode Porting Guide]] is a collection on information to help you on your way to porting coreboot to an AMD Geode platform.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*AMD frequently has active coreboot developers in the '''#coreboot''' channel on [http://www.freenode.net irc.freenode.net].&lt;br /&gt;
&lt;br /&gt;
== VIA ==&lt;br /&gt;
&lt;br /&gt;
[http://www.via.com.tw VIA] is helping the coreboot community support many new Epia's, mainboards and chipsets with several code donations and open programming guides. With key input from VIA, coreboot will soon support over 30 more Mini-ITX mainboards. These mainboards are made by VIA, Jetway, Phitronics and MSI featuring the VIA C7 cpu, CN700 and VT8237 chipset.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://linux.via.com.tw/support/downloadFiles.action Linux VIA Portal] aims to expand cooperation with open source communities by providing drivers, chipset programming manuals and source code for select Linux distributions to technical software developers.&lt;br /&gt;
&lt;br /&gt;
VIA has recently donated v2 Cache-as-Ram (CAR) source for the C7 cpu.&lt;br /&gt;
&lt;br /&gt;
VIA posted programming guides for CX700M/VX700 and VX800 at the [http://linux.via.com.tw/support/downloadFiles.action VIA Download Portal]&lt;br /&gt;
&lt;br /&gt;
VIA help fix raminit for the CN700 so coreboot can now support all the C7 + CN700 + VT8237R boards (about 30- 40 currently in production) in V2 and move them into V3.&lt;br /&gt;
&lt;br /&gt;
VIA helped support the VT8237S and KT890 for the [http://www.asus.com.tw/products.aspx?l1=3&amp;amp;l2=15&amp;amp;l3=143&amp;amp;l4=0&amp;amp;model=576&amp;amp;modelmenu=1 ASUS A8V-E SE] and [http://www.asus.com/products.aspx?l1=3&amp;amp;l2=101&amp;amp;l3=324&amp;amp;l4=0&amp;amp;model=1807&amp;amp;modelmenu=1 ASUS M2V-MX SE].&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Libpayload</id>
		<title>Libpayload</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Libpayload"/>
				<updated>2008-08-28T19:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: add link to documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''libpayload''' is a small BSD-licensed static library (a lightweight implementation of common and useful functions) intended to be used as a basis for coreboot payloads.&lt;br /&gt;
&lt;br /&gt;
The benefits of linking a coreboot payload against libpayload are:&lt;br /&gt;
&lt;br /&gt;
* Payloads do not have to implement and maintain low-level code for I/O, common functions, etc.&lt;br /&gt;
* Payloads can be recompiled and deployed for CPU architectures supported by coreboot in the future.&lt;br /&gt;
* The libpayload functions can be tested and scrutinized outside payload development.&lt;br /&gt;
* Payloads themselves may be partly host-tested, e.g. against an emulation libpayload.&lt;br /&gt;
&lt;br /&gt;
''Just give us a main() and a pocket full of dreams and we'll do the rest.''&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Provides a [[Libpayload#Libc_Coverage|subset of libc functions]] (e.g. malloc, printf, strcmp, etc).&lt;br /&gt;
* Provides an optional tiny (n)curses implementation.&lt;br /&gt;
* Provides various small drivers for&lt;br /&gt;
** keyboard&lt;br /&gt;
** PC speaker&lt;br /&gt;
** NVRAM/CMOS access&lt;br /&gt;
** serial console&lt;br /&gt;
** VGA&lt;br /&gt;
** Geode framebuffer&lt;br /&gt;
* Reads and parses the coreboot table.http://qa.coreboot.org/docs/libpayload/&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
* [[Payload API|Discussion of the API for passing parameters to the payload]]&lt;br /&gt;
&lt;br /&gt;
== Payloads using libpayload ==&lt;br /&gt;
&lt;br /&gt;
* [[coreinfo]] is a small payload which can display system information such as PCI info, an NVRAM dump, or the coreboot v3 printk buffer.&lt;br /&gt;
* [[GRUB invaders]] has been ported successfully to libpayload (patch pending).&lt;br /&gt;
* [[tint]] (a console tetris clone) has been successfully ported to libpayload.&lt;br /&gt;
* [http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=tree;f=scripts/kconfig/lxdialog;hb=HEAD lxdialog] from the Linux '''kconfig''' utility has been ported to be usable when linked with libpayload (patch pending).&lt;br /&gt;
&lt;br /&gt;
== Downloading and building libpayload ==&lt;br /&gt;
&lt;br /&gt;
 $ svn co svn://coreboot.org/repos/trunk/payloads/libpayload&lt;br /&gt;
 $ cd libpayload&lt;br /&gt;
 $ make menuconfig&lt;br /&gt;
 $ make&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
See the autogenerated documentation for libpayload [http://qa.coreboot.org/docs/libpayload/ here].&lt;br /&gt;
&lt;br /&gt;
== Libc coverage ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot; &lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Function/Macro/Variable&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''assert.h'''&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| assert()&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''ctype.h'''&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isalnum(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isalpha(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int iscntrl(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isdigit(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isgraph(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int islower(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isprint(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int ispunct(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isspace(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isupper(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isxdigit(int character)&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''errno.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;errno&amp;lt;/code&amp;gt; (global)&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''float.h'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''limits.h'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''locale.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char *setlocale(int category, const char *locale)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct lconv *localeconv(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''math.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double exp(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double log(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double log10(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double pow(double x, double y)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sqrt(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double ceil(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double floor(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double fabs(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double ldexp(double x, int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double frexp(double x, int* exp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double modf(double x, double* ip)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double fmod(double x, double y)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sin(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double cos(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double tan(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double asin(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double acos(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atan(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atan2(double y, double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sinh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double cosh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double tanh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''setjmp.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int setjmp(jmp_buf env)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void longjmp(jmp_buf env, int val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''signal.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void (*signal(int sig, void (*handler)(int)))(int)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int raise(int sig)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdarg.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void va_start(va_list ap, lastarg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;type va_arg(va_list ap, type)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void va_end(va_list ap)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stddef.h'''&lt;br /&gt;
&lt;br /&gt;
|- colspan=2 &lt;br /&gt;
| TODO&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdio.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* fopen(const char* filename, const char* mode)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* freopen(const char* filename, const char* mode, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fflush(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fclose(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int remove(const char* filename)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int rename(const char* oldname, const char* newname)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* tmpfile()&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* tmpnam(char s[L_tmpnam])&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int setvbuf(FILE* stream, char* buf, int mode, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void setbuf(FILE* stream, char* buf)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fprintf(FILE* stream, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int printf(const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int sprintf(char* s, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int vfprintf(FILE* stream, const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int vprintf(const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int vsprintf(char* s, const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fscanf(FILE* stream, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int scanf(const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int sscanf(char* s, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fgetc(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* fgets(char* s, int n, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fputc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* fputs(const char* s, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int getc(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int getchar(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* gets(char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int putc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int putchar(int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int puts(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int ungetc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fseek(FILE* stream, long offset, int origin)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long ftell(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void rewind(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fgetpos(FILE* stream, fpos_t* ptr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fsetpos(FILE* stream, const fpos_t* ptr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void clearerr(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int feof(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int ferror(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void perror(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot; &lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Function/Macro/Variable&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdlib.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int abs(int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;long labs(long n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;long long llabs(long long n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;div_t div(int num, int denom)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;ldiv_t ldiv(long num, long denom)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atof(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int atoi(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long atol(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double strtod(const char* s, char** endp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long strtol(const char* s, char** endp, int base)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;unsigned long strtoul(const char* s, char** endp, int base)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* calloc(size_t nobj, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* malloc(size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* realloc(void* p, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void free(void* p)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void abort()&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void exit(int status)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int atexit(void (*fcm)(void))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int system(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* getenv(const char* name)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void* bsearch(const void* key, const void* base, size_t n,&amp;lt;br /&amp;gt;size_t size, int (*cmp)(const void* keyval, const void* datum))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void qsort(void* base, size_t n, size_t size, &amp;lt;br /&amp;gt;int (*cmp)(const void*, const void*))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int rand(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void srand(unsigned int seed)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''string.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strcpy(char* s, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strncpy(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strcat(char* s, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strncat(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int strcmp(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int strncmp(const char* cs, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int strcoll(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strchr(const char* cs, int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strrchr(const char* cs, int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strspn(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strcspn(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strpbrk(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strstr(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strlen(const char* cs)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strerror(int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strtok(char* s, const char* t)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strxfrm(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memcpy(void* s, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memmove(void* s, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int memcmp(const void* cs, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memchr(const void* cs, int c, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memset(void* s, int c, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''time.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;clock_t clock(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;time_t time(time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double difftime(time_t time2, time_t time1)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;time_t mktime(struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* asctime(const struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* ctime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct tm* gmtime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct tm* localtime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strftime(char* s, size_t smax, const char* fmt,&amp;lt;br /&amp;gt;const struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usage example ==&lt;br /&gt;
&lt;br /&gt;
Here's an example of a very simple payload (hello.c) and how to build it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;libpayload.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
    halt();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Building the payload:&lt;br /&gt;
&lt;br /&gt;
 lpgcc -o hello.elf hello.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Rating_System</id>
		<title>Rating System</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Rating_System"/>
				<updated>2008-08-20T16:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Criteria */ fix wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At the coreboot summit 2008 in Denver we talked about a rating system for supported boards. The idea is to make it clear which boards are most highly recommended because the vendors cooperate. Thus the 'Vendor Cooperation Score' rating system was born.&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
To get to such a rating for a particular board, we should establish a list of categories with an associated score.  Each fulfilled criteria should be easily verifiable as a yes or no answer.&lt;br /&gt;
There should be no subjective elements to the rating system &amp;amp;mdash; only measurable criteria should be used to avoid bias or favoritism.&lt;br /&gt;
&lt;br /&gt;
Adding up the scores for the major components on a board (CPU, chipsets, mainboard, others?) would give us a rating that results in a number of 'stars'.&lt;br /&gt;
&lt;br /&gt;
Some ideas for those categories:&lt;br /&gt;
&lt;br /&gt;
* Availability of documentation (nothing/NDA restricted == 0, NDA but free to publish code == 3, online with click through == 7, public URL == 10)&lt;br /&gt;
** There should be multiple categories of documentation (register set, BIOS programming guide, errata, schematics or pinouts (for motherboards))&lt;br /&gt;
* Vendor participation in the coreboot project&lt;br /&gt;
** How to quantify?&lt;br /&gt;
* Availability of example and support code&lt;br /&gt;
** ACPI tables&lt;br /&gt;
* &amp;quot;Hackability&amp;quot;&lt;br /&gt;
** LPC header, JTAG header, BIOS socket, etc.&lt;br /&gt;
** Should we dock a board because it requires soldering or a difficult process for flashing coreboot?&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
As we list boards, we should also make it clear if a board is actually available for purchase. A board might get a high rating, but be unavailable for purchase, in which case it should be carefully marked as such. Board availability will change over a board's lifespan.&lt;br /&gt;
&lt;br /&gt;
Should we provide a separate rating for coreboot support (i.e. the stuff above) and how good our code actually is?&lt;br /&gt;
&lt;br /&gt;
= Criteria =&lt;br /&gt;
&lt;br /&gt;
When all the criteria have been evaluated, each platform will end up with a total score.  To assign &amp;quot;hares&amp;quot; to the platform, we will divide the number of scored points by the number of maximum possible points and multiply that with the number of maximum hares (probably 5) and round down to the nearest half hare (bunny?).&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Use the following criteria to evaluate each set of documentation:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Documentation is freely available and redistributable.  It can be downloaded through a direct URL with no click-through pages.  &lt;br /&gt;
|-&lt;br /&gt;
|  7 || Documentation is freely available and redistributable.  It can be downloaded on the web after agreeing to a click-through license.&lt;br /&gt;
|-&lt;br /&gt;
|  3 || Documentation is restricted and only available under Non Disclosure Agreement, however the NDA allows source code written with the documentation to be freely available under the GPL (or another Free Software license).&lt;br /&gt;
|-&lt;br /&gt;
|  0 || Documentation is not available or the NDA does now allow release of code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
X86 based platforms can have up to 80 points for documentation.&lt;br /&gt;
&lt;br /&gt;
=== CPU ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following three sets of documentation (30 total points possible):&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (detailed information about programming registers and/or memory locations)&lt;br /&gt;
* BIOS programming guide&lt;br /&gt;
* Errata&lt;br /&gt;
&lt;br /&gt;
=== Southbridge (chipset) ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following three sets of documentation (30 total points possible):&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (detailed information about programming registers and/or memory locations)&lt;br /&gt;
* BIOS programming guide&lt;br /&gt;
* Errata&lt;br /&gt;
&lt;br /&gt;
=== Other chipsets (Super I/O, etc) ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following: (10 total points possible).   Add 10 points if not applicable to the platform.&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (detailed information about programming registers and/or memory locations)&lt;br /&gt;
&lt;br /&gt;
=== Mainboard ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following: (10 total points available)&lt;br /&gt;
&lt;br /&gt;
* Schematics / Pinout (Sufficient documentation to detail the platform specific GPIO &amp;amp; IRQ assignments)&lt;br /&gt;
&lt;br /&gt;
== Hackability ==&lt;br /&gt;
&lt;br /&gt;
Use the following criteria to evaluate the hackability of a board. Maximum possible score: 24.&lt;br /&gt;
&lt;br /&gt;
Rom chip:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Socketed rom chip.  &lt;br /&gt;
|-&lt;br /&gt;
|  1 || Soldered rom chip with space on the board for a secondary rom chip (pads unpopulated).&lt;br /&gt;
|-&lt;br /&gt;
|  0 || Soldered rom chip, no space for secondary rom chip.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
LPC header:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|  9 || LPC header, can be used to emulate rom chip.  &lt;br /&gt;
|-&lt;br /&gt;
|  0 || No LPC header.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
JTAG header:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|  5 || JTAG header.  &lt;br /&gt;
|-&lt;br /&gt;
|  0 || No JTAG header.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vendor participation ==&lt;br /&gt;
&lt;br /&gt;
Does the board vendor participate directly in the coreboot project? Maximum score: 10.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Vendor employs people who are active in the project and contribute code.  &lt;br /&gt;
|-&lt;br /&gt;
|  8 || Vendor has contributed the coreboot port and supports it by participating in the project and addressing any bugs.&lt;br /&gt;
|-&lt;br /&gt;
|  5 || Vendor has contributed the coreboot port but has disappeared from the project.&lt;br /&gt;
|-&lt;br /&gt;
|  0 || No direct vendor participation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example and support code ==&lt;br /&gt;
&lt;br /&gt;
Is example and support code readily available? Maximum possible score: 10.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Code is freely available under a free software license.  It can be downloaded through a direct URL with no click-through pages.  &lt;br /&gt;
|-&lt;br /&gt;
|  7 || Code is freely available under a free software license.  It can be downloaded on the web after agreeing to a click-through license.&lt;br /&gt;
|-&lt;br /&gt;
|  3 || Code is restricted and only available under Non Disclosure Agreement, however the NDA allows source code written using the sample code to be freely available under a free software license.&lt;br /&gt;
|-&lt;br /&gt;
|  0 || Code is not available or the NDA does now allow release of code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Adding it all up =&lt;br /&gt;
&lt;br /&gt;
The four categories above give us a scale with a maximum of 124 points. That means boards can get a score from zero to five 'hares':&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Score&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[Image:zero-hares.png]]&lt;br /&gt;
|-&lt;br /&gt;
| 1-24 || [[Image:one-hare.png]]&lt;br /&gt;
|-&lt;br /&gt;
| 25-49 || [[Image:two-hares.png]]&lt;br /&gt;
|-&lt;br /&gt;
| 50-74 || [[Image:three-hares.png]]&lt;br /&gt;
|-&lt;br /&gt;
| 75-99 || [[Image:four-hares.png]]&lt;br /&gt;
|-&lt;br /&gt;
| 100-124 || [[Image:five-hares.png]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Example Board =&lt;br /&gt;
&lt;br /&gt;
To demonstrate how this will work, we will apply the above criteria to the db800 platform from AMD, which is widely regarded as one of the better supported platforms in coreboot.&lt;br /&gt;
(Please fill in this section as new criteria are added).&lt;br /&gt;
&lt;br /&gt;
Total available points:  '''80'''&lt;br /&gt;
Total platform points:   '''52'''&lt;br /&gt;
Total &amp;quot;stars&amp;quot;:   '''3'''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Item&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Availability&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Points&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | '''CPU (Geode LX)'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Datasheet / register set'''&lt;br /&gt;
| Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33234F_LX_databook.pdf]&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | 10&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot;&lt;br /&gt;
| '''BIOS programming guide'''&lt;br /&gt;
| NDA allowing GPL'd code&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot; | 3&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Errata'''&lt;br /&gt;
| NDA allowing GPL'd code&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot; | 3&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | '''Chipset (CS5536)'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Datasheet / register set'''&lt;br /&gt;
| Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33238G_cs5536_db.pdf]&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | 10&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot;&lt;br /&gt;
| '''BIOS programming guide'''&lt;br /&gt;
| NDA allowing GPL'd code&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot; | 3&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Errata'''&lt;br /&gt;
| Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_gx/34472D_CS5536_B1_specupdate.pdf]&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | 10&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | '''Super I/O'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Datasheet / register set'''&lt;br /&gt;
| Freely available [http://www.itox.com/pages/support/wdt/W83627HF.pdf]&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | 10&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | '''Mainboard'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot;&lt;br /&gt;
| '''Schematics'''&lt;br /&gt;
| NDA allowing GPL'd code&lt;br /&gt;
| style=&amp;quot;background:yellow&amp;quot; | 3&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/ADLO</id>
		<title>ADLO</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/ADLO"/>
				<updated>2008-07-29T14:30:23Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Where is ADLO? */  Change url to the correct location&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is ADLO? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;ADLO is a Add-on layer that bonds to the coreboot project and it derives from the 16-bit PC-BIOS of the Bochs emulator project.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On Sun Nov 24th, 2002 at 22:30:42 UTC, Adam Sulmicki announced via [http://www.coreboot.org/pipermail/coreboot/2002-November/001191.html coreboot mailing list] that him and a group of collegues ([http://www.missl.cs.umd.edu/sebos_phase2.html SEBOS team]) were successful at creating ADLO. ADLO was accomplished by developing software that combined elements from two rather successful projects: &lt;br /&gt;
coreboot (back then: LinuxBIOS) and BOCHS - with some help of the Etherboot project. The use of coreboot and BOCHS Bios source had helped them to create a wrapper to successfully boot a (Windows 2000 OS, OpenBSD, and Linux via GRUB or LILO as bootloaders) without a legacy, proprietary 16 bit BIOS. &lt;br /&gt;
&lt;br /&gt;
With contribution from a grant from DARPA under the CHATS program, &amp;lt;b&amp;gt;Adam Sulmicki&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Adam Agnew&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;William Arbaugh&amp;lt;/b&amp;gt; had created a new way to succesfully boot multiple OS's without the need of proprietary software such as any BIOS from the market leaders AMI or Award.&lt;br /&gt;
&lt;br /&gt;
The wrapper was originally written by [http://www.eax.com/ Adam Sulmicki.] and the [http://www.missl.cs.umd.edu/sebos_phase2.html SEBOS team].&lt;br /&gt;
&lt;br /&gt;
Since Bochs BIOS provides many of the legacy BIOS services required by some x86 OS's it allows you to boot OS's that depend on those services.&lt;br /&gt;
&lt;br /&gt;
The original release Supported OS's were:&lt;br /&gt;
&lt;br /&gt;
1.Windows 2000 OS&lt;br /&gt;
&lt;br /&gt;
2.OpenBSD &lt;br /&gt;
&lt;br /&gt;
3.Linux via GRUB or LILO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At the time of ADLO launch the group was still working on supporting FreeBSD and Windows XP, they had also expected to improving ATA support will permit Win98 and WinXP to boot successfully with ADLO, also adding PIRQ support wich would permit FreeBSD to boot with ADLO.&lt;br /&gt;
&lt;br /&gt;
Before the team made the ADLO source code public it was called the SEBOS project.&lt;br /&gt;
The motherboard used for testing was a &amp;lt;b&amp;gt;Matsonic 7308e&amp;lt;/B&amp;gt; motherboard, and the support for ADLO on other motherboards was limited to that of the coreboot project at the time of release (Nov 2002). &lt;br /&gt;
&lt;br /&gt;
The SEBOS team had also created it's adaptations to add security and encryption to an OS bootloader that has been  missing in a 16-bit proprietary PC-BIOS for decades. ADLO is a simple wrapper that binds to the Bochs BIOS which allows coreboot to make use of the BIOS interrupt services. ADLO can be found in the coreboot-v2/util/ADLO directory in the coreboot subversion. Instructions for using ADLO can be found in the README contained within the source files.&lt;br /&gt;
&lt;br /&gt;
Find out more at the team's website at : &lt;br /&gt;
&lt;br /&gt;
http://www.missl.cs.umd.edu/sebos.html&lt;br /&gt;
http://www.missl.cs.umd.edu/sebos_phase2.html&lt;br /&gt;
&lt;br /&gt;
== What is the current status and builds and contributions? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;At the moment we are working with the original developer of ADLO to see if we can update the Wrapper and make future builds that can boot operating systems that require further 16-bit BIOS information and services like Windows XP and Windows Vista that are currently not supported with ADLO.&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not much has change from the original release of ADLO and we need a change badly. Keep in mind that the original release was back in Nov 2002.&lt;br /&gt;
&lt;br /&gt;
WE ALSO NEED PEOPLE LIKE YOU WHO ARE INTERESTED IN CONTRIBUTING IN THE PROJECT.&lt;br /&gt;
&lt;br /&gt;
If you can contribute, in any way to the ADLO project Please let US know. Contact bootblock at techgx.net with ideas, troubleshooting, or things that you know has worked for you.&lt;br /&gt;
experiments with coreboot and ADLO and other motherboards&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What bios services does ADLO provide and when would I need them ? ==&lt;br /&gt;
&lt;br /&gt;
The full gory details for XP are at:&lt;br /&gt;
&lt;br /&gt;
 http://www.missl.cs.umd.edu/winint/index2.html&lt;br /&gt;
&lt;br /&gt;
The full gory details for W2K are at:&lt;br /&gt;
&lt;br /&gt;
 http://www.missl.cs.umd.edu/winint/index1.html&lt;br /&gt;
&lt;br /&gt;
Microsoft also published an article about their use of BIOS here:&lt;br /&gt;
&lt;br /&gt;
 http://www.microsoft.com/whdc/archive/Lf.mspx&lt;br /&gt;
&lt;br /&gt;
== What bootloaders work with ADLO? ==&lt;br /&gt;
&lt;br /&gt;
Currently known to work are:&lt;br /&gt;
* LILO&lt;br /&gt;
* GRUB&lt;br /&gt;
* NTLDR (Windows 2000)&lt;br /&gt;
&lt;br /&gt;
There is no technical reason why it couldn't work with *BSD, (Free)Dos,&lt;br /&gt;
and other versions of Windows after some tweaking.&lt;br /&gt;
&lt;br /&gt;
We need Beta testers to start testing &lt;br /&gt;
* freeldr (React OS)&lt;br /&gt;
* NTLDR (Windows XP)&lt;br /&gt;
* NTLDR (Windows XP embedded)&lt;br /&gt;
* NTLDR (Windows 2003)&lt;br /&gt;
* and Vista via EFI or Boot Manager BCD&lt;br /&gt;
&lt;br /&gt;
== Where is ADLO? == &lt;br /&gt;
&lt;br /&gt;
ADLO is part of the coreboot v2 repository under [http://coreboot.org/viewvc/trunk/coreboot-v2/util/ADLO/ coreboot-v2/util/ADLO]. &lt;br /&gt;
&lt;br /&gt;
An older version was already part of coreboot v1 and is available at the [http://www.coreboot.org/viewcvs/trunk/LinuxBIOSv1/util/ADLO/ coreboot-v1/util/ADLO] directory.&lt;br /&gt;
&lt;br /&gt;
== How do I get coreboot to boot ADLO? ==&lt;br /&gt;
&lt;br /&gt;
ADLO compiles as an ELF image so you have to set up coreboot to elf boot just as if you were using any other ELF payload. In the [http://www.coreboot.org/viewcvs/trunk/LinuxBIOSv2/util/ADLO/ ADLO directory] are some READMEs.  Make sure you have read them.&lt;br /&gt;
&lt;br /&gt;
Compiling ADLO is quite simple.  Mostly you just type ''make''  You will need the 16-bit assembler as86 installed to build the Bochs BIOS.  You will also need a copy of your video BIOS if you want VGA to work.  Again see the README.&lt;br /&gt;
&lt;br /&gt;
=== BIOS shadowing ===&lt;br /&gt;
&lt;br /&gt;
Out-of-the box ADLO probally won't boot unless you are using the exact mainboard that the ADLO project uses which is the &amp;lt;b&amp;gt;Matsonic 7308e&amp;lt;/b&amp;gt;. The reason is that various areas of shadowing must be enabled for ADLO to boot. (FIXME: please explain)&lt;br /&gt;
&lt;br /&gt;
If you see '''elfboot''' indicate that it is 'Jumping to boot code at 0x7c00' and then the board resets or hangs then its very likely that your shadow settings are incorrect. Applying the serial debug patch to ADLO can help you further investigate this.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:0.5em; padding:0.5em 0.5em 0.5em 0.5em; background-color:#ffdfdf; align:right; border:1px solid #aabbcc;&amp;quot;&amp;gt;&lt;br /&gt;
FixMe Where is the ''de facto'' location for the serial patch?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The shadow settings are set in '''loader.s''' in the freebios/util/ADLO.  Find section B.  These are writes to PCI space that enable various areas of shadowing.&lt;br /&gt;
	&lt;br /&gt;
Technically, all you need is only 64kb at 0xF0000 and 64kb at 0xC0000. Your mileage may vary.  Start by enabling Read/Write for all shadow ranges supported by your chipset and then back off to 0xF0000 and 0xC0000 after you get it working.&lt;br /&gt;
&lt;br /&gt;
=== Video BIOS ===&lt;br /&gt;
&lt;br /&gt;
The ADLO Makefile will copy your video bios from an existing setup.  See the '''README''' and '''Makefile''' for details.&lt;br /&gt;
&lt;br /&gt;
ADLO expects the video bios to be 64k in size whereas a lot of video BIOS images are only 32k.  You can solve this by just duplicating in the same file and then letting ADLO use that.  Some creative work with 'dd' and padding would achieve the same result.&lt;br /&gt;
&lt;br /&gt;
=== Serial Output ===&lt;br /&gt;
&lt;br /&gt;
Lastly if you have applied the serial debug patch to BOCHS then '''all''' the output is routed out to the serial port so your video screen will be blank. &lt;br /&gt;
However VSYNC will still be generated if the video chip is initialized properly.  You can watch for VSYNC with a Oscope or plug a newer type monitor up to the video output.  Most modern monitors will tell you when they can/can't find the VSYNC signal.  Note you may have to power cycle the monitor between attempts as sometimes they can get very confused.&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-06-20T22:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Add screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Screenshots ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Bayou-screenshot-menu.jpg|400px|The chooser menu with two options]]&lt;br /&gt;
[[Image:Bayou-screenshot-info.jpg|400px|The same chooser menu showing the PAYLOAD_PARAM data passed by coreinfo]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Image:Bayou-screenshot-serial.jpg|400px|The same chooser menu over serial]]&lt;br /&gt;
[[Image:Bayou-screenshot-timeout.jpg|400px|The timeout message.  If the key isn't pressed, then the menu is displayed]]&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).&lt;br /&gt;
&lt;br /&gt;
== Behavior ==&lt;br /&gt;
&lt;br /&gt;
When Bayou starts, it will find and read the Bayou Payload Table (see below).  There are three different paths that can be followed, depending on the value of the 'timeout' field:&lt;br /&gt;
&lt;br /&gt;
* If the timeout field is greater then 0 but not 0xFF, then Bayou will display a countdown message on the screen. If the user presses F1, then the chooser menu will be displayed.  If the user does not press a key in the alloted time then bayou will automatically start the item in the payload table that is marked as 'default'.&lt;br /&gt;
 Please press F1 for the menu.  Timeout in (3) seconds...&lt;br /&gt;
* If the timeout field is zero, then the default item will be chosen immediately without a timeout.&lt;br /&gt;
* If the timeout field is 0xFF. then the chooser menu will be shown immediately without a timeout.&lt;br /&gt;
&lt;br /&gt;
When the menu is displayed, it will list all top level items in the BPT, both chooser and chain items. When a chain item is selected from the menu (or as the 'default' item), then each&lt;br /&gt;
of the sub-items listed in the payload table will be executed in order.  Each sub-payload item is expected to return control to bayou, except the last one.  If a payload fails to return&lt;br /&gt;
control, then the rest of the chain will not be executed.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The ROM image with LAR + coreboot-v3 is very dynamic in nature.  New blobs of data can be added at any time during the build process or during runtime.  This means that the Bayou configuration&lt;br /&gt;
cannot be static - it must be able to grow and change with the LAR.&lt;br /&gt;
&lt;br /&gt;
=== Bayou Payload Table ===&lt;br /&gt;
&lt;br /&gt;
The payload table describes which payloads to manage, both in chooser and in chained mode.  The table is stored as a LAR file with the name ''bayou_payload_table''.  The table is organized like&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Global configuration&lt;br /&gt;
|-&lt;br /&gt;
| Payload tables&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
The global configuration header controls general Bayou behavior:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4 bytes || An identifier that indicates the file is a Bayou Payload Table. the value will be 'BPT0' or in hex: 0x305405042 (in little endian)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 1 bytes || if the value of this field is 0, then the default item in the payload list will be executed immediately.  If this value is 254 (0xFF), then the chooser menu will be displayed immediately.  Any value between 1 and 254 indicates the amount of time (in seconds) that the system should wait.  &lt;br /&gt;
|-&lt;br /&gt;
| Padding || 11 bytes || Unused space padding out to 16 byte alignment.  This may be used in the future &lt;br /&gt;
|} &lt;br /&gt;
 &lt;br /&gt;
Following the configuration header is the list of payloads.  There are three types of possible items in the list: &lt;br /&gt;
* A chooser item is displayed in a list of other items on a menu.  Each chooser item is associated with a single payload.&lt;br /&gt;
* A master chain item describes a chain of items that are to be executed one after another.  Master chain items specify a title and may be displayed on the chooser menu&lt;br /&gt;
* A number of sub chain items are tied to a master chain item and point to the specific payloads to be executed in the chain&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| index || 1 byte || An index number for the entry - sub items will use this as the value of its 'parent' field&lt;br /&gt;
|-&lt;br /&gt;
| parent || 1 byte || For sub chain items this lists the index of the master chain item that the payload is attached to.  Chooser and master chain items are always at the toplevel and should have a parent of '0'&lt;br /&gt;
|-&lt;br /&gt;
| type || 1 byte || Specifies the type of the entry.  Possible values are 0x01 - chooser item, 0x02 - master chain item, 0x03 sub-chain item&lt;br /&gt;
|-&lt;br /&gt;
| flags || 1 byte || This bit field describes various flags that modify the item.  Possible values are  bit 0 - default item (executed after timeout), bit 1 - do not show in chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| title || 64 bytes || This is a name displayed by the chooser for the item. It is required for master chain items, but not for chooser items.  If not NULL, this will replace any names specified by the payload.  This should be null for sub chain items&lt;br /&gt;
|-&lt;br /&gt;
| nlen  || 4 bytes || Length of the payload name, in bytes.  This should be 0 for master chain items.&lt;br /&gt;
|- &lt;br /&gt;
| name  || 'nlen' bytes || Specifies the name of the LAR file for the payload associated with this entry.  Only valid for sub-chain items and chooser items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/File:Bayou-screenshot-timeout.jpg</id>
		<title>File:Bayou-screenshot-timeout.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/File:Bayou-screenshot-timeout.jpg"/>
				<updated>2008-06-20T22:46:22Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: The timeout message in Bayou.  If the key is not pressed, then, the chooser menu would appear

Author: Jordan Crouse

{{PD-self}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The timeout message in [[Bayou]].  If the key is not pressed, then, the chooser menu would appear&lt;br /&gt;
&lt;br /&gt;
Author: Jordan Crouse&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/File:Bayou-screenshot-serial.jpg</id>
		<title>File:Bayou-screenshot-serial.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/File:Bayou-screenshot-serial.jpg"/>
				<updated>2008-06-20T22:45:36Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Screen shot of Bayou in serial mode

Author: Jordan Crouse

{{PD-self}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screen shot of Bayou in serial mode&lt;br /&gt;
&lt;br /&gt;
Author: Jordan Crouse&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/File:Bayou-screenshot-info.jpg</id>
		<title>File:Bayou-screenshot-info.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/File:Bayou-screenshot-info.jpg"/>
				<updated>2008-06-20T22:45:12Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Bayou screenshot showing the &amp;quot;description&amp;quot; of the payload

Author: Jordan Crouse

{{PD-self}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bayou screenshot showing the &amp;quot;description&amp;quot; of the payload&lt;br /&gt;
&lt;br /&gt;
Author: Jordan Crouse&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/File:Bayou-screenshot-menu.jpg</id>
		<title>File:Bayou-screenshot-menu.jpg</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/File:Bayou-screenshot-menu.jpg"/>
				<updated>2008-06-20T22:44:09Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Bayou screenshot showing the chooser menu with two options

Author: Jordan Crouse

{{PD-self}}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Bayou]] screenshot showing the chooser menu with two options&lt;br /&gt;
&lt;br /&gt;
Author: Jordan Crouse&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-06-19T16:14:31Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Change the size of the timeout to 1 byte - 254 seconds is a long time to wait&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).&lt;br /&gt;
&lt;br /&gt;
== Behavior ==&lt;br /&gt;
&lt;br /&gt;
When Bayou starts, it will find and read the Bayou Payload Table (see below).  There are three different paths that can be followed, depending on the value of the 'timeout' field:&lt;br /&gt;
&lt;br /&gt;
* If the timeout field is greater then 0 but not 0xFF, then Bayou will display a countdown message on the screen. If the user presses F1, then the chooser menu will be displayed.  If the user does not press a key in the alloted time then bayou will automatically start the item in the payload table that is marked as 'default'.&lt;br /&gt;
 Please press F1 for the menu.  Timeout in (3) seconds...&lt;br /&gt;
* If the timeout field is zero, then the default item will be chosen immediately without a timeout.&lt;br /&gt;
* If the timeout field is 0xFF. then the chooser menu will be shown immediately without a timeout.&lt;br /&gt;
&lt;br /&gt;
When the menu is displayed, it will list all top level items in the BPT, both chooser and chain items. When a chain item is selected from the menu (or as the 'default' item), then each&lt;br /&gt;
of the sub-items listed in the payload table will be executed in order.  Each sub-payload item is expected to return control to bayou, except the last one.  If a payload fails to return&lt;br /&gt;
control, then the rest of the chain will not be executed.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The ROM image with LAR + coreboot-v3 is very dynamic in nature.  New blobs of data can be added at any time during the build process or during runtime.  This means that the Bayou configuration&lt;br /&gt;
cannot be static - it must be able to grow and change with the LAR.&lt;br /&gt;
&lt;br /&gt;
=== Bayou Payload Table ===&lt;br /&gt;
&lt;br /&gt;
The payload table describes which payloads to manage, both in chooser and in chained mode.  The table is stored as a LAR file with the name ''bayou_payload_table''.  The table is organized like&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Global configuration&lt;br /&gt;
|-&lt;br /&gt;
| Payload tables&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
The global configuration header controls general Bayou behavior:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4 bytes || An identifier that indicates the file is a Bayou Payload Table. the value will be 'BPT0' or in hex: 0x305405042 (in little endian)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 1 bytes || if the value of this field is 0, then the default item in the payload list will be executed immediately.  If this value is 254 (0xFF), then the chooser menu will be displayed immediately.  Any value between 1 and 254 indicates the amount of time (in seconds) that the system should wait.  &lt;br /&gt;
|-&lt;br /&gt;
| Padding || 11 bytes || Unused space padding out to 16 byte alignment.  This may be used in the future &lt;br /&gt;
|} &lt;br /&gt;
 &lt;br /&gt;
Following the configuration header is the list of payloads.  There are three types of possible items in the list: &lt;br /&gt;
* A chooser item is displayed in a list of other items on a menu.  Each chooser item is associated with a single payload.&lt;br /&gt;
* A master chain item describes a chain of items that are to be executed one after another.  Master chain items specify a title and may be displayed on the chooser menu&lt;br /&gt;
* A number of sub chain items are tied to a master chain item and point to the specific payloads to be executed in the chain&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| index || 1 byte || An index number for the entry - sub items will use this as the value of its 'parent' field&lt;br /&gt;
|-&lt;br /&gt;
| parent || 1 byte || For sub chain items this lists the index of the master chain item that the payload is attached to.  Chooser and master chain items are always at the toplevel and should have a parent of '0'&lt;br /&gt;
|-&lt;br /&gt;
| type || 1 byte || Specifies the type of the entry.  Possible values are 0x01 - chooser item, 0x02 - master chain item, 0x03 sub-chain item&lt;br /&gt;
|-&lt;br /&gt;
| flags || 1 byte || This bit field describes various flags that modify the item.  Possible values are  bit 0 - default item (executed after timeout), bit 1 - do not show in chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| title || 64 bytes || This is a name displayed by the chooser for the item. It is required for master chain items, but not for chooser items.  If not NULL, this will replace any names specified by the payload.  This should be null for sub chain items&lt;br /&gt;
|-&lt;br /&gt;
| nlen  || 4 bytes || Length of the payload name, in bytes.  This should be 0 for master chain items.&lt;br /&gt;
|- &lt;br /&gt;
| name  || 'nlen' bytes || Specifies the name of the LAR file for the payload associated with this entry.  Only valid for sub-chain items and chooser items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-06-19T16:04:15Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Bayou Payload Table */  Millisecond granularity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).&lt;br /&gt;
&lt;br /&gt;
== Behavior ==&lt;br /&gt;
&lt;br /&gt;
When Bayou starts, it will find and read the Bayou Payload Table (see below).  There are three different paths that can be followed, depending on the value of the 'timeout' field:&lt;br /&gt;
&lt;br /&gt;
* If the timeout field is greater then 0 but not 0xFFFF, then Bayou will display a countdown message on the screen. If the user presses F1, then the chooser menu will be displayed.  If the user does not press a key in the alloted time then bayou will automatically start the item in the payload table that is marked as 'default'.&lt;br /&gt;
 Please press F1 for the menu.  Timeout in (3) seconds...&lt;br /&gt;
* If the timeout field is zero, then the default item will be chosen immediately without a timeout.&lt;br /&gt;
* If the timeout field is 0xFFFF. then the chooser menu will be shown immediately without a timeout.&lt;br /&gt;
&lt;br /&gt;
When the menu is displayed, it will list all top level items in the BPT, both chooser and chain items. When a chain item is selected from the menu (or as the 'default' item), then each&lt;br /&gt;
of the sub-items listed in the payload table will be executed in order.  Each sub-payload item is expected to return control to bayou, except the last one.  If a payload fails to return&lt;br /&gt;
control, then the rest of the chain will not be executed.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The ROM image with LAR + coreboot-v3 is very dynamic in nature.  New blobs of data can be added at any time during the build process or during runtime.  This means that the Bayou configuration&lt;br /&gt;
cannot be static - it must be able to grow and change with the LAR.&lt;br /&gt;
&lt;br /&gt;
=== Bayou Payload Table ===&lt;br /&gt;
&lt;br /&gt;
The payload table describes which payloads to manage, both in chooser and in chained mode.  The table is stored as a LAR file with the name ''bayou_payload_table''.  The table is organized like&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Global configuration&lt;br /&gt;
|-&lt;br /&gt;
| Payload tables&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
The global configuration header controls general Bayou behavior:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4 bytes || An identifier that indicates the file is a Bayou Payload Table. the value will be 'BPT0' or in hex: 0x305405042 (in little endian)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 2 bytes || if the value of this field is 0, then the default item in the payload list will be executed immediately.  If this value is 65535 (0xFFFF), then the chooser menu will be displayed immediately.  Any value between 1 and 65534 indicates the amount of time (in seconds) that the system should wait.  &lt;br /&gt;
|-&lt;br /&gt;
| Padding || 10 bytes || Unused space padding out to 16 byte alignment.  This may be used in the future &lt;br /&gt;
|} &lt;br /&gt;
 &lt;br /&gt;
Following the configuration header is the list of payloads.  There are three types of possible items in the list: &lt;br /&gt;
* A chooser item is displayed in a list of other items on a menu.  Each chooser item is associated with a single payload.&lt;br /&gt;
* A master chain item describes a chain of items that are to be executed one after another.  Master chain items specify a title and may be displayed on the chooser menu&lt;br /&gt;
* A number of sub chain items are tied to a master chain item and point to the specific payloads to be executed in the chain&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| index || 1 byte || An index number for the entry - sub items will use this as the value of its 'parent' field&lt;br /&gt;
|-&lt;br /&gt;
| parent || 1 byte || For sub chain items this lists the index of the master chain item that the payload is attached to.  Chooser and master chain items are always at the toplevel and should have a parent of '0'&lt;br /&gt;
|-&lt;br /&gt;
| type || 1 byte || Specifies the type of the entry.  Possible values are 0x01 - chooser item, 0x02 - master chain item, 0x03 sub-chain item&lt;br /&gt;
|-&lt;br /&gt;
| flags || 1 byte || This bit field describes various flags that modify the item.  Possible values are  bit 0 - default item (executed after timeout), bit 1 - do not show in chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| title || 64 bytes || This is a name displayed by the chooser for the item. It is required for master chain items, but not for chooser items.  If not NULL, this will replace any names specified by the payload.  This should be null for sub chain items&lt;br /&gt;
|-&lt;br /&gt;
| nlen  || 4 bytes || Length of the payload name, in bytes.  This should be 0 for master chain items.&lt;br /&gt;
|- &lt;br /&gt;
| name  || 'nlen' bytes || Specifies the name of the LAR file for the payload associated with this entry.  Only valid for sub-chain items and chooser items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-06-16T17:34:21Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Add behavior and cleanups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).&lt;br /&gt;
&lt;br /&gt;
== Behavior ==&lt;br /&gt;
&lt;br /&gt;
When Bayou starts, it will find and read the Bayou Payload Table (see below).  There are three different paths that can be followed, depending on the value of the 'timeout' field:&lt;br /&gt;
&lt;br /&gt;
* If the timeout field is greater then 0 but not 0xFFFF, then Bayou will display a countdown message on the screen. If the user presses F1, then the chooser menu will be displayed.  If the user does not press a key in the alloted time then bayou will automatically start the item in the payload table that is marked as 'default'.&lt;br /&gt;
 Please press F1 for the menu.  Timeout in (3) seconds...&lt;br /&gt;
* If the timeout field is zero, then the default item will be chosen immediately without a timeout.&lt;br /&gt;
* If the timeout field is 0xFFFF. then the chooser menu will be shown immediately without a timeout.&lt;br /&gt;
&lt;br /&gt;
When the menu is displayed, it will list all top level items in the BPT, both chooser and chain items. When a chain item is selected from the menu (or as the 'default' item), then each&lt;br /&gt;
of the sub-items listed in the payload table will be executed in order.  Each sub-payload item is expected to return control to bayou, except the last one.  If a payload fails to return&lt;br /&gt;
control, then the rest of the chain will not be executed.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The ROM image with LAR + coreboot-v3 is very dynamic in nature.  New blobs of data can be added at any time during the build process or during runtime.  This means that the Bayou configuration&lt;br /&gt;
cannot be static - it must be able to grow and change with the LAR.&lt;br /&gt;
&lt;br /&gt;
=== Bayou Payload Table ===&lt;br /&gt;
&lt;br /&gt;
The payload table describes which payloads to manage, both in chooser and in chained mode.  The table is stored as a LAR file with the name ''bayou_payload_table''.  The table is organized like&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Global configuration&lt;br /&gt;
|-&lt;br /&gt;
| Payload tables&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
The global configuration header controls general Bayou behavior:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4 bytes || An identifier that indicates the file is a Bayou Payload Table. the value will be 'BPT0' or in hex: 0x305405042 (in little endian)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 2 bytes || if the value of this field is 0, then the default item in the payload list will be executed immediately.  If this value is 65535 (0xFFFF), then the chooser menu will be displayed immediately.  Any value between 1 and 65534 indicates the amount of time (in milliseconds) that the system should wait.  &lt;br /&gt;
|-&lt;br /&gt;
| Padding || 10 bytes || Unused space padding out to 16 byte alignment.  This may be used in the future &lt;br /&gt;
|} &lt;br /&gt;
 &lt;br /&gt;
Following the configuration header is the list of payloads.  There are three types of possible items in the list: &lt;br /&gt;
* A chooser item is displayed in a list of other items on a menu.  Each chooser item is associated with a single payload.&lt;br /&gt;
* A master chain item describes a chain of items that are to be executed one after another.  Master chain items specify a title and may be displayed on the chooser menu&lt;br /&gt;
* A number of sub chain items are tied to a master chain item and point to the specific payloads to be executed in the chain&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| index || 1 byte || An index number for the entry - sub items will use this as the value of its 'parent' field&lt;br /&gt;
|-&lt;br /&gt;
| parent || 1 byte || For sub chain items this lists the index of the master chain item that the payload is attached to.  Chooser and master chain items are always at the toplevel and should have a parent of '0'&lt;br /&gt;
|-&lt;br /&gt;
| type || 1 byte || Specifies the type of the entry.  Possible values are 0x01 - chooser item, 0x02 - master chain item, 0x03 sub-chain item&lt;br /&gt;
|-&lt;br /&gt;
| flags || 1 byte || This bit field describes various flags that modify the item.  Possible values are  bit 0 - default item (executed after timeout), bit 1 - do not show in chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| title || 64 bytes || This is a name displayed by the chooser for the item. It is required for master chain items, but not for chooser items.  If not NULL, this will replace any names specified by the payload.  This should be null for sub chain items&lt;br /&gt;
|-&lt;br /&gt;
| nlen  || 4 bytes || Length of the payload name, in bytes.  This should be 0 for master chain items.&lt;br /&gt;
|- &lt;br /&gt;
| name  || 'nlen' bytes || Specifies the name of the LAR file for the payload associated with this entry.  Only valid for sub-chain items and chooser items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-06-16T17:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Architecture */  Add BPT description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The ROM image with LAR + coreboot-v3 is very dynamic in nature.  New blobs of data can be added at any time during the build process or during runtime.  This means that the Bayou configuration&lt;br /&gt;
cannot be static - it must be able to grow and change with the LAR.&lt;br /&gt;
&lt;br /&gt;
=== Bayou Payload Table ===&lt;br /&gt;
&lt;br /&gt;
The payload table describes which payloads to manage, both in chooser and in chained mode.  The table is stored as a LAR file with the name ''bayou_payload_table''.  The table is organized like&lt;br /&gt;
follows:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Global configuration&lt;br /&gt;
|-&lt;br /&gt;
| Payload tables&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
The global configuration header controls general Bayou behavior:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4 bytes || An identifier that indicates the file is a Bayou Payload Table. the value will be 'BPT0' or in hex: 0x305405042 (in little endian)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 2 bytes || Indicates how long bayou should wait (in milliseconds) before starting the default chain or menu item.  Pressing a hot key during this time will start the chooser by default.&lt;br /&gt;
|-&lt;br /&gt;
| Padding || 10 bytes || Unused space padding out to 16 byte alignment.  This may be used in the future &lt;br /&gt;
|} &lt;br /&gt;
 &lt;br /&gt;
Following the configuration header is the list of payloads.  There are three types of possible items in the list: &lt;br /&gt;
* A chooser item is displayed in a list of other items on a menu.  Each chooser item is associated with a single payload.&lt;br /&gt;
* A master chain item describes a chain of items that are to be executed one after another.  Master chain items specify a title and may be displayed on the chooser menu&lt;br /&gt;
* A number of sub chain items are tied to a master chain item and point to the specific payloads to be executed in the chain&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Field&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|- index || 1 byte || An index number for the entry - sub items will use this as the value of its 'parent' field&lt;br /&gt;
|-&lt;br /&gt;
| parent || 1 byte || For sub chain items this lists the index of the master chain item that the payload is attached to.  Chooser and master chain items are always at the toplevel and should have a parent of '0'&lt;br /&gt;
|-&lt;br /&gt;
| type || 1 byte || Specifies the type of the entry.  Possible values are 0x01 - chooser item, 0x02 - master chain item, 0x03 sub-chain item&lt;br /&gt;
|-&lt;br /&gt;
| flags || 1 byte || This bit field describes various flags that modify the item.  Possible values are  bit 0 - default item (executed after timeout), bit 1 - do not show in chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| title || 64 bytes || This is a name displayed by the chooser for the item. It is required for master chain items, but not for chooser items.  If not NULL, this will replace any names specified by the payload.  This should be null for sub chain items&lt;br /&gt;
|-&lt;br /&gt;
| nlen  || 4 bytes || Length of the payload name, in bytes.  This should be 0 for master chain items.&lt;br /&gt;
|- &lt;br /&gt;
| name  || 'nlen' bytes || Specifies the name of the LAR file for the payload associated with this entry.  Only valid for sub-chain items and chooser items.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Payload_API</id>
		<title>Payload API</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Payload_API"/>
				<updated>2008-05-20T15:59:39Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Initial revision&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Payload API ==&lt;br /&gt;
&lt;br /&gt;
This page discusses the API for passing parameters to new payloads and getting a return value back.  In the description below, the term ''parent'' refers to the entity that is&lt;br /&gt;
starting the payload; nominally coreboot or a chooser payload.  The term ''child'' or ''payload'' refers to the payload code that is being executed. &lt;br /&gt;
&lt;br /&gt;
This API is implemented by [[libpayload]].&lt;br /&gt;
&lt;br /&gt;
=== Passing Parameters ===&lt;br /&gt;
&lt;br /&gt;
Parameters are passed from the parent to the child in the form of an array of zero terminated strings, similar to a standard C application.&lt;br /&gt;
The calling application pushes on the stack (in order): the the number of elements in the array (argc), a pointer to the array (argv and a magic number&lt;br /&gt;
(0x12345678).&lt;br /&gt;
&lt;br /&gt;
After control has been passed to the payload, the stack will look like this:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
! Offset (from %esp)&lt;br /&gt;
! Size &lt;br /&gt;
! Parameter&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 4 || return address&lt;br /&gt;
|- &lt;br /&gt;
| 0x04 || 4 || Magic number || 0x12345678&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || 4 || Pointer to the array (argv)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || number of elements in the array (argc) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The payload should first check offset 0x04 for the magic number.  If it is not present, then the payload should assume that the parent did not pass any parameters (probably because it was a legacy application).  Failure to check for the magic number could result in mistaken values for argc and argv which could cause program failure.&lt;br /&gt;
After verifying the magic number, the payload can collect the other two elements and process them accordingly.&lt;br /&gt;
&lt;br /&gt;
== Return Value ==&lt;br /&gt;
&lt;br /&gt;
After the payload has completed execution, i can return an integer exit code to the parent.  The exit code will be passed in the %eax register.  After&lt;br /&gt;
regaining control, the parent should take care to save off the value of %eax before using the register for other purposes.&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Libpayload</id>
		<title>Libpayload</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Libpayload"/>
				<updated>2008-05-20T15:24:53Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Add link to the payload API page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''libpayload''' is a small BSD-licensed static library (a lightweight implementation of common and useful functions) intended to be used as a basis for coreboot payloads.&lt;br /&gt;
&lt;br /&gt;
The benefits of linking a coreboot payload against libpayload are:&lt;br /&gt;
&lt;br /&gt;
* Payloads do not have to implement and maintain low-level code for I/O, common functions, etc.&lt;br /&gt;
* Payloads can be recompiled and deployed for CPU architectures supported by coreboot in the future.&lt;br /&gt;
* The libpayload functions can be tested and scrutinized outside payload development.&lt;br /&gt;
* Payloads themselves may be partly host-tested, e.g. against an emulation libpayload.&lt;br /&gt;
&lt;br /&gt;
''Just give us a main() and a pocket full of dreams and we'll do the rest.''&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* Provides a [[Libpayload#Libc_Coverage|subset of libc functions]] (e.g. malloc, printf, strcmp, etc).&lt;br /&gt;
* Provides an optional tiny (n)curses implementation.&lt;br /&gt;
* Provides various small drivers for&lt;br /&gt;
** keyboard&lt;br /&gt;
** PC speaker&lt;br /&gt;
** NVRAM/CMOS access&lt;br /&gt;
** serial console&lt;br /&gt;
** VGA&lt;br /&gt;
** Geode framebuffer&lt;br /&gt;
* Reads and parses the coreboot table.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
* [[Payload API|Discussion of the API for passing parameters to the payload]]&lt;br /&gt;
&lt;br /&gt;
== Payloads using libpayload ==&lt;br /&gt;
&lt;br /&gt;
* [[coreinfo]] is a small payload which can display system information such as PCI info, an NVRAM dump, or the coreboot v3 printk buffer.&lt;br /&gt;
* [[GRUB invaders]] has been ported successfully to libpayload (patch pending).&lt;br /&gt;
* [[tint]] (a console tetris clone) has been successfully ported to libpayload.&lt;br /&gt;
* [http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=tree;f=scripts/kconfig/lxdialog;hb=HEAD lxdialog] from the Linux '''kconfig''' utility has been ported to be usable when linked with libpayload (patch pending).&lt;br /&gt;
&lt;br /&gt;
== Downloading and building libpayload ==&lt;br /&gt;
&lt;br /&gt;
 $ svn co svn://coreboot.org/repos/trunk/payloads/libpayload&lt;br /&gt;
 $ cd libpayload&lt;br /&gt;
 $ make menuconfig&lt;br /&gt;
 $ make&lt;br /&gt;
&lt;br /&gt;
== Libc coverage ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot; &lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Function/Macro/Variable&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''assert.h'''&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| assert()&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''ctype.h'''&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isalnum(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isalpha(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int iscntrl(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isdigit(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isgraph(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int islower(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isprint(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int ispunct(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isspace(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isupper(int character)&lt;br /&gt;
|- &lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| int isxdigit(int character)&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''errno.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;errno&amp;lt;/code&amp;gt; (global)&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''float.h'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''limits.h'''&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''locale.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char *setlocale(int category, const char *locale)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct lconv *localeconv(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''math.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double exp(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double log(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double log10(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double pow(double x, double y)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sqrt(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double ceil(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double floor(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double fabs(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double ldexp(double x, int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double frexp(double x, int* exp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double modf(double x, double* ip)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double fmod(double x, double y)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sin(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double cos(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double tan(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double asin(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double acos(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atan(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atan2(double y, double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double sinh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double cosh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double tanh(double x)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''setjmp.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int setjmp(jmp_buf env)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void longjmp(jmp_buf env, int val)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''signal.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void (*signal(int sig, void (*handler)(int)))(int)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int raise(int sig)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdarg.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void va_start(va_list ap, lastarg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;type va_arg(va_list ap, type)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void va_end(va_list ap)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stddef.h'''&lt;br /&gt;
&lt;br /&gt;
|- colspan=2 &lt;br /&gt;
| TODO&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdio.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* fopen(const char* filename, const char* mode)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* freopen(const char* filename, const char* mode, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fflush(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fclose(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int remove(const char* filename)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int rename(const char* oldname, const char* newname)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;FILE* tmpfile()&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* tmpnam(char s[L_tmpnam])&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int setvbuf(FILE* stream, char* buf, int mode, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void setbuf(FILE* stream, char* buf)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fprintf(FILE* stream, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int printf(const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int sprintf(char* s, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int vfprintf(FILE* stream, const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int vprintf(const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int vsprintf(char* s, const char* format, va_list arg)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fscanf(FILE* stream, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int scanf(const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int sscanf(char* s, const char* format, ...)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fgetc(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* fgets(char* s, int n, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fputc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* fputs(const char* s, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int getc(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int getchar(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* gets(char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int putc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int putchar(int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int puts(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int ungetc(int c, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t fread(void* ptr, size_t size, size_t nobj, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fseek(FILE* stream, long offset, int origin)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long ftell(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void rewind(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fgetpos(FILE* stream, fpos_t* ptr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int fsetpos(FILE* stream, const fpos_t* ptr)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void clearerr(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int feof(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int ferror(FILE* stream)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void perror(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot; &lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Status&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Function/Macro/Variable&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''stdlib.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int abs(int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;long labs(long n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;long long llabs(long long n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;div_t div(int num, int denom)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;ldiv_t ldiv(long num, long denom)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double atof(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int atoi(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long atol(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double strtod(const char* s, char** endp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;long strtol(const char* s, char** endp, int base)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;unsigned long strtoul(const char* s, char** endp, int base)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* calloc(size_t nobj, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* malloc(size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* realloc(void* p, size_t size)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void free(void* p)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void abort()&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void exit(int status)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int atexit(void (*fcm)(void))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int system(const char* s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* getenv(const char* name)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void* bsearch(const void* key, const void* base, size_t n,&amp;lt;br /&amp;gt;size_t size, int (*cmp)(const void* keyval, const void* datum))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void qsort(void* base, size_t n, size_t size, &amp;lt;br /&amp;gt;int (*cmp)(const void*, const void*))&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int rand(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void srand(unsigned int seed)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''string.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strcpy(char* s, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strncpy(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strcat(char* s, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strncat(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int strcmp(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int strncmp(const char* cs, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;int strcoll(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strchr(const char* cs, int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strrchr(const char* cs, int c)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strspn(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strcspn(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strpbrk(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strstr(const char* cs, const char* ct)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strlen(const char* cs)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strerror(int n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* strtok(char* s, const char* t)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strxfrm(char* s, const char* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memcpy(void* s, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memmove(void* s, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;int memcmp(const void* cs, const void* ct, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memchr(const void* cs, int c, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:lime&amp;quot; | yes&lt;br /&gt;
| &amp;lt;code&amp;gt;void* memset(void* s, int c, size_t n)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
| colspan=2 | '''time.h'''&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;clock_t clock(void)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;time_t time(time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;double difftime(time_t time2, time_t time1)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;time_t mktime(struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* asctime(const struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;char* ctime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct tm* gmtime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;struct tm* localtime(const time_t* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background:red&amp;quot; | no&lt;br /&gt;
| &amp;lt;code&amp;gt;size_t strftime(char* s, size_t smax, const char* fmt,&amp;lt;br /&amp;gt;const struct tm* tp)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Usage example ==&lt;br /&gt;
&lt;br /&gt;
Here's an example of a very simple payload (hello.c) and how to build it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;libpayload.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    printf(&amp;quot;Hello, world!\n&amp;quot;);&lt;br /&gt;
    halt();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Building the payload:&lt;br /&gt;
&lt;br /&gt;
 lpgcc -o hello.elf hello.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{PD-self}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-05-15T22:30:24Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: add param information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma). &lt;br /&gt;
&lt;br /&gt;
== Payload Parameters ==&lt;br /&gt;
&lt;br /&gt;
There are several parameters that the payload can set to control the behavior of bayou.  These are passed in through the PARAMS section in the SELF:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| name || This is the short name of the payload, which is displayed in the log and in the chooser menu if 'listname' is not defined&lt;br /&gt;
|-&lt;br /&gt;
| listname || This is the name shown in the chooser menu&lt;br /&gt;
|-&lt;br /&gt;
| desc || This is a verbose description of the application that will be displayed in the &amp;quot;help&amp;quot; section in the chooser menu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following is an example of macros a typical payload would use to set the above values:&lt;br /&gt;
&lt;br /&gt;
 PAYLOAD_PARAM(name,&amp;quot;coreinfo&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(listname,&amp;quot;System Information&amp;quot;);&lt;br /&gt;
 PAYLOAD_PARAM(desc,&amp;quot;Display information about the system&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload. Captain Obvious says: call it payload/default (or normal, or whatever). No evil bit in LAR required to find it.&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
Instead of modifying LAR and putting even more features into it, how about creating an elf2self (and back) tool, and just add those files into lar?&lt;br /&gt;
Sure, it's another build step, but it's &amp;quot;one tool for one job&amp;quot;, allows for interesting development, adoption of self beyond coreboot, ... - and we really already have enough build steps that this additional one won't hurt either.&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code '''Done'''&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-05-15T22:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Add the param section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on the standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeroes a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 'CODE' (0x45444F43) || CODE || This segment has executable code to be copied from the data section to memory.  Each CODE segment has a corresponding block of data, which may be compressed in the LAR.   Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'DATA' (0x41543144) || DATA || This segment has non-executable data to be copied from the data section into memory. Each DATA segment has a corresponding block of data, which may be compressed in the LAR.   Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'BSS ' (0x20535342) || BSS || This segment defines a section of memory to be zeroed.  BSS segments do not have any data associated with them.  Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'PARA' (0x41524150)|| PARAMS || This segment contains the contents of the .notes.pinfo section from the payload ELF.  The payload will store parameters in this section for the benefit of a chooser payload.  The parameters will be stored as a series of strings of the format &amp;quot;key=value\0&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 'ENTR' (0x52544E45) || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments, and it must be the last segment defined in the SELF.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is comprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The value of each field will be stored in little endian format.  Big endian architectures will need to byte swap the value before using it. The following table lists which members are used and what they mean:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| PARAM || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section, with the start of each block aligned to a 32 bit boundary.&lt;br /&gt;
CODE and DATA sections may be compressed according to the LAR compression scheme, the PARAM section must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
The following pseudo code shows how a SELF is loaded and run:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
* Replace the NAME and NOTE sections with the PARAMS section &lt;br /&gt;
* Change ID of each segment to 4 text characters &lt;br /&gt;
* Each block of data needs to be 32 bit aligned&lt;br /&gt;
* Specified that all the segment header members are stored in little endian&lt;br /&gt;
* Changed the load address in the segment header structure to 64 bits.&lt;br /&gt;
* Clarified the compression of the code / data segments&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Rating_System</id>
		<title>Rating System</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Rating_System"/>
				<updated>2008-04-18T17:43:16Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: add documentation critera from IRC discussion and example platform&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rating System ==&lt;br /&gt;
&lt;br /&gt;
At the coreboot summit in Denver we talked about a rating system for supported boards. The idea is to make it clear which boards are most highly recommended because the vendors cooperate.&lt;br /&gt;
&lt;br /&gt;
To get to such a rating for a particular board, we should establish a list of categories with an associated score.  Each fulfilled criteria should be easily verifiable as a yes or no answer.&lt;br /&gt;
There should be no subjective elements to the rating system - only measurable criteria should be used to avoid bias or favoritism.&lt;br /&gt;
&lt;br /&gt;
Adding up the scores for the major components on a board (cpu, chipsets, mainboard, others?) would give us a rating that results in a number of 'stars'.&lt;br /&gt;
&lt;br /&gt;
Some ideas for those categories:&lt;br /&gt;
&lt;br /&gt;
* availability of documentation (nothing/NDA restricted == 0, NDA but free to publish code == 3, online with click through == 7, public URL == 10)&lt;br /&gt;
** There should be multiple categories of documentation (register set, BIOS programming guide, errata, schematics or pinouts (for motherboards)&lt;br /&gt;
* vendor participation in the coreboot project&lt;br /&gt;
** How to quantify?&lt;br /&gt;
* Availability of example and support code&lt;br /&gt;
** ACPI tables&lt;br /&gt;
* &amp;quot;Hackability&amp;quot;&lt;br /&gt;
** LPC header, JTAG header, BIOS socket, etc.&lt;br /&gt;
** Should we dock a board because it requires soldering or a difficult process for flashing coreboot?&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
As we list boards, we should also make it clear if a board is actually available for purchase. A board might get a high rating, but be unavailable for purchase, in which case it should be carefully marked as such. Board availability will change over a board's lifespan.&lt;br /&gt;
&lt;br /&gt;
Should we provide a separate rating for coreboot support (i.e. the stuff above) and how good our code actually is?&lt;br /&gt;
&lt;br /&gt;
= Criteria =&lt;br /&gt;
&lt;br /&gt;
When all the criteria have been evaluated, each platform will end up with a total score.  To assign &amp;quot;stars&amp;quot; to the platform, we will divide the number of points by the number of stars&lt;br /&gt;
(probably 5) and round down to the nearest half star.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
Use the following criteria to evaluate each set of documentation:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Points&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 10 || Documentation is freely available and redistributable.  It can be downloaded through a direct URL with no click-through pages.  &lt;br /&gt;
|-&lt;br /&gt;
|  7 || Documentation is freely available and redistributable.  It can be downloaded on the web after agreeing to a click-through license.&lt;br /&gt;
|-&lt;br /&gt;
|  3 || Documentation is restricted and only available under Non Disclosure Agreement, however the NDA allows source code written with the documentation to be freely available under the GPL.&lt;br /&gt;
|-&lt;br /&gt;
|  0 || Documentation is not available or the NDA does now allow release of code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
X86 based platforms can have up to 80 points for documentation.&lt;br /&gt;
&lt;br /&gt;
=== CPU ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following three sets of documentation (30 total points possible):&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (Detailed information about programming registers and/or memory locations)&lt;br /&gt;
* BIOS programming guide&lt;br /&gt;
* Errata&lt;br /&gt;
&lt;br /&gt;
=== Southbridge (chipset) ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following three sets of documentation (30 total points possible):&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (Detailed information about programming registers and/or memory locations)&lt;br /&gt;
* BIOS programming guide&lt;br /&gt;
* Errata&lt;br /&gt;
&lt;br /&gt;
=== Other chipsets (SuperIO, etc) ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following: (10 total points possible).   Add 10 points if not applicable to the platform.&lt;br /&gt;
&lt;br /&gt;
* Datasheet / register set (Detailed information about programming registers and/or memory locations)&lt;br /&gt;
&lt;br /&gt;
=== Mainboard ===&lt;br /&gt;
&lt;br /&gt;
Evaluate the criteria against the following: (10 total points available)&lt;br /&gt;
&lt;br /&gt;
* Schematics / Pinout (Sufficient documentation to detail the platform specific GPIO &amp;amp; IRQ assignments)&lt;br /&gt;
&lt;br /&gt;
= Example Board =&lt;br /&gt;
To demonstrate how this will work, we will apply the above criteria to the db800 platform from AMD, which is widely regarded as one of the better supported platforms in coreboot.&lt;br /&gt;
(Please fill in this section as new criteria are added).&lt;br /&gt;
&lt;br /&gt;
Total available points:  '''80'''&lt;br /&gt;
Total platform points:   '''52'''&lt;br /&gt;
Total &amp;quot;stars&amp;quot;:   '''3'''&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
=== CPU (Geode LX) ===&lt;br /&gt;
* Datasheet / register set:  Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33234F_LX_databook.pdf] - '''10 points'''&lt;br /&gt;
* BIOS programming guide: NDA allowing GPLed code - '''3 points'''&lt;br /&gt;
* Errata:  NDA allowing GPL - '''3 points'''&lt;br /&gt;
== Chipset (CS5536) ===&lt;br /&gt;
* Datasheet / register set:  Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33238G_cs5536_db.pdf] - '''10 points'''&lt;br /&gt;
* BIOS programming guide: NDA allowing GPLed code - '''3 points'''&lt;br /&gt;
* Errata:  Freely available [http://www.amd.com/files/connectivitysolutions/geode/geode_gx/34472D_CS5536_B1_specupdate.pdf] - '''10 points'''&lt;br /&gt;
== SuperIO ==&lt;br /&gt;
* Datasheet / register set:  Freely available [http://www.itox.com/pages/support/wdt/W83627HF.pdf] - '''10 points'''&lt;br /&gt;
==Mainboard==&lt;br /&gt;
* Schematics: NDA allowing GPLed code - '''3 points'''&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Rating_System</id>
		<title>Rating System</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Rating_System"/>
				<updated>2008-04-17T18:01:57Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Discuss quantitative criteria and add some ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rating System ==&lt;br /&gt;
&lt;br /&gt;
At the coreboot summit in Denver we talked about a rating system for supported boards. The idea is to make it clear which boards are most highly recommended because the vendors cooperate.&lt;br /&gt;
&lt;br /&gt;
To get to such a rating for a particular board, we should establish a list of categories with an associated score.  Each fulfilled criteria should be easily verifiable as a yes or no answer.&lt;br /&gt;
There should be no subjective elements to the rating system - only measurable criteria should be used to avoid bias or favoritism.&lt;br /&gt;
&lt;br /&gt;
Adding up the scores for the major components on a board (cpu, chipsets, mainboard, others?) would give us a rating that results in a number of 'stars'.&lt;br /&gt;
&lt;br /&gt;
Some ideas for those categories:&lt;br /&gt;
&lt;br /&gt;
* availability of documentation (nothing/NDA restricted == 0, NDA but free to publish code == 3, online with click through == 7, public URL == 10)&lt;br /&gt;
** There should be multiple categories of documentation (register set, BIOS programming guide, errata, schematics or pinouts (for motherboards)&lt;br /&gt;
* vendor participation in the coreboot project&lt;br /&gt;
** How to quantify?&lt;br /&gt;
* Availability of example and support code&lt;br /&gt;
** ACPI tables&lt;br /&gt;
* &amp;quot;Hackability&amp;quot;&lt;br /&gt;
** LPC header, JTAG header, BIOS socket, etc.&lt;br /&gt;
** Should we dock a board because it requires soldering or a difficult process for flashing coreboot?&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
As we list boards, we should also make it clear if a board is actually available for purchase. A board might get a high rating, but be unavailable for purchase, in which case it should be carefully marked as such. Board availability will change over a board's lifespan.&lt;br /&gt;
&lt;br /&gt;
Should we provide a separate rating for coreboot support (i.e. the stuff above) and how good our code actually is?&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-04-13T03:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Changes based on feedback&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on the standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeroes a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 'CODE' (0x45444F43) || CODE || This segment has executable code to be copied from the data section to memory.  Each CODE segment has a corresponding block of data, which may be compressed in the LAR.   Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'DATA' (0x41543144) || DATA || This segment has non-executable data to be copied from the data section into memory. Each DATA segment has a corresponding block of data, which may be compressed in the LAR.   Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'BSS ' (0x20535342) || BSS || This segment defines a section of memory to be zeroed.  BSS segments do not have any data associated with them.  Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'NAME' (0x434D4145)|| NAME || This segment contains a descriptive string in the data section that is used by the payload loader to identify the current payload.  NAME segments have corresponding blocks of data, but they are not loaded into system memory.  The segment data must '''not''' be compressed.  Multiple segments of this type are allowed, but likely won't be used by the payload loader.&lt;br /&gt;
|-&lt;br /&gt;
| 'NOTE' (0x45544F4E)|| NOTES || This segment contains the contents of the .notes section in the data segment.  NOTES segments have corresponding blocks of data, but they are not loaded into system memory.  The segment data must '''not''' be compressed. Multiple segments of this type are allowed.&lt;br /&gt;
|-&lt;br /&gt;
| 'ENTR' (0x52544E45) || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is comprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The value of each field will be stored in little endian format.  Big endian architectures will need to byte swap the value before using it. The following table lists which members are used and what they mean:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| NAME || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| NOTES || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section, with the start of each block aligned to a 32 bit boundary.&lt;br /&gt;
CODE and DATA sections may be compressed according to the LAR compression scheme, NAME and NOTES sections must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
There are two usage models for the SELF.  The first is the payload loader that wishes to determine the name of the payload for a graphical chooser.  The following is the psuedo code for accomplishing this:&lt;br /&gt;
&lt;br /&gt;
 get_name(char *name) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
   struct self_header *header;&lt;br /&gt;
 &lt;br /&gt;
   do {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
 &lt;br /&gt;
     if (header-&amp;gt;type == SELF_NAME) {&lt;br /&gt;
            memcpy(name, SELF_start + header-&amp;gt;offset, header-&amp;gt;size);&lt;br /&gt;
            return 0;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   } while(header-&amp;gt;type != SELF_ENTRY);&lt;br /&gt;
 &lt;br /&gt;
   return -1;&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
The second usage model is actually loading and running the code - this is accomplished in a stream fashion like so:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
* Chage ID of each segment to 4 text characters &lt;br /&gt;
* Each block of data needs to be 32 bit aligned&lt;br /&gt;
* Specified that all the segment header members are stored in little endian&lt;br /&gt;
* Changed the load address in the segment header structure to 64 bits.&lt;br /&gt;
* Clarified the compression of the code / data segments&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-04-12T22:51:09Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Description */  clarify compression&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on the standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeroes a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CODE || This segment has executable code to be copied from the data section to memory (segment data may be compressed if specified by the LAR)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DATA || This segment has non-executable data to be copied from the data section into memory (segment data may be compressed if specified by the LAR)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || BSS || This segment defines a section of memory to be zeroed.  Nothing is copied into memory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NAME || This segment contains a descriptive string in the data section that is used by the payload loader to identify the current payload.  Nothing is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NOTES || This segment contains the contents of the .notes section in the data segment.  This is for use by the payload loader. Nothing is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is comprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The following table lists which members are used and what they mean:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| NAME || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| NOTES || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section.  CODE and DATA sections may be compressed, NAME and NOTES sections must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
There are two usage models for the SELF.  The first is the payload loader that wishes to determine the name of the payload for a graphical chooser.  The following is the psuedo code for accomplishing this:&lt;br /&gt;
&lt;br /&gt;
 get_name(char *name) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
   struct self_header *header;&lt;br /&gt;
 &lt;br /&gt;
   do {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
 &lt;br /&gt;
     if (header-&amp;gt;type == SELF_NAME) {&lt;br /&gt;
            memcpy(name, SELF_start + header-&amp;gt;offset, header-&amp;gt;size);&lt;br /&gt;
            return 0;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   } while(header-&amp;gt;type != SELF_ENTRY);&lt;br /&gt;
 &lt;br /&gt;
   return -1;&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
The second usage model is actually loading and running the code - this is accomplished in a stream fashion like so:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-04-11T23:39:28Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Segment Table */  Seesh, who wrote this thing?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on the standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeros a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CODE || This segment has executable code to be copied from the data section to memory (segement data may be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DATA || This segment has non-executable data to be copied from the data section into memory (sigment data may be compressed) &lt;br /&gt;
|-&lt;br /&gt;
| 3 || BSS || This segment has defines a section of memory to be zeroed.  Noting is copied into memory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NAME || This segment contains a descriptive string in the data section that is used by the pyaload loader to identify the current payload.  Noting is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NOTES || This segment contains the contents of the .notes section in the data segment.  This is for the use the payload loader. Nothing is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is conprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The following table lists which members are used and what they mean:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| NAME || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| NOTES || Offset of the segment in the SELF file || N/A || length of the data in the segment data section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section.  CODE and DATA sections may be compressed, NAME and NOTES sections must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
There are two usage models for the SELF.  The first is the payload loader that wishes to determine the name of the payload for a graphical chooser.  The following is the psuedo code for accomplishing this:&lt;br /&gt;
&lt;br /&gt;
 get_name(char *name) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
   struct self_header *header;&lt;br /&gt;
 &lt;br /&gt;
   do {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
 &lt;br /&gt;
     if (header-&amp;gt;type == SELF_NAME) {&lt;br /&gt;
            memcpy(name, SELF_start + header-&amp;gt;offset, header-&amp;gt;size);&lt;br /&gt;
            return 0;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   } while(header-&amp;gt;type != SELF_ENTRY);&lt;br /&gt;
 &lt;br /&gt;
   return -1;&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
The second usage model is actually loading and running the code - this is accomplished in a stream fashion like so:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-04-11T23:37:12Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on the standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeros a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CODE || This segment has executable code to be copied from the data section to memory (segement data may be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DATA || This segment has non-executable data to be copied from the data section into memory (sigment data may be compressed) &lt;br /&gt;
|-&lt;br /&gt;
| 3 || BSS || This segment has defines a section of memory to be zeroed.  Noting is copied into memory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NAME || This segment contains a descriptive string in the data section that is used by the pyaload loader to identify the current payload.  Noting is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NOTES || This segment contains the contents of the .notes section in the data segment.  This is for the use the payload loader. Nothing is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is conprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The following table lists which members are required for each type:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| NAME || Offset of the segment in the SELF file || N/A || length of the data in the segment section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| NOTES || Offset of the segment in the SELF file || N/A || length of the data in the segment section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section.  CODE and DATA sections may be compressed, NAME and NOTES sections must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
There are two usage models for the SELF.  The first is the payload loader that wishes to determine the name of the payload for a graphical chooser.  The following is the psuedo code for accomplishing this:&lt;br /&gt;
&lt;br /&gt;
 get_name(char *name) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
   struct self_header *header;&lt;br /&gt;
 &lt;br /&gt;
   do {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
 &lt;br /&gt;
     if (header-&amp;gt;type == SELF_NAME) {&lt;br /&gt;
            memcpy(name, SELF_start + header-&amp;gt;offset, header-&amp;gt;size);&lt;br /&gt;
            return 0;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   } while(header-&amp;gt;type != SELF_ENTRY);&lt;br /&gt;
 &lt;br /&gt;
   return -1;&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
The second usage model is actually loading and running the code - this is accomplished in a stream fashion like so:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/SELF</id>
		<title>SELF</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/SELF"/>
				<updated>2008-04-11T22:21:06Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Go with the initial description of SELF&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''SELF''' stands for '''S'''imple '''E'''xecutable '''L'''oader '''F'''ormat.  It is a very simple take on an standard [[http://en.wikipedia.org/wiki/Executable_and_Linkable_Format|ELF]] executable format.  It is proposed that SELF be the the standard format for payload code stored in a LAR file and loaded and executed by coreboot-v3.   The [[bayou]] chooser will also load and run payloads in the SELF format.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Each SELF file is defined as a group of different segments.  Each segment either loads data into memory, zeros a section of memory, or provides information to coreboot or the payload. The segments can be one of the following types:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Segment&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CODE || This segment has executable code to be copied from the data section to memory (segement data may be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DATA || This segment has non-executable data to be copied from the data section into memory (sigment data may be compressed) &lt;br /&gt;
|-&lt;br /&gt;
| 3 || BSS || This segment has defines a section of memory to be zeroed.  Noting is copied into memory.&lt;br /&gt;
|-&lt;br /&gt;
| 4 || NAME || This segment contains a descriptive string in the data section that is used by the pyaload loader to identify the current payload.  Noting is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 5 || NOTES || This segment contains the contents of the .notes section in the data segment.  This is for the use the payload loader. Nothing is copied into memory (segment data must '''not''' be compressed)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ENTRY || This segment defines the entry point for execution.  This type signifies the end of the list of segments.  It is mandatory and can only be used once.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
A SELF file is conprised of two parts:  the segment table and the data section.  Each is described below.&lt;br /&gt;
&lt;br /&gt;
=== Segment Table ===&lt;br /&gt;
&lt;br /&gt;
The segment table is located at the start of the ELF file, with one entry per segement.  Each segment is identified by its type (as listed above).  The structure of the header entry is as follows:&lt;br /&gt;
&lt;br /&gt;
 struct self_header {&lt;br /&gt;
     unsigned long type;&lt;br /&gt;
     unsigned long offset;&lt;br /&gt;
     unsigned long load_addr;&lt;br /&gt;
     unsigned long len;&lt;br /&gt;
     unsigned long mem_len;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
All fields are present in each segment entry, though not every field will be valid for every segment type.  The following table lists which members are required for each type:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699ff&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!offset&lt;br /&gt;
!load_addr&lt;br /&gt;
!len&lt;br /&gt;
!mem_len&lt;br /&gt;
|-&lt;br /&gt;
|CODE || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| DATA || Offset of the segment in the SELF file || address where the code should be copied in memory || length of the data in the segment data section || length of the data in memory&lt;br /&gt;
|-&lt;br /&gt;
| BSS || N/A || Start address of the block in memory to be zeroed || N/A || Length of the block in memory to be zeroed &lt;br /&gt;
|-&lt;br /&gt;
| NAME || Offset of the segment in the SELF file || N/A || length of the data in the segment section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| NOTES || Offset of the segment in the SELF file || N/A || length of the data in the segment section || N/A&lt;br /&gt;
|-&lt;br /&gt;
| ENTRY || N/A || Address where execution should start || N/A || N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Segment Section ===&lt;br /&gt;
&lt;br /&gt;
The data section immediately follows the final entry in the segment table.  Each block of segment data is written sequentially in this section.  CODE and DATA sections may be compressed, NAME and NOTES sections must be uncompressed.&lt;br /&gt;
&lt;br /&gt;
== Typical Use ==&lt;br /&gt;
&lt;br /&gt;
There are two usage models for the SELF.  The first is the payload loader that wishes to determine the name of the payload for a graphical chooser.  The following is the psuedo code for accomplishing this:&lt;br /&gt;
&lt;br /&gt;
 get_name(char *name) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
   struct self_header *header;&lt;br /&gt;
 &lt;br /&gt;
   do {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
 &lt;br /&gt;
     if (header-&amp;gt;type == SELF_NAME) {&lt;br /&gt;
            memcpy(name, SELF_start + header-&amp;gt;offset, header-&amp;gt;size);&lt;br /&gt;
            return 0;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   } while(header-&amp;gt;type != SELF_ENTRY);&lt;br /&gt;
 &lt;br /&gt;
   return -1;&lt;br /&gt;
 }&lt;br /&gt;
    &lt;br /&gt;
The second usage model is actually loading and running the code - this is accomplished in a stream fashion like so:&lt;br /&gt;
&lt;br /&gt;
 decompress_and_run(void) {&lt;br /&gt;
   ptr = SELF_start;&lt;br /&gt;
 &lt;br /&gt;
   while(1) {&lt;br /&gt;
     header = (struct self_header *) ptr;&lt;br /&gt;
     switch(header-&amp;gt;type) {&lt;br /&gt;
        case TYPE_CODE:&lt;br /&gt;
        case TYPE_DATA:&lt;br /&gt;
            dlen = decompress(SELF_start + header-&amp;gt;offset, header-&amp;gt;load_addr, header-&amp;gt;len);&lt;br /&gt;
            memset(header-&amp;gt;load_addr + dlen, 0, header-&amp;gt;mem_len - dlen);&lt;br /&gt;
            break;&lt;br /&gt;
        case BSS:&lt;br /&gt;
             memset(header-&amp;gt;load_addr, 0, header-&amp;gt;len);&lt;br /&gt;
             break;&lt;br /&gt;
        case LOAD:&lt;br /&gt;
             return jump_to(header-&amp;gt;load_addr);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     ptr += sizeof(*header);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Bayou</id>
		<title>Bayou</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Bayou"/>
				<updated>2008-04-11T21:21:54Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Initial architecture document for bayou&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Bayou''' is the working name for a coreboot payload that can chose, load and run other payloads from a LAR archive on the ROM.&lt;br /&gt;
&lt;br /&gt;
== Why &amp;quot;Bayou&amp;quot;? ==&lt;br /&gt;
&lt;br /&gt;
We need a little bit of originality in the names of our payloads, as Peter discusses [http://www.coreboot.org/pipermail/coreboot/2008-April/033219.html here].  In the grand tradition of [http://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29 El Torito], we decided to name the project after the restaurant where we ate lunch and debated the payload chooser during the coreboot summit in Denver: [http://denver.citysearch.com/profile/1823003/denver_co/bayou_bob_s_seafood_southern_cookin.html Bayou Bob's]. The word ''bayou'' is French in origin, but it famously describes slow or stagnant streams and swamps in the southern United States (see also [http://en.wikipedia.org/wiki/Bayou Bayou at wikipedia].  The name in no way describes the project itself, which should neither be slow nor swampy.&lt;br /&gt;
&lt;br /&gt;
== Usage Models ==&lt;br /&gt;
&lt;br /&gt;
The following are the two usage models for the payload:&lt;br /&gt;
&lt;br /&gt;
=== Graphical chooser ===&lt;br /&gt;
This usage model presents a menu to the user containing the descriptive names of all the payloads in the LAR.  The user selects an item from the list, and bayou loads and runs the payload.  If the payload is responsible enough to be able to exit cleanly (as all libpayload payloads should be able to do) and return control to bayou, then the user can select a different payload.&lt;br /&gt;
&lt;br /&gt;
=== Chaining ===&lt;br /&gt;
Chaining is a non-interactive usage model wherein Bayou will load and execute a series of payloads in order.  The payloads must be able to return control to bayou cleanly (except the &amp;quot;final&amp;quot; payload which isn't expected to return).  This will loosely imitate a traditional BIOS in that one could define a &amp;quot;BIOS setup screen&amp;quot; payload that ran before FILO or other kernel bootloader.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The architecture of bayou is rather simple.  It is a [[libpayload]] based application with code for reading and loading payloads from a LAR and an front end user interface.  The&lt;br /&gt;
bayou code itself lives below 640k so that it can stay resident when loading payloads that would typically locate themselves at 1Mb or higher.  Payloads that want to work cleanly with bayou&lt;br /&gt;
should not write to memory below 640k unless it is a &amp;quot;final&amp;quot; payload (i.e. something that will not return to bayou, such as the Linux kernel).  Bayou will read, load and execute payloads encoded in&lt;br /&gt;
the [[SELF|Simple Executable Loader Format]], decompressing them if needed (with lzma).  Each SELF defines a special NAME segment that specifies a descriptive name for the chooser display.&lt;br /&gt;
&lt;br /&gt;
== Changes to coreboot ==&lt;br /&gt;
In order to support bayou, some drastic changes need to be made to coreboot and associated projects.  The following is a short synopsis of these changes.&lt;br /&gt;
&lt;br /&gt;
=== Coreboot ===&lt;br /&gt;
* Coreboot needs to be modified to understand and load the [[SELF]] format&lt;br /&gt;
* The LAR design needs to be modified so that coreboot can identify and boot the &amp;quot;default&amp;quot; payload&lt;br /&gt;
&lt;br /&gt;
=== LAR ===&lt;br /&gt;
* The LAR utility must be modified to build LAR images with SELF payloads&lt;br /&gt;
* The LAR utility needs to be modified to allow the user to specify a long descriptive name to be included in the NAME segment&lt;br /&gt;
* A rewrite of the frontend of the LAR utility may be needed to fully support all the features&lt;br /&gt;
&lt;br /&gt;
=== Buildrom ===&lt;br /&gt;
* Buildrom must be adapted to build multiple payloads during the same run&lt;br /&gt;
&lt;br /&gt;
=== Libpayload ===&lt;br /&gt;
* Add generic LAR walking code&lt;br /&gt;
* Ensure that libpayload based payloads can cleanly return control to the master payload&lt;br /&gt;
* Modify the build system to allow the configuration system to modify the payload entry point&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Coreboot_Symposium_2008</id>
		<title>Coreboot Symposium 2008</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Coreboot_Symposium_2008"/>
				<updated>2008-03-27T20:02:55Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Update what I'm bringing and fix typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Agenda ==&lt;br /&gt;
&lt;br /&gt;
general: breaks at 10-10:30, 12-1, 3-3:30&lt;br /&gt;
&lt;br /&gt;
=== Thursday ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699dd&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Time&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Speaker&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Topic&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 1:00-2:00&lt;br /&gt;
| Ron Minnich&lt;br /&gt;
| Opening of the meeting and discussion of the last year&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 2:00-3:00&lt;br /&gt;
| Stefan Reinauer&lt;br /&gt;
| Automated Testbed, GSoC 2007, 2008&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 3:00-3:30&lt;br /&gt;
| &lt;br /&gt;
| break&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 3:30-4:00&lt;br /&gt;
| Stefan Reinauer&lt;br /&gt;
| coresystems' various BIOS customers, recent ports and other related work&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 4:00-end&lt;br /&gt;
| &lt;br /&gt;
| hack session -- set up boards and prioritize the goals of the rest of the time&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Friday ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#6699dd&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Time&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Speaker&lt;br /&gt;
! align=&amp;quot;left&amp;quot; | Topic&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 8:30-10:00&lt;br /&gt;
| Marc Jones (AMD)&lt;br /&gt;
| AMD talks about whatever they want :-)&lt;br /&gt;
- consumer issues&lt;br /&gt;
&lt;br /&gt;
- what's going on&lt;br /&gt;
&lt;br /&gt;
- new ports this year&lt;br /&gt;
&lt;br /&gt;
- K10?&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 10:00-10:30&lt;br /&gt;
| &lt;br /&gt;
| break&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 10:30-12:00&lt;br /&gt;
| Marc Karasek (Sun)&lt;br /&gt;
| Marc talks about his work at Sun with SimNow&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 12:00-1:00&lt;br /&gt;
| &lt;br /&gt;
| Lunch&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 1:00-3:00&lt;br /&gt;
| Ron Minnich&lt;br /&gt;
| Ron gives an overview of v3, from the smallest to the large bits.&lt;br /&gt;
Sample build/burn session&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 3:00-3:30&lt;br /&gt;
| &lt;br /&gt;
| break&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#eeeeee&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 3:30-4:00&lt;br /&gt;
| &lt;br /&gt;
| open questions (please add some)&lt;br /&gt;
1. how do we tell when a board is good enough to move from v2 to v3?&lt;br /&gt;
&lt;br /&gt;
What's the test?&lt;br /&gt;
&lt;br /&gt;
2. What pending issues are there?&lt;br /&gt;
&lt;br /&gt;
|- bgcolor=&amp;quot;#dddddd&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| 4:00-5:00&lt;br /&gt;
| Ward Vandewege&lt;br /&gt;
| The view from the FSF -- what's going on, etc.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Saturday ===&lt;br /&gt;
&lt;br /&gt;
* hack all day. We hope to fix the problems we prioritized Thursday.&lt;br /&gt;
&lt;br /&gt;
== What needs to be brought ==&lt;br /&gt;
&lt;br /&gt;
* monitor&lt;br /&gt;
* power supplies&lt;br /&gt;
&lt;br /&gt;
== Who is bringing what ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ron:''' dbe61 and dbe62. Alix 1C. Alix LPC pod. Artec LPC pod. T23 with ubuntu. OLPC devel board for v3 test. (No OLPC, it's too distracting). Outlet strips. FS2 if it arrives from LANL on time (it may not). USB hubs? &lt;br /&gt;
What else?&lt;br /&gt;
&lt;br /&gt;
'''Ward:''' alix2c3, Artec LPC dongle. I can bring an alix.1c too but Ron's already bringing one.&lt;br /&gt;
&lt;br /&gt;
'''Stefan:''' Advantech PCM-5820, possibly other boards, Artec LPC Dongle, ByteBlaster II (if it arrives in time), other JTAG cables on Request,  Galep-5 Flash Writer, Flash Plaice(?)&lt;br /&gt;
&lt;br /&gt;
'''Jordan:''' Norwich, FS2, ROM emulator, monitor, PS/2 keyboard, serial cable, laptop and lots of code.&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/AMD_SimNow</id>
		<title>AMD SimNow</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/AMD_SimNow"/>
				<updated>2007-12-13T18:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: /* Serial Port Configuration */  Add information about snserial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are the steps I use to download, install, and use the AMD SimNow simulator.&lt;br /&gt;
You may not want to do exactly what I did, but it should get you started.&lt;br /&gt;
There is PDF documentation that you can download on the same page as the simulator. &lt;br /&gt;
== Build a ROM image for SimNow (Skip this step if you have your own Bios you want to use)==&lt;br /&gt;
# install Intel's ASL iasl tool&lt;br /&gt;
# ''svn co svn://linuxbios.org/buildrom/''&lt;br /&gt;
# ''cd buildrom/buildrom-devel/''&lt;br /&gt;
# ''make menuconfig''&lt;br /&gt;
## Choose Platform Configuration&lt;br /&gt;
### Vendor AMD&lt;br /&gt;
### Platform Target AMD Serengeti-Cheetah&lt;br /&gt;
### Select Build for SimNow emulator&lt;br /&gt;
## Choose Payload Configuration&lt;br /&gt;
### Desired Payload Linux-As-Bootloader&lt;br /&gt;
### Desired Target Architecture 64-bit&lt;br /&gt;
### LAB Configuration&lt;br /&gt;
#### Select Busybox but not reduced-size kexec tools&lt;br /&gt;
## Save and Exit&lt;br /&gt;
# ''make''&lt;br /&gt;
# Enjoy your amd_serengeti_cheetah.rom file&lt;br /&gt;
== Download SimNow ==&lt;br /&gt;
# Download SimNow from [http://developer.amd.com/simnow.jsp AMD's website]&lt;br /&gt;
## Create an account&lt;br /&gt;
## Accept the license agreement&lt;br /&gt;
## Log in.&lt;br /&gt;
#Untar the .tar.gz file you download in a convenient place (You'll now have a directory called simnow-linux64-4.4.1pub)&lt;br /&gt;
&lt;br /&gt;
== Run SimNow ==&lt;br /&gt;
#Run ''./simnow'' from the simnow-linux64-4.4.1pub directory&lt;br /&gt;
#Inside the SimNow Main Window do File-&amp;gt;Open BSD, browse to the simnow-linux64-4.4.1pub/bsds directory and load either cheetah_1p.bsd or cheetah_1pjh.bsd (jh is dual-core)&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;Now you have a single Opteron socket motherboard with an AMD-8132 PCI-X controller, an AMD-8111 I/O hub, and a Winbond W83627HF SuperIO.&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
#Copy your LinuxBIOS ROM image to simnow-linux64-4.4.1pub/Images for convenience.&lt;br /&gt;
#Open the SimNow Device Window (View-&amp;gt;Show Devices)&lt;br /&gt;
#Double click on Memory Device #5 (Your BIOS chip)&lt;br /&gt;
#Click on the Memory Configuration Tab, and change the Base Address, Size, and File (I use Base Address = fff00000 and Size = 32 because I use a 1 MB image)&lt;br /&gt;
#Go to the main simulator window and hit Run Simulation (Play button)&lt;br /&gt;
##You will get this error:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;quot;BIOS ROM file is the wrong size for this BSD.  Please either point the memdevice to the correct BIOS ROM file, or configure the memdevice to be the correct size.&amp;quot; &amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
Repeat the last few steps to set the size and try again.  This happens whenever you increase the BIOS size.&lt;br /&gt;
== Serial Port Configuration == &lt;br /&gt;
In order to see the console output, go to the terminal you are running ./simnow in.  Hit enter.  You'll see a simnow&amp;gt; prompt.  &lt;br /&gt;
# Type ''serial.SetCommPort pipe'' and hit enter.&lt;br /&gt;
# Type ''serial.GetCommPort'' and hit enter.&lt;br /&gt;
On my machine this returns &lt;br /&gt;
path (/home/myles/.simnow/com1), mode (PIPE)&lt;br /&gt;
&lt;br /&gt;
Open a new terminal and type cat /home/myles/.simnow/com1/simnow_out&lt;br /&gt;
If you need to send input to the serial port, echo to /home/myles/.simnow/com1/simnow_in&lt;br /&gt;
&lt;br /&gt;
=== Using the snserial tool ===&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can use a tool called 'snserial' to interact with the serial ports.  snserial will combine the input and output, and provide access to the combined stream through either a psuedo tty, or a telenet port.&lt;br /&gt;
&lt;br /&gt;
# Download the snserial tool from http://linuxbios.org/~jcrouse/snserial-1.0.tar.gz.&lt;br /&gt;
# Extract it:  ''tar -zxvf snserial-1.0.tar.gz''&lt;br /&gt;
# Build it: ''cd snserial/; make''&lt;br /&gt;
&lt;br /&gt;
Before running the tool, make sure that you have enabled the serial pipes as detailed above.&lt;br /&gt;
&lt;br /&gt;
To enable serial through a pseudo TTY, start your simulation and type ''./snserial comX'' in another Linux terminal window (where X is 1 or 2).  The program will respond with:&lt;br /&gt;
&lt;br /&gt;
 SimNow Serial pipe Muxer&lt;br /&gt;
 &lt;br /&gt;
 Connection established.&lt;br /&gt;
 Type 'target remote /dev/pts/2' in GDB to connect.&lt;br /&gt;
 (Press CTRL-C to exit)&lt;br /&gt;
&lt;br /&gt;
You can now connect your serial application (minicom, or GDB for debugging) to the specified pseudo-tty.&lt;br /&gt;
&lt;br /&gt;
To enable serial interaction through telnet, start the simulation and type ''./snserial -t comX''.   The program will respond with:&lt;br /&gt;
&lt;br /&gt;
 SimNow Serial pipe Muxer&lt;br /&gt;
 &lt;br /&gt;
 COM 1: Listening on port 9000&lt;br /&gt;
 (Press CTRL-C to exit)&lt;br /&gt;
&lt;br /&gt;
You can now connect to the serial stream by typing 'telnet localhost 9000' in a Linux terminal window.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' It is a quirk of SimNow that the pipes are not created until the simulation for the BSD is started for the first time.  Make sure you start the simulation before running ''snserial'', otherwise you will see this:  ''Couldn't stat /home/&amp;lt;user&amp;gt;/.simnow/com1/simnow_out: No such file or directory.''  The best course of action is to start the simulation quickly, attach the snserial program, and then restart the simulation to see the early serial output.&lt;br /&gt;
&lt;br /&gt;
== Add disks ==  &lt;br /&gt;
#Hit the Stop Simulation button if the simulation is running&lt;br /&gt;
##File-&amp;gt;Set IDE Primary Master Image&lt;br /&gt;
###Browse to your hard drive image&lt;br /&gt;
##File-&amp;gt;Set IDE Secondary Master Image &lt;br /&gt;
###Browse to a CD .iso&lt;br /&gt;
#Hit Run Simulation again&lt;br /&gt;
&lt;br /&gt;
You should get output from the serial port scrolling in one terminal, and be able to watch the VGA output in the main window.&lt;br /&gt;
&lt;br /&gt;
If you used buildrom to get a BIOS image with LinuxBIOS + LAB, you'll end up at a linux prompt where you can mount the disks, etc.&lt;br /&gt;
&lt;br /&gt;
{{Cc-by-sa-3.0}}&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	<entry>
		<id>http://www.coreboot.org/Buildrom</id>
		<title>Buildrom</title>
		<link rel="alternate" type="text/html" href="http://www.coreboot.org/Buildrom"/>
				<updated>2007-10-23T22:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;JCrouse: Fixup the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BuildROM''' is a tool that can construct a LinuxBIOS image (comprising the LinuxBIOS loader and payload) from scratch.   Starting from a configuration file, it will download and build all the code necessary to construct the final binary.&lt;br /&gt;
&lt;br /&gt;
A tool with similar functionality is [[Etherboot]]'s [http://rom-o-matic.net/ ROM-o-matic] which builds etherboot as a LinuxBIOS ELF payload.&lt;br /&gt;
&lt;br /&gt;
== Supported Platforms ==&lt;br /&gt;
&lt;br /&gt;
Buildrom supports the following platforms:&lt;br /&gt;
&lt;br /&gt;
* AMD Geode LX 'Norwich'&lt;br /&gt;
* Artec Group dbe61&lt;br /&gt;
* PC Engines ALIX1.C&lt;br /&gt;
* Digital Logic msm800sev&lt;br /&gt;
* AMD DB800&lt;br /&gt;
* Gigabyte 57SLI&lt;br /&gt;
* Tyan S2891&lt;br /&gt;
* AMD &amp;quot;Serengeti Cheetah&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Supported Payloads ==&lt;br /&gt;
&lt;br /&gt;
Buildrom supports the following payloads:&lt;br /&gt;
&lt;br /&gt;
* Linux kernel&lt;br /&gt;
* [[Etherboot]]&lt;br /&gt;
* [[FILO]]&lt;br /&gt;
* &amp;quot;Linux-as-bootloader&amp;quot;&lt;br /&gt;
* Memtest86+ (except the M57SLI and the TYAN S891)&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
 $ svn co svn://linuxbios.org/buildrom&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
You will need the following packages on your system to use buildrom.  Please consult your distribution documentation on how to install new packages:&lt;br /&gt;
&lt;br /&gt;
* subversion&lt;br /&gt;
* make&lt;br /&gt;
* quilt&lt;br /&gt;
* GNU compiler tools (as, ld, gcc)&lt;br /&gt;
* iasl (for AMD K8 platforms)&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
In the buildrom-devel directory, type:&lt;br /&gt;
 $  make menuconfig&lt;br /&gt;
&lt;br /&gt;
You can now navigate the configuration system (this is the same configuration engine that the Linux kernel uses, so it should be familiar to some readers).&lt;br /&gt;
&lt;br /&gt;
== Building the ROM ==&lt;br /&gt;
&lt;br /&gt;
Make sure you have access to the internet (to download new packages), and type the following to create your ROM:&lt;br /&gt;
 $ make&lt;br /&gt;
&lt;br /&gt;
Buildrom will download and build all the components of the ROM selected in the configuration stage.  if the build is successful, then the final ROM will be located in ''buildrom-devel/deploy''. If it is not successful, then you will see an error message.  You can see the build output for each package in by reading build.log in the work/&amp;lt;package&amp;gt;logs/ directory (i.e work/filo/logs/build.log). &lt;br /&gt;
 &lt;br /&gt;
== Developing within buildROM ==&lt;br /&gt;
&lt;br /&gt;
This section is for the developers who wish to change and rebuild the code. BuildROM builds the code for LinuxBIOS and the payloads in the work/ directory.  Here is a typical view of the buildROM work/ directory:&lt;br /&gt;
 $ ls work/&lt;br /&gt;
   linuxbios  filo&lt;br /&gt;
&lt;br /&gt;
In each directory, you will find three directories.  Logs from the build will be found in logs/ and timestamps that the build system uses are in stamps/.  You normally won't have to touch these directories.   The source code is located in the third directory.    BuildROM provides several commands to make it easy to rebuild individual packages and ROMs.    To clean a directory (but not remove the source code) use 'make &amp;lt;package&amp;gt;-clean'.  You can build an individual packages with 'make &amp;lt;package&amp;gt;'.  f you wish to completely erase the source code and start again with a pristine version, use 'make &amp;lt;package&amp;gt;-distclean'. Typing 'make' at any time will rebuild the ROM using the most current versions of the individual packages.&lt;br /&gt;
Here is a typical work flow for modifying LinuxBIOS code:&lt;br /&gt;
&lt;br /&gt;
#Build the initial ROM from scratch with 'make'&lt;br /&gt;
#Edit the LinuxBIOS source code in work/linuxbios/svn/&lt;br /&gt;
#Clean the linuxbios package with 'make linuxbios-clean'&lt;br /&gt;
#Rebuild the ROM with 'make'&lt;/div&gt;</summary>
		<author><name>JCrouse</name></author>	</entry>

	</feed>