Adding some documentation
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1962 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
16
src/experiments/l4-sys/Listener.cc.patch
Normal file
16
src/experiments/l4-sys/Listener.cc.patch
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
62c62
|
||||||
|
< if (m_Data.getAddressSpace() == ANY_ADDR || m_Data.getAddressSpace() == address_space)
|
||||||
|
---
|
||||||
|
> if (m_Data.getAddressSpace() == ANY_ADDR || m_Data.getAddressSpace() == address_space) {
|
||||||
|
63a64
|
||||||
|
> }
|
||||||
|
86c87,91
|
||||||
|
< if (m_WatchInstrPtr == ANY_ADDR || m_WatchInstrPtr == pEv->getTriggerInstructionPointer())
|
||||||
|
---
|
||||||
|
> if (m_WatchInstrPtr == ANY_ADDR || m_WatchInstrPtr == pEv->getTriggerInstructionPointer()) {
|
||||||
|
> address_t address_space = pEv->getAddressSpace();
|
||||||
|
> if (address_space) {
|
||||||
|
> fprintf(stderr, "Got a match; address space: 0x%x\n", address_space);
|
||||||
|
> }
|
||||||
|
87a93
|
||||||
|
> }
|
||||||
23
src/experiments/l4-sys/experiment.cc.patch
Normal file
23
src/experiments/l4-sys/experiment.cc.patch
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
195c195
|
||||||
|
< BPSingleListener bp(0, L4SYS_ADDRESS_SPACE);
|
||||||
|
---
|
||||||
|
> BPSingleListener bp(0, ANY_ADDR);
|
||||||
|
202,209c202,210
|
||||||
|
< bp.setWatchInstructionPointer(L4SYS_FUNC_ENTRY);
|
||||||
|
< simulator.addListenerAndResume(&bp);
|
||||||
|
<
|
||||||
|
< log << "test function entry reached, saving state" << endl;
|
||||||
|
< log << "EIP = " << hex << bp.getTriggerInstructionPointer() << " or "
|
||||||
|
< << simulator.getRegisterManager().getInstructionPointer()
|
||||||
|
< << endl;
|
||||||
|
< simulator.save(L4SYS_STATE_FOLDER);
|
||||||
|
---
|
||||||
|
> for (int i = 0; i < 500; i++) {
|
||||||
|
> bp.setWatchInstructionPointer(L4SYS_FUNC_ENTRY);
|
||||||
|
> simulator.addListenerAndResume(&bp);
|
||||||
|
> log << "test function entry reached" << endl;
|
||||||
|
> log << "EIP = " << hex << bp.getTriggerInstructionPointer() << " or "
|
||||||
|
> << simulator.getRegisterManager().getInstructionPointer()
|
||||||
|
> << endl;
|
||||||
|
> simulator.removeListener(&bp);
|
||||||
|
> }
|
||||||
BIN
src/experiments/l4-sys/manual.pdf
Normal file
BIN
src/experiments/l4-sys/manual.pdf
Normal file
Binary file not shown.
216
src/experiments/l4-sys/manual.tex
Normal file
216
src/experiments/l4-sys/manual.tex
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
\documentclass[a4paper,10pt]{article}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{hyphenat}
|
||||||
|
\tolerance 2414
|
||||||
|
\hbadness 2414
|
||||||
|
\emergencystretch 1.5em
|
||||||
|
\hfuzz 0.3pt
|
||||||
|
\widowpenalty=10000 % Hurenkinder
|
||||||
|
\clubpenalty=10000 % Schusterjungen
|
||||||
|
\vfuzz \hfuzz
|
||||||
|
\raggedbottom
|
||||||
|
\usepackage{hyperref}
|
||||||
|
|
||||||
|
%opening
|
||||||
|
\title{L4Sys User Manual}
|
||||||
|
\author{Martin Unzner (\href{mailto:munzner@os.inf.tu-dresden.de}{munzner@os.inf.tu-dresden.de})}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\begin{abstract}
|
||||||
|
This document describes how to use the L4Sys experiment suite.
|
||||||
|
However, this is not a complete documentation. When in doubt,
|
||||||
|
please read the source code or contact me. Still, I would like
|
||||||
|
you to read this whole document before investigating further.
|
||||||
|
\end{abstract}
|
||||||
|
|
||||||
|
This is the user manual on the L4Sys generic system test framework.
|
||||||
|
It provides four experiment types: GPRFlip to simulate a bit flip
|
||||||
|
in a general purpose register, RATFlip to simulate a wrong association
|
||||||
|
in the register allocation table, IDCFLip to corrupt a specific instruction
|
||||||
|
and ALUInstrFlip to modify the behaviour of the arithmetic logic unit,
|
||||||
|
so that it performs a different calculation using the same parameters.
|
||||||
|
|
||||||
|
\section{Emulator Setup}
|
||||||
|
|
||||||
|
These experiments work with Bochs only. This is partly due to some
|
||||||
|
issues with timing --- as soon as a valid model of
|
||||||
|
time in the target emulator as well as an assembler/disassembler
|
||||||
|
functionality in the Fail* framework are established, I would recommend a
|
||||||
|
backend change, as Bochs' reliability is very limited.
|
||||||
|
|
||||||
|
To setup your system, first, you need a dedicated \texttt{bochsrc} file.
|
||||||
|
It has proven handy to have
|
||||||
|
a Bochs resource file or an independent Bochs instance with GUI enabled
|
||||||
|
for the initial testing, however the experiments are intended to be
|
||||||
|
conducted without graphical output.
|
||||||
|
|
||||||
|
\section{Client Setup}
|
||||||
|
|
||||||
|
All parameters of the L4Sys experiment client can be found
|
||||||
|
in the file \texttt{experimentInfo.hpp}. Normally, it should
|
||||||
|
not be necessary to change the program flow directly, however,
|
||||||
|
if something bothers you, you are always free to take a look
|
||||||
|
at \texttt{experiment.cc}, too.
|
||||||
|
|
||||||
|
\subsection{Constants}
|
||||||
|
|
||||||
|
Some values are constant throughout all steps of the preparation
|
||||||
|
and also when the workload program is run.
|
||||||
|
The most important constant is \verb+L4SYS_BOCHS_IPS+,
|
||||||
|
which has to be consistent with your \texttt{bochsrc} setting
|
||||||
|
and is used for several timely calculations in the client.
|
||||||
|
|
||||||
|
\subsection{Step 0: Determine the address space}
|
||||||
|
|
||||||
|
First, you need to find what are the addresses of the
|
||||||
|
start and end instructions of your
|
||||||
|
workload program. Therefore, you should use a
|
||||||
|
disassembler like \emph{objdump} or \emph{IDA Pro} and
|
||||||
|
set \verb+L4SYS_FUNC_ENTRY+ and \verb+L4SYS_FUNC_EXIT+
|
||||||
|
accordingly. \verb+L4SYS_NUMINSTR+
|
||||||
|
is determined automatically in a later preparation step and
|
||||||
|
can be ignored for now.
|
||||||
|
|
||||||
|
To test instructions that are run only in a specific address space,
|
||||||
|
L4Sys uses the address space filtering mechanism of Fail*.
|
||||||
|
If your fault injection campaign is not limited to a specific address space,
|
||||||
|
you may set \verb+L4SYS_ADDRESS_SPACE+ to \verb+ANY_ADDR+. Keep in mind that in
|
||||||
|
that case, your instruction addresses must be unique among all those
|
||||||
|
executed in the system, which in general is not the case.
|
||||||
|
|
||||||
|
Basically, there are two ways to find out the identifier of a certain
|
||||||
|
address space in Fail*: You can look up the value in
|
||||||
|
the emulator using a debugger. In the case of Bochs, you may want to
|
||||||
|
study
|
||||||
|
\href{http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html}{this page},
|
||||||
|
and, according to its instructions,
|
||||||
|
dump the content of the CR3 control register at the
|
||||||
|
beginning of your program.
|
||||||
|
|
||||||
|
You can also utilise the Fail* framework, which is easier and more reliable,
|
||||||
|
but as there is no real reason to include this ``feature'' in the framework,
|
||||||
|
in order to do so, you need to patch it. Namely,
|
||||||
|
\texttt{src/core/sal/Listener.cc} and
|
||||||
|
\texttt{src/experiments/l4-sys/experiment.cc}
|
||||||
|
need to be modified using the two patch files supplied alongside with this
|
||||||
|
manual in the current directory.
|
||||||
|
You should check the patch files for their release date and content:
|
||||||
|
In case the framework's
|
||||||
|
event handling structure has changed, the line numbers in
|
||||||
|
\texttt{Listener.cc} are incorrect,
|
||||||
|
and you need to apply the patch manually.
|
||||||
|
|
||||||
|
As soon as you have applied the patch, set \verb+PREPARATION_STEP+
|
||||||
|
to \texttt{1} in \texttt{experimentInfo.hpp} and recompile the framework.
|
||||||
|
Now start the experiment client (\texttt{fail-client}) in your
|
||||||
|
emulator directory, and
|
||||||
|
it will show you which address space is active whenever a
|
||||||
|
breakpoint triggers.
|
||||||
|
Ideally, you still have a graphical interface enabled to
|
||||||
|
monitor your system's progress and check if the breakpoints
|
||||||
|
are triggered at the right points in time.
|
||||||
|
|
||||||
|
When your program has reached the function entry point,
|
||||||
|
note the address space and exit the program simply by pressing Ctrl+C.
|
||||||
|
|
||||||
|
\subsection{Step 1: Save the initial state of the machine}
|
||||||
|
|
||||||
|
If you have modified the Fail* framework in Step 0,
|
||||||
|
you should now restore the original framework
|
||||||
|
data using \texttt{svn revert}.
|
||||||
|
|
||||||
|
Make sure \verb+PREPARATION_STEP+ is still set to \texttt{1}, and
|
||||||
|
you have set \verb+L4SYS_ADDRESS_SPACE+ accordingly.
|
||||||
|
Now recompile and execute the framework code again, this time with the graphical
|
||||||
|
user interface disabled. The experiment client runs until
|
||||||
|
\verb+L4SYS_FUNC_ENTRY+ is reached and then saves
|
||||||
|
the complete configuration.
|
||||||
|
|
||||||
|
\subsection{Step 2: Determine the instructions to execute}
|
||||||
|
|
||||||
|
For this part, it depends on how you want to conduct the injection
|
||||||
|
experiments. Setting \verb+L4SYS_FILTER_INSTRUCTIONS+
|
||||||
|
stores all instructions by default, and
|
||||||
|
enables the filter functionality to store only those
|
||||||
|
instructions that match the filter.
|
||||||
|
Each instruction in the trace requires
|
||||||
|
an address plus an unsigned breakpoint counter,
|
||||||
|
which means 8 bytes per instruction on a 32-bit system
|
||||||
|
and 12 bytes per instruction on a 64-bit system.
|
||||||
|
|
||||||
|
If \verb+L4SYS_FILTER_INSTRUCTIONS+ is not set, the instruction
|
||||||
|
to perform the fault injection at is determined by single-stepping
|
||||||
|
through the program from the beginning, which is quite slow.
|
||||||
|
I only recommend it for long programs, where a complete
|
||||||
|
instruction trace would require several hundred megabytes of data.
|
||||||
|
|
||||||
|
No matter which method you choose, the default implementation
|
||||||
|
of the campaign server reads the total instruction count
|
||||||
|
from \verb+L4SYS_NUMINSTR+. Thus, it is mandatory to set this
|
||||||
|
value to the number of instructions available.
|
||||||
|
|
||||||
|
To obtain this number and optionally the instruction trace,
|
||||||
|
set \verb+PREPARATION_STEP+ to \texttt{2} and recompile, then execute
|
||||||
|
the experiment client. You do not have to pass parameters to Bochs
|
||||||
|
any more, because the configuration is overwritten with the
|
||||||
|
state saved in step 1.
|
||||||
|
|
||||||
|
After the program has finished, you will get a summary on the
|
||||||
|
total of instructions executed.
|
||||||
|
|
||||||
|
If you have
|
||||||
|
\verb+L4SYS_FILTER_INSTRUCTIONS+ enabled, this is not the
|
||||||
|
value you look for; it merely claims how many
|
||||||
|
instructions have been processed at all.
|
||||||
|
To set \verb+L4SYS_NUMINSTR+ correctly, you need to look for the
|
||||||
|
number before the word \emph{accepted}, which points out how many
|
||||||
|
instructions have been accepted by the applied filter. Of course,
|
||||||
|
if no filtering is selected, these two figures should be equal.
|
||||||
|
Please contact me if that is not the case.
|
||||||
|
|
||||||
|
If \verb+L4SYS_FILTER_INSTRUCTIONS+ is disabled, you should
|
||||||
|
get a statistical output on how many of the instructions
|
||||||
|
were executed in userland and kernel space, respectively,
|
||||||
|
but the interesting figure in this case is of course the overall
|
||||||
|
sum of executed instructions.
|
||||||
|
|
||||||
|
\subsection{Step 3: Determine the correct output}
|
||||||
|
|
||||||
|
This is the easiest step: Set \verb+PREPARATION_STEP+ to \texttt{3},
|
||||||
|
recompile the client and execute it in the target directory.
|
||||||
|
It runs the complete program and logs the output. You can
|
||||||
|
check the resulting file (by default \texttt{golden.out}),
|
||||||
|
and if it does not comply with your expectations of a valid
|
||||||
|
run, you should correct the entry and exit point, the address space
|
||||||
|
or, in the worst case, your Bochs settings.
|
||||||
|
|
||||||
|
\section{Campaign Setup}
|
||||||
|
|
||||||
|
To setup the actual campaign, you need to edit \texttt{campaign.cc}.
|
||||||
|
The full language capabilities of \texttt{AspectC++} are at your hand to define
|
||||||
|
the course of your experiments; a sample covering all experiment
|
||||||
|
types at random is already provided. In the experiment client,
|
||||||
|
set \verb+PREPARATION_STEP+ to \texttt{0}, which means there is nothing more
|
||||||
|
to prepare.
|
||||||
|
|
||||||
|
After you have successfully compiled both programs, you need to
|
||||||
|
start both the campaign server (\texttt{l4-sys-server})
|
||||||
|
and the experiment client. By default, they should run on the
|
||||||
|
same machine, but you can adapt the \texttt{L4SysExperiment}
|
||||||
|
constructor in \texttt{experiment.cc} to connect the \texttt{JobClient}
|
||||||
|
to a remote server instead of \texttt{localhost}. Each experiment client processes
|
||||||
|
exactly one experiment and exits. To complete your campaign,
|
||||||
|
you should use the \texttt{client.sh} script in the \texttt{scripts}
|
||||||
|
subdirectory of Fail*.
|
||||||
|
|
||||||
|
\section{To Be Continued}
|
||||||
|
|
||||||
|
This is everything I consider important so far. If you still encounter
|
||||||
|
problems you may
|
||||||
|
contact me and I will try to set the record straight.
|
||||||
|
Happy experimenting! :)
|
||||||
|
|
||||||
|
\end{document}
|
||||||
Reference in New Issue
Block a user