Newer
Older
Additional libraries/packages/tools needed for Fail*:
libprotobuf-dev
libpthread
libpcl1-dev
libboost-dev
libboost-all-dev (or at least libboost-thread-dev)
protobuf-compiler
cmake
cmake-curses-gui
(AspectC++ 1.1 or newer is known to work and can be obtained from
http://www.aspectc.org ; nightlies can be downloaded from
http://akut.aspectc.org)
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
For distribution/parallelization:
rsync
tmux
32-bit FailBochs on x86_64 Linux machines:
libc6-i386
+ all libraries listed by "ldd bochs|awk '{print $3}'" in ~/bochslibs
(client.sh will add these to LD_LIBRARY_PATH)
===========
Build steps
===========
Build Fail*
===========
For the first time
------------------
cd failbochs/
> (optional) Cleanup previous cmake remnants
find -name CMakeCache.txt | xargs rm
> Create out of source build directory
mkdir build
> Enter out-of-source build directory
> All generated files end up there.
cd build
>> Generate cmake environment.
cmake ..
>> Setup build configuration
> Select BUILD_BOCHS or BUILD_OVP
> Select an experiment to enable by naming its experiments/ subdirectory under
> EXPERIMENTS_ACTIVATED
> Configure Fail* features you need for this experiment by enabling CONFIG_*
> options.
> Press 'c', 'g' to regenerate the build system
> (alternatively use "cmake-gui ." for a Qt GUI)
ccmake .
> Additionally make sure Bochs is at least configured (see below).
After changes to Fail* code
---------------------------
> Prerequisite, if you're building with Bochs: configure Bochs (see below).
>
> Compile (optionally add -jN for parallel building)
make
> cmake will build all Fail* libraries, merge them into a libfail.a and put it
> into failbochs/fail. (as the current Bochs Makefile expects it there..)
> You may use scripts/rebuild-bochs.sh to speed up repetitive tasks regarding
> Fail/Bochs builds. This script contains a concise documentation on itself.
Doxygen documentation
---------------------
make doc
firefox core/doc/html/index.html
Debug build
-----------
> Choose "Debug" as the build type:
ccmake .
Add new (fail*) sources to build chain
--------------------------------------
To add new files to the build, see CMakeLists.txt in fail/core, and probably
consultate the CMake docs: http://cmake.org/cmake/help/documentation.html
Add new user-defined experiment/campaign
----------------------------------------
Look at experiments/coolchecksum/ as a template. After creating a new
subdirectory in experiments/, activate it in the cmake configuration step (see
above).
Build Bochs
===========
For the first time
------------------

Martin Unzner
committed
cd ../simulators/bochs

Martin Unzner
committed
> Sufficient:
./configure --prefix=$(echo ~/localroot/usr) --enable-{cpu-level=6,ne2000,trace-cache,gdb-stub} --disable-docbook
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
./configure --prefix=$(echo ~/localroot/usr) --enable-{a20-pin,x86-64,cpu-level=6,ne2000,acpi,pci,usb,repeat-speedups,trace-cache,fast-function-calls,host-specific-asms,disasm,all-optimizations,readline,clgd54xx,fpu,vmx=2,monitor-mwait,cdrom,sb16=linux,gdb-stub} --disable-docbook --with-all-libs
> Instead of --with-all-libs, you could use --with-nogui for "headless"
> experiments, additionally removing lots of library dependencies (thus
> reducing startup overhead). --with-x11 enables only the "x" (X11), --with-wx
> only the "wx" (wxWidgets) GUI. Note that "wx" does not play well together
> with Fail*'s "restore" feature (FailBochs will fall back to "x" if available,
> or die trying.)
>
> Once you know everything works as it should, you may want to add the
> following flags before running larger campaigns:
> --disable-logging --disable-assert-checks
>
> FIXME remove more redundant flags/libraries
After changes to Bochs code or Bochs-affecting aspects
------------------------------------------------------
> The make call from the make-ag++.sh is now invokable by calling (still in
> your build dir, optionally adding -jN for parallel building):
cd ../build
make bochs
> The former make all-clean is now invokable by
make bochsallclean
> For installing the bochs executable (former make install)
make bochsinstall
> (see >make help< for a target listing.)
> You may use scripts/rebuild-bochs.sh to speed up repetitive tasks regarding
> Fail/Bochs builds. This script contains a concise documentation on itself.
Debug build
-----------
> Configure Bochs to use debugging-related compiler flags:
cd ../bochs

