\section{Supported PC hardware% \label{supported-pc-hardware}% } Barrelfish supports following PC hardware : % \begin{quote} % \begin{itemize} \item x86 CPUs in either IA-32 or AMD64 mode. The following are known to work: % \begin{itemize} \item Intel Xeon Clovertown, Gainestown, Beckton (X5355, E5520, X7560, L5520, L7555) \item AMD Opteron Santa Rosa, Barcelona, Shanghai, Istanbul, Magny Cours (2220, 8350, 8374, 8380, 8431, 6174) \end{itemize} \end{itemize} \end{quote} The biggest compatibility problems are likely to be in the PCI/ACPI code. We usually discover new quirks (or missing functionality in the ACPI glue code) on each new machine we test. The following systems are known to work: % \begin{quote} % \begin{itemize} \item Intel x5000XVN \item Tyan n6650W and S4985 \item Supermicro H8QM3-2 \item Dell PowerEdge R610 and R905 \item Sun Fire X2270 and X4440 \item Intel/Quanta QSSC-S4R \item Lenovo X200 and X301 laptops \item ASUS Eee PC 1015PEM netbooks \end{itemize} \end{quote} The e1000n driver should work with most recent Intel gigabit ethernet controllers (see the list in devices/e1000.dev). We've mostly used the 82572EI (PCI device ID 0x1082). You should also be able to boot Barrelfish on a recent version of QEMU (0.14); note that the e1000 device emulated by QEMU is not supported by our driver. \section{Required Tools% \label{required-tools}% } The following are required to build Barrelfish and its tools: % \begin{quote} % \begin{itemize} \item GCC 4.x % \begin{itemize} \item 4.4.5, and 4.5.2 are known to work \item cross-compiling between i386 and x86\_64 works (requires libc6-dev-i386 to build 32 bit on 64 bit machine) \item for the ARM port, we recommend the EABI tools available from \href{http://www.codesourcery.com/sgpp/lite/arm}{CodeSourcery}. \end{itemize} \item GNU binutils (2.19 is known to work) \item GNU make \item GHC v7.4 and Parsec 3.1 - older versions of the tree supported v6.10 or v6.12.2 with Parsec 2.1 - GHC v6.12.1 has a known bug and is unable to build our tools - earlier versions of GHC are unsupported \end{itemize} \end{quote} Our build system may not be very portable; if in doubt, try building on a recent Debian or Ubuntu system, as these are what we use. \section{Building% \label{building}% } \newcounter{listcnt0} \begin{list}{\arabic{listcnt0}.} { \usecounter{listcnt0} \setlength{\rightmargin}{\leftmargin} } \item Assuming you have already unpacked the sources, create a build directory % \begin{quote}{\ttfamily \raggedright \noindent \$~mkdir~build~\&\&~cd~build } \end{quote} \end{list} 1. Run \texttt{hake.sh}, giving it the path to the source directory and target architecture(s) % \begin{quote}{\ttfamily \raggedright \noindent \$~../hake/hake.sh~-s~../~-a~x86\_64 } \end{quote} This will configure the build directory and use GHC to compile and then run hake, a tool used to generate the \texttt{Makefile}. 3. Optionally, edit the configuration parameters in \texttt{hake/Config.hs} and run \texttt{make rehake} to apply them. \setcounter{listcnt0}{0} \begin{list}{\arabic{listcnt0}.} { \usecounter{listcnt0} \addtocounter{listcnt0}{3} \setlength{\rightmargin}{\leftmargin} } \item Run make, and wait % \begin{quote}{\ttfamily \raggedright \noindent \$~make } \end{quote} \item If everything worked, you should now be able to run Barrelfish inside QEMU % \begin{quote}{\ttfamily \raggedright \noindent \$~make~sim } \end{quote} \end{list} \section{Installing and Booting% \label{installing-and-booting}% } Barrelfish requires a Multiboot-compliant bootloader that is capable of loading an ELF64 image. At the time of writing, this doesn't include the default GRUB. Your options are either: % \begin{quote} % \begin{itemize} \item use the pre-loader ``elver'' that can be found in the tools directory \item patch GRUB to support a 64-bit kernel image, using this \href{http://savannah.gnu.org/bugs/?17963}{patch}. \end{itemize} \end{quote} ``Installing'' Barrelfish currently consists of copying the ELF files for the CPU driver and user programs to a location that the target machine can boot from, and writing a suitable menu.lst file that instructs the bootloader (GRUB) which programs to load and the arguments to pass them. If you specify an appropriate INSTALL\_PREFIX, \texttt{make install} will copy the binaries to the right place for you, eg % \begin{quote}{\ttfamily \raggedright \noindent \$~make~install~INSTALL\_PREFIX=/tftpboot/barrelfish } \end{quote} We usually boot Barrelfish via PXE/TFTP, although loading from a local disk also works. Instructions for setting up GRUB to do this are beyond the scope of this document. Assuming you have such a setup, here is a sample menu.lst file for a basic diskless boot that doesn't do anything useful beyond probing the PCI buses and starting a basic shell % \begin{quote}{\ttfamily \raggedright \noindent title~~~Barrelfish\\ root~~~~(nd)\\ kernel~/barrelfish/x86\_64/sbin/elver\\ module~/barrelfish/x86\_64/sbin/cpu\\ module~/barrelfish/x86\_64/sbin/init\\ module~/barrelfish/x86\_64/sbin/mem\_serv\\ module~/barrelfish/x86\_64/sbin/monitor\\ module~/barrelfish/x86\_64/sbin/ramfsd~boot\\ module~/barrelfish/x86\_64/sbin/skb~boot\\ modulenounzip~/barrelfish/skb\_ramfs.cpio.gz~nospawn\\ module~/barrelfish/x86\_64/sbin/acpi~boot\\ module~/barrelfish/x86\_64/sbin/pci~boot\\ module~/barrelfish/x86\_64/sbin/spawnd~boot\\ module~/barrelfish/x86\_64/sbin/serial\\ module~/barrelfish/x86\_64/sbin/fish } \end{quote} There are many other programs you can load (take a look around the usr tree for examples). To start a program on a core other than the BSP core, pass \texttt{core=N} as its first argument. If things work, you should see output on both the VGA console and COM1.