docs: Fix Hakefile comment
[barrelfish] / README
1 ##########################################################################
2 Copyright (c) 2009-2018, ETH Zurich.
3 All rights reserved.
4
5 This file is distributed under the terms in the attached LICENSE file.
6 If you do not find this file, copies can be found by writing to:
7 ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
9
10 Barrelfish Overview
11 --------------------------------
12
13 Barrelfish currently runs on:
14
15  * x86 CPUs in AMD64 mode. The following are known to work:
16
17    - Intel Xeon Clovertown, Gainestown, Beckton, IvyBridge, Haswell (X5355,
18      E5520, X7560, L5520, L7555, E5-2670v2, E3-1245v3)
19    - AMD Opteron Italy, Santa Rosa, Barcelona, Shanghai, Istanbul, Magny Cours
20      (275, 2220, 8350, 8374, 8380, 8431, 6174)
21    - Intel Xeon Phi Knights Corner
22    - QEMU simulator (2.2.10)
23
24  * ARM CPUs, specifically ARMv8 and ARMv7. The following platforms are known to work:
25
26    - ARMv7: The Texas Instruments OMAP4460 Pandaboard ES SoC
27      (Barrelfish runs on both the A9 and the M3 cores)
28    - ARMv7: The ARM VExpress EMM board as simulated by GEM5
29    - ARMv8: Cavium ThunderX2
30    - ARMv8: Applied Micro X-Gene
31    - There is also limited support for the Netronome i8000 card, incorporating
32      a single Intel iXP2800 processor
33
34 This README file provides instructions for the x86 architecture. For other
35 architectures, please refer to the architecture-specific technical notes (e.g.,
36 see TN 06 for the SCC, and TN 17 for ARM).
37
38 You can either generate the latest documentation from this source-code
39 (instructions at end of this file), or visit the Barrelfish_ website
40 to download them.
41
42 .. _Barrelfish: http://www.barrelfish.org/
43
44 Supported PC hardware
45 --------------------------------
46
47 The biggest compatibility problems are likely to be in the PCI/ACPI code. We
48 usually discover new quirks (or missing functionality in the ACPI glue code)
49 on each new machine we test. The following systems are known to work:
50
51  * Intel x5000XVN
52  * Tyan n6650W and S4985
53  * Supermicro H8QM3-2
54  * Dell PowerEdge R610 and R905
55  * Sun Fire X2270 and X4440
56  * Intel/Quanta QSSC-S4R
57  * Lenovo X200 and X301 laptops
58  * ASUS Eee PC 1015PEM netbooks
59
60 We have support for the following NICs:
61     * The e1000n should work with most recent Intel gigabit ethernet
62       controllers (see the list in devices/e1000.dev). We've mostly used the
63       82572EI (PCI device ID 0x1082). 
64     * Intel i82599 (or X520) 10GbE
65     * Solarflare sfn5122f 10GbE
66
67 You should also be able to boot Barrelfish on a recent version of QEMU (2.14);
68 note that the e1000 device emulated by QEMU is not supported by our driver.
69
70 Required Tools
71 --------------------------------
72
73 Our toolchain tracks Ubuntu LTS releases, and this is what we use to
74 run our nightly tests.  If you are running Ubuntu LTS (18.04.1 at time
75 of writing), this means the following:
76
77  * GCC 7.4.0 for x86_64, ARMv7 and ARMv8
78    - On Ubuntu LTS install packages:
79      build-essential g++
80      gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
81      gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
82  * GNU binutils (2.30 is supported)
83  * GNU make
84  * GHC v8.0.2 and Parsec 3.1
85    - On Ubuntu LTS, install the following packages: 
86      cabal-install libghc-src-exts-dev libghc-ghc-paths-dev
87      libghc-parsec3-dev libghc-random-dev libghc-ghc-mtl-dev
88      libghc-async-dev libghc-aeson-pretty-dev libghc-aeson-dev
89      libghc-missingh-dev
90    - Then, run cabal update && cabal install bytestring-trie pretty-simple
91  * FreeBSD's libelf:
92    - On Ubuntu install the following packages:
93      libelf-freebsd-dev freebsd-glue
94  * Optional: LibUSB 1.0 (for the usbboot tool):
95    - On Ubuntu install libusb-1.0-0-dev
96
97  * Optional: QEMU with e1000e EFI ROM:
98    - On Ubuntu install qemu-system-x86 qemu-efi qemu-ipxe
99    - Then cd /usr/lib/ipxe/qemu/ &&
100      sudo wget https://github.com/qemu/qemu/raw/master/pc-bios/efi-e1000e.rom
101
102  * Optional ARMv8 support:
103     - prefix all deb entries in /etc/apt/sources.list with [arch=amd64]
104     - add "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports bionic main universe"
105       to sources.list
106     - dpkg --add-architecture arm64 && apt update && apt install gnu-efi:arm64 libefiboot-dev
107
108 Building
109 --------------------------------
110
111 1. Assuming you have already unpacked the sources, create a build directory ::
112
113     $ mkdir build && cd build
114
115 1. Run ``hake.sh``, giving it the path to the source directory and target
116 architecture(s) ::
117
118     $ ../hake/hake.sh -s ../ -a x86_64
119
120 This will configure the build directory and use GHC to compile and then run
121 hake, a tool used to generate the ``Makefile``.
122
123 3. Optionally, edit the configuration parameters in ``hake/Config.hs`` and
124 run ``make rehake`` to apply them.
125
126 4. Run make, and wait ::
127
128     $ make X86_64_Basic
129
130 5. If everything worked, you should now be able to run Barrelfish inside QEMU 
131    (make sure you have followed the optional qemu step in required tools) ::
132
133     $ make qemu_x86_64
134
135 Installing and Booting
136 --------------------------------
137
138 Barrelfish requires a Multiboot-compliant bootloader that is capable of loading
139 an ELF64 image. At the time of writing, this doesn't include the default GRUB.
140 Your options are either:
141
142  * use the pre-loader "elver" that can be found in the tools directory
143  * patch GRUB to support a 64-bit kernel image, using this patch_.
144
145 .. _patch: http://savannah.gnu.org/bugs/?17963
146
147 "Installing" Barrelfish currently consists of copying the ELF files for the CPU
148 driver and user programs to a location that the target machine can boot from,
149 and writing a suitable menu.lst file that instructs the bootloader (GRUB) which
150 programs to load and the arguments to pass them.
151
152 If you specify an appropriate INSTALL_PREFIX, ``make install`` will copy the
153 binaries to the right place for you, eg ::
154
155     $ make install INSTALL_PREFIX=/tftpboot/barrelfish
156
157 We usually boot Barrelfish via PXE/TFTP, although loading from a local disk
158 also works. Instructions for setting up GRUB to do this are beyond the scope of
159 this document. Assuming you have such a setup, a sample menu.lst can
160 be found in build/x86/menu.lst.x86_64 after executin make qemu_x86_64. It
161 is a basic diskless boot that doesn't do anything useful beyond probing the
162 PCI buses and starting a basic shell.
163
164 There are many other programs you can load (take a look around the usr tree for
165 examples). To start a program on a core other than the BSP core, pass
166 ``core=N`` as its first argument.
167
168 If things work, you should see output on both the VGA console and COM1.
169
170 Generating Documentation
171 --------------------------------
172
173 Barrelfish documentation can be found on Barrelfish website
174 (http://www.barrelfish.org/). And it can be also generated from the code tree.
175 For documentation generation, you will need ``latex`` packages installed,
176 including support for ``pdflatex``.  Following are the instructions for
177 generating the documentation assuming you have already unpacked the sources ::
178
179     $ mkdir build && cd build
180     $ ../hake/hake.sh -s ../
181     $ make docs
182
183 You will find all the technotes in ``docs/`` directory.
184
185 Known Issues
186 --------------------------------
187
188 There are many. Those you're likely to encounter include:
189
190  * The documentation is incomplete and out of date.
191  * Some drivers and user programs are known not to build, and are
192    not included in the default set of targets (MODULES) in the Makefile.
193
194 Likely FAQs
195 --------------------------------
196
197 Q: How do I run a program?
198 A: Add it to the boot sequence by specifying the module in your menu.lst file.
199    For example, to run the memtest program, add the line:
200        module /PATH/x86_64/sbin/memtest
201    to the end of menu.lst, where PATH is relative either to your TFTP
202    server's root directory (when booting on hardware) or to your build
203    directory (when using a simulator such as QEMU).
204    If memtest runs, you should see it output "memtest passed successfully!".
205
206 Q: How do develop a program?
207 A: Check out Technote 18, Practical Guide. Either on barrelfish.org or
208    in the generated technotes (see Generating Documentation)
209
210
211 Q: Where's the CPU driver?
212 A: It's in the directory named kernel :) But don't worry, it really does run
213    independently on each core.
214
215 Q: Where is the source for the SPLASH2 benchmarks? It seems to be missing.
216 A: The license for these prevents redistribution, so we were forced to ship our
217    changes as a patch. See usr/splash2/README for further instructions.
218
219 Q: Can I use a debugger?
220 A: Maybe. There are two options at the moment:
221     * On a simulator, using whatever debug interfaces it supports.
222       For QEMU, you could try the "debugsim" target.
223     * On hardware, using the kernel-mode remote GDB stubs that operate on the
224       primary serial port and are entered in response to a kernel trap or
225       exception. However, these are not well maintained, and may not be usable
226       beyond reading/writing memory locations and inspecting the stack.
227    When debugging the kernel, beware that it is relocated to an address
228    determined at core boot time. Look for output such as:
229    "Kernel starting at address 0xffffffffc072b000".
230
231 Q: Where can I find more information, including papers and new releases?
232 A: http://www.barrelfish.org/
233    http://wiki.barrelfish.org/
234
235 Q: Can I contribute?
236 A: We'd certainly like to hear from you. Feel free to send patches (or even
237    git merge requests) to the Barrelfish mailing list.
238
239    To keep track of contributions to Barrelfish, we use a sign-off procedure
240    similar to the Linux kernel:
241
242    The sign-off is a simple line at the end of the explanation for the patch,
243    which certifies that you wrote it or otherwise have the right to pass it on
244    as an open-source patch.  The rules are pretty simple: if you can certify
245    the below:
246
247         Developer's Certificate of Origin 1.1
248
249         By making a contribution to this project, I certify that:
250
251         (a) The contribution was created in whole or in part by me and I
252             have the right to submit it under the open source license
253             indicated in the file; or
254
255         (b) The contribution is based upon previous work that, to the best
256             of my knowledge, is covered under an appropriate open source
257             license and I have the right under that license to submit that
258             work with modifications, whether created in whole or in part
259             by me, under the same open source license (unless I am
260             permitted to submit under a different license), as indicated
261             in the file; or
262
263         (c) The contribution was provided directly to me by some other
264             person who certified (a), (b) or (c) and I have not modified
265             it.
266
267         (d) I understand and agree that this project and the contribution
268             are public and that a record of the contribution (including all
269             personal information I submit with it, including my sign-off) is
270             maintained indefinitely and may be redistributed consistent with
271             this project or the open source license(s) involved.
272
273    then you just add a line saying
274
275         Signed-off-by: Random J Developer <random@developer.example.org>
276
277    Note that git has support for adding such a message in the end of the commit
278    log message.