Martin Unzner
committed
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix=... ... (see above)
Profiling-based optimization build
----------------------------------
> FIXME: ag++ needs to be run with --keep_woven
> Configure Bochs to use compiler flags to enable profiling:
cd ../bochs

Martin Unzner
committed
CFLAGS="-fprofile-generate" CXXFLAGS="-fprofile-generate" LDFLAGS="-fprofile-generate" ./configure --prefix=... ... (see above)
> Build Bochs normally, and run it.
> Configure Bochs to use compiler flags to enable optimizations based on profiling results:

Martin Unzner
committed
CFLAGS="-fprofile-use -Wcoverage-mismatch" CXXFLAGS="-fprofile-use -Wcoverage-mismatch" LDFLAGS="-fprofile-use" ./configure --prefix=... ... (see above)
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
Benchmarking
------------
> Simple instructions/second measurement:
> - configure Bochs with --enable-show-ips (see above)
> - bochsrc: print_timestamps: enabled=1
> Comparison IPS numbers are shown in the default bochsrc.
> Headless bochsrc configuration, all aspects disabled, guest system executes
> endless loop, host CPU Xeon X5470 (3.33GHz): IPS: 66124283 average = 66964789
Steps to run a boot image in FailBochs:
---------------------------------------
Follow the Bochs documentation, and start your own "bochsrc" configuration file based on the
$PREFIX/share/doc/bochs/bochsrc-sample.txt template (or
/usr/share/doc/bochs/examples/bochsrc.gz on Debian systems with Bochs
installed).
- Add your floppy/cdrom/hdd image in the floppya/ata0-master/ata0-slave
sections; configure the boot: section appropriately.
- Comment out com1 and parport1.
- For "headless" experiments:
config_interface: textconfig
display_library: nogui
- For an X11 GUI:
config_interface: textconfig
display_library: x
- For a wxWidgets GUI (does not play well with Fail*'s "restore" feature):
config_interface: wx
display_library: wx
- Reduce the guest system's RAM to a minimum to reduce FailBochs's memory
footprint and save/restore overhead, e.g.:
memory: guest=16, host=16
- If you want to redirect FailBochs's output to a file using the shell's
redirection operator '>', make sure /dev/stdout is not used as a target
file for logging. (The Debian bochsrc template unfortunately does this in
two places. It suffices to comment out these entries.)
- To make FailBochs terminate if something unexpected happens in a larger
campaign, be sure it doesn't "ask" in these cases, e.g.:
panic: action=fatal
error: action=fatal
info: action=ignore
debug: action=ignore
pass: action=ignore
- If you need a quick-and-dirty way to pass data from the guest system to the
outside world, and you don't want to write an experiment utilizing
GuestEvents, you can use the "port e9 hack" that prints all outb's to port
0xe9 to the console:
port_e9_hack: enabled=1
- Determinism: (Fail)Bochs is deterministic regarding timer interrupts,
i.e., two experiment runs after calling simulator.restore() will count the
same number of instructions between two interrupts. Though, you need to be
careful when running (Fail)Bochs with a GUI enabled: Typing "bochs -q<return>"
on the command line may lead to the GUI window receiving a "return key
released" event, resulting in a keyboard interrupt for the guest system.
This can be avoided by starting Bochs with "sleep 1; bochs -q", or
disabling the GUI (see "headless experiments" above).
Build OVP for Cortex-M3
=======================
For the first time
------------------
> Get a license from ovpworld.org
> Download:
> - Downloads -> Main OVP Download including OVPsim Simulator
> - Downloads -> ARM -> ARM OVP Cortex-M Profile Model
> - -> Self contained ARM Cortex-M examples
> - -> ARM GNU GCC and GDB tools
> Install OVP by running the self-extracting archives.
>
> Get Sourcery CodeBench Lite Edition from
> http://www.mentor.com/embedded-software/codesourcery
> - ARM processors -> EABI release
> Install the self-extracting archive, or use the installation in
> /fs/proj/compiler/codesourcery-arm-eabi (DO, ios/kos)
>
> TODO source setup.sh, setupImperas ...
> TODO hard-coded paths
=====================================
Example experiments and code snippets
=====================================
hscsimple
---------
A simple standalone experiment (without a separate campaign).
1. Add "hscsimple" to ccmake's EXPERIMENTS_ACTIVATED.
2. Enable CONFIG_EVENT_BREAKPOINTS, CONFIG_SR_RESTORE and CONFIG_SR_SAVE.
3. Build Fail* and Bochs as described.
4. Enter experiment_targets/hscsimple/, bunzip2 -k *.bz2
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
5. Run "bochs -q". After successfully booting the eCos/hello world example,
the console shows "[HSC] breakpoint reached, saving", and a hello.state/
subdirectory appears.
- You probably need to adjust the bochsrc's paths to romimage/vgaromimage.
These by default point to the locations installed by the Debian packages
"bochsbios" and "vgabios"; for example, you alternatively may use the
BIOSes supplied in fail/bochs/bios/.
6. Compile the experiment's second step: edit
fail/core/experiments/hscsimple/experiment.cc, and change the first "#if 1"
into "#if 0". Make an incremental build, e.g., by running
"fail/scripts/rebuild-bochs.sh -".
7. Back to experiment_targets/hscsimple/, run "bochs -q". After restoring the
state, the hello world program's calculation should yield a different
result.
coolchecksum
------------
An example for separate campaign/experiment implementations.
1. Run step #1 (and if you're curious how COOL_ECC_NUMINSTR in
experimentInfo.hpp was figured out, then step #2) of the experiment
(analogous to what needed to be done in case of the hscsimple experiment,
see above). The experiment's target guest system can be found under
experiment_targets/coolchecksum/.
(If you want to enable COOL_FAULTSPACE_PRUNING, step #2 is mandatory because
it generates the instruction/memory access trace needed for pruning.)
2. Build the campaign server: make coolchecksum-server
3. Run the campaign server: bin/coolchecksum-server
4. In another terminal, run step #3 of the experiment ("bochs -q").
Step #3 of the experiment currently runs 2000 experiment iterations and then
terminates, because Bochs has some memory leak issues. You need to re-run
Bochs for the next 2k experiments.
The experiments can be significantly sped up by a) parallelization (run more
FailBochs clients; TODO document fail/scripts/* stuff) and b) a headless (and
more optimized) FailBochs configuration (see above).
MHTestCampaign
--------------
An example for separate campaign/experiment implementations.
1. execute Campaign (job server):
<your_build_dir>/bin/MHTestCampaign-server
2. run the FailBochs instance, in properly defined environment:
bochs
Dwarf example (tests/dwarf.cc)
------------------------------
Dependencies:
LibDwarf: (debian/ubuntu package: libdwarf-dev)
LibElf: (debian/ubuntu package: libelf-dev)
Build with cmake:
cd {your-out-of-source-dir}
cmake {path to fail dir}
-> cmake checks if libelf and libdwarf are present
make dwarf
./tests/dwarf main.elf
===============
Parallelization
===============
FIXME more details
Shell scripts supporting experiment distribution/parallelization
----------------------------------------------------------------
These can be found in fail/scripts/ (for now have a look at the script files
themselves, they contain some documentation):
- fail-env.sh -- Environment variables for distribution/parallelization host
lists etc.; don't modify in-place but edit your own copy!
- distribute-experiment.sh -- Distribute necessary FailBochs ingredients to
experiment hosts
- runcampaign.sh -- Locally run a campaign server, and a large amount of
clients on the experiment hosts
- multiple-clients.sh -- Is run on an experiment host by runcampaign.sh,
starts several instances of client.sh in a tmux session
- client.sh -- (Repeatedly) runs a single FailBochs instance
Some useful things to note:
---------------------------
- Using the distribute-experiment.sh script causes the local bochs binary to
be copied to the hosts. If the binary is not present in the current directory
the default bochs binary (-> which bochs) will be used. If you have modified
some of your experiment code (id est, your bochs binary will change), don't
forget to delete the local bochs binary in order to distribute the *new* binary.
- The runcampaign.sh script prints some status information about the clients
recently started. In addition, there will be a few error messages concerning
ssh, tmux and so on. They can be ignored for now.
- The runcampaign.sh script starts the coolchecksum-server. Note that the server
instance will terminate immediatly (without notice), if there is still an
existing coolcampaign.csv file.