globally rename Fail* to FAIL*
Change-Id: Ief2cb687cc69dd92c2e04f9314f0f1347e0a84ed
This commit is contained in:
@ -11,9 +11,9 @@ if(NOT ("${CMAKE_VERSION}" VERSION_LESS 3.0)) # >= 3.0?
|
|||||||
endif()
|
endif()
|
||||||
ENABLE_TESTING()
|
ENABLE_TESTING()
|
||||||
|
|
||||||
PROJECT(Fail*)
|
PROJECT(FAIL*)
|
||||||
|
|
||||||
set(PROJECT_VERSION "1.0.1" CACHE INTERNAL "Fail* version number" FORCE)
|
set(PROJECT_VERSION "1.0.1" CACHE INTERNAL "FAIL* version number" FORCE)
|
||||||
|
|
||||||
#### Put all resulting library files in <your_build_dir>/lib ####
|
#### Put all resulting library files in <your_build_dir>/lib ####
|
||||||
SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
|
SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
|
||||||
@ -49,7 +49,7 @@ OPTION( BUILD_X86 "Build for x86 guests?" ON)
|
|||||||
OPTION( BUILD_ARM "Build for ARM guests?" OFF)
|
OPTION( BUILD_ARM "Build for ARM guests?" OFF)
|
||||||
|
|
||||||
# FIXME: only add simulators/ to include_directories, and include, e.g.,
|
# FIXME: only add simulators/ to include_directories, and include, e.g.,
|
||||||
# bochs/bochs.h in Fail*. -> avoids naming conflicts (e.g., /usr/include/elf.h
|
# bochs/bochs.h in FAIL*. -> avoids naming conflicts (e.g., /usr/include/elf.h
|
||||||
# vs. qemu/elf.h)
|
# vs. qemu/elf.h)
|
||||||
if(BUILD_BOCHS)
|
if(BUILD_BOCHS)
|
||||||
## add necessary additional header search paths.
|
## add necessary additional header search paths.
|
||||||
@ -68,7 +68,7 @@ elseif(BUILD_PANDA)
|
|||||||
include_directories(debuggers/openocd/src debuggers/openocd/jimtcl src/core)
|
include_directories(debuggers/openocd/src debuggers/openocd/jimtcl src/core)
|
||||||
endif(BUILD_BOCHS)
|
endif(BUILD_BOCHS)
|
||||||
|
|
||||||
## Tell the linker where to find the Fail* libraries
|
## Tell the linker where to find the FAIL* libraries
|
||||||
link_directories("${LIBRARY_OUTPUT_PATH}")
|
link_directories("${LIBRARY_OUTPUT_PATH}")
|
||||||
|
|
||||||
# Add "simulators"-directory to the include path. This allows
|
# Add "simulators"-directory to the include path. This allows
|
||||||
|
|||||||
@ -111,7 +111,7 @@ docker instance.
|
|||||||
|
|
||||||
Mailing list
|
Mailing list
|
||||||
------------
|
------------
|
||||||
The Fail* developers, and some of its previous and current users, can be
|
The FAIL* developers, and some of its previous and current users, can be
|
||||||
contacted on the
|
contacted on the
|
||||||
[fail@lists.cs.tu-dortmund.de](mailto:fail@lists.cs.tu-dortmund.de)
|
[fail@lists.cs.tu-dortmund.de](mailto:fail@lists.cs.tu-dortmund.de)
|
||||||
mailing list
|
mailing list
|
||||||
|
|||||||
@ -3,7 +3,7 @@ find_program(LLVMCONFIG NAMES llvm-config-3.4 llvm-config-3.3 llvm-config-3.2 ll
|
|||||||
if( NOT LLVMCONFIG )
|
if( NOT LLVMCONFIG )
|
||||||
message(FATAL_ERROR "llvm-config not found, try installing llvm-dev llvm")
|
message(FATAL_ERROR "llvm-config not found, try installing llvm-dev llvm")
|
||||||
else()
|
else()
|
||||||
message(STATUS "[Fail*] LLVM Disassembler: Found llvm-config @ ${LLVMCONFIG}")
|
message(STATUS "[FAIL*] LLVM Disassembler: Found llvm-config @ ${LLVMCONFIG}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# examine LLVM include directory
|
# examine LLVM include directory
|
||||||
|
|||||||
@ -13,14 +13,14 @@ set(FAIL_DOC_SOURCE "${FAIL_DOC_SOURCE} ${PROJECT_SOURCE_DIR}/src/plugins")
|
|||||||
set(FAIL_DOC_EXCLUDE_PATTERNS "*/util/pstream.h */util/optionparser/optionparser.h")
|
set(FAIL_DOC_EXCLUDE_PATTERNS "*/util/pstream.h */util/optionparser/optionparser.h")
|
||||||
file(MAKE_DIRECTORY ${FAIL_DOC_OUTPUT})
|
file(MAKE_DIRECTORY ${FAIL_DOC_OUTPUT})
|
||||||
# FIXME: The find command does not quote the paths to be processed by doxygen. That
|
# FIXME: The find command does not quote the paths to be processed by doxygen. That
|
||||||
# means, the path to your Fail* directory should not contain any blanks.
|
# means, the path to your FAIL* directory should not contain any blanks.
|
||||||
|
|
||||||
configure_file(${PROJECT_SOURCE_DIR}/cmake/Doxyfile.in
|
configure_file(${PROJECT_SOURCE_DIR}/cmake/Doxyfile.in
|
||||||
${PROJECT_BINARY_DIR}/Doxyfile @ONLY}
|
${PROJECT_BINARY_DIR}/Doxyfile @ONLY}
|
||||||
)
|
)
|
||||||
|
|
||||||
## call make doc to generate documentation
|
## call make doc to generate documentation
|
||||||
set(line0 "[${PROJECT_NAME}] Generating Fail* documentation with Doxygen")
|
set(line0 "[${PROJECT_NAME}] Generating FAIL* documentation with Doxygen")
|
||||||
set(line1 " Directories: ${FAIL_DOC_SOURCE}")
|
set(line1 " Directories: ${FAIL_DOC_SOURCE}")
|
||||||
set(line2 " Excluded patterns: ${FAIL_DOC_EXCLUDE_PATTERNS}")
|
set(line2 " Excluded patterns: ${FAIL_DOC_EXCLUDE_PATTERNS}")
|
||||||
add_custom_target(doc
|
add_custom_target(doc
|
||||||
|
|||||||
@ -85,7 +85,7 @@ if(BUILD_GEM5)
|
|||||||
|
|
||||||
# Cleans up everything (gem5 and Fail related):
|
# Cleans up everything (gem5 and Fail related):
|
||||||
add_custom_target(gem5-allclean
|
add_custom_target(gem5-allclean
|
||||||
COMMAND @echo "Cleaning Fail* and gem5 ..."
|
COMMAND @echo "Cleaning FAIL* and gem5 ..."
|
||||||
COMMAND cd "${PROJECT_BINARY_DIR}/" && make clean
|
COMMAND cd "${PROJECT_BINARY_DIR}/" && make clean
|
||||||
COMMAND cd "${gem5_src_dir}/" && scons -c build/ARM
|
COMMAND cd "${gem5_src_dir}/" && scons -c build/ARM
|
||||||
COMMAND cd "${gem5_src_dir}/" && rm -rf build/
|
COMMAND cd "${gem5_src_dir}/" && rm -rf build/
|
||||||
|
|||||||
@ -45,7 +45,7 @@ if(BUILD_PANDA)
|
|||||||
|
|
||||||
# ensure, elf path is set for enabling openocd to read elf symbols
|
# ensure, elf path is set for enabling openocd to read elf symbols
|
||||||
if(EXISTS $ENV{FAIL_ELF_PATH})
|
if(EXISTS $ENV{FAIL_ELF_PATH})
|
||||||
message(STATUS "[Fail*] PandaBoard ELF under test: $ENV{FAIL_ELF_PATH}")
|
message(STATUS "[FAIL*] PandaBoard ELF under test: $ENV{FAIL_ELF_PATH}")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Please set the FAIL_ELF_PATH environment variable to the binary under test.")
|
message(FATAL_ERROR "Please set the FAIL_ELF_PATH environment variable to the binary under test.")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -326,7 +326,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
init_symbols();
|
init_symbols();
|
||||||
|
|
||||||
LOG << "OpenOCD 0.7.0 for Fail* and Pandaboard initialized" << endl;
|
LOG << "OpenOCD 0.7.0 for FAIL* and Pandaboard initialized" << endl;
|
||||||
|
|
||||||
/* === INITIALIZATION COMPLETE => MAIN LOOP === */
|
/* === INITIALIZATION COMPLETE => MAIN LOOP === */
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
Coding Style for Fail*
|
Coding Style for FAIL*
|
||||||
======================
|
======================
|
||||||
|
|
||||||
You may violate/break any of the following rules if you have a good reason to
|
You may violate/break any of the following rules if you have a good reason to
|
||||||
|
|||||||
@ -4,21 +4,20 @@ Directory structure:
|
|||||||
|
|
||||||
The folders are nested as follow:
|
The folders are nested as follow:
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
fail: Fail* parent directory, containing all source & configuration files (${FAIL_DIR})
|
fail: FAIL* parent directory, containing all source & configuration files (${FAIL_DIR})
|
||||||
|-cmake: CMake-related configuration files (e.g. compiler-flags, dependencies, ...)
|
|-cmake: CMake-related configuration files (e.g. compiler-flags, dependencies, ...)
|
||||||
|-doc: Fail*-Framework documentation (e.g., diagrams, howtos, ...)
|
|-doc: FAIL*-Framework documentation (e.g., diagrams, howtos, ...)
|
||||||
|-deprecated: temporal and old (source) files, which will probably be deleted
|
|-scripts: python/shell scripts for FAIL*-compilation and experiment distribution
|
||||||
|-scripts: python/shell scripts for Fail*-compilation and experiment distribution
|
|-simulators: parent directory of simulators supported by FAIL* (may still be WIP)
|
||||||
|-simulators: parent directory of simulators supported by Fail* (may still be WIP)
|
|
||||||
|-bochs: source files of the (modified) Bochs x86 simulator backend
|
|-bochs: source files of the (modified) Bochs x86 simulator backend
|
||||||
|-gem5: source files of the gem5 simulator backend
|
|-gem5: source files of the gem5 simulator backend
|
||||||
|-debuggers: parent directory of debuggers supported by Fail* (may still be WIP)
|
|-debuggers: parent directory of debuggers supported by FAIL* (may still be WIP)
|
||||||
|-gdb: source files related to the GNU gdb debugger
|
|-gdb: source files related to the GNU gdb debugger
|
||||||
|-t32: source files related to the Lauterbach T32 debugger
|
|-t32: source files related to the Lauterbach T32 debugger
|
||||||
|-src: C/C++/AspectC++ source files related to Fail*, experiments and plugins
|
|-src: C/C++/AspectC++ source files related to FAIL*, experiments and plugins
|
||||||
|-core: core source files forming the Fail* framework
|
|-core: core source files forming the FAIL* framework
|
||||||
|-util: utility classes and miscellaneous helper functions
|
|-util: utility classes and miscellaneous helper functions
|
||||||
|-config: CMake configuration files, defining the Fail* components and variant
|
|-config: CMake configuration files, defining the FAIL* components and variant
|
||||||
|-sal: source file forming the Simulator Abstraction Layer (backend-interface)
|
|-sal: source file forming the Simulator Abstraction Layer (backend-interface)
|
||||||
|-bochs: backend source files of the Bochs simulator
|
|-bochs: backend source files of the Bochs simulator
|
||||||
|-gem5: backend source files of the gem5 simulator
|
|-gem5: backend source files of the gem5 simulator
|
||||||
@ -27,14 +26,14 @@ fail: Fail* parent directory, containing all source & configuration files (${FA
|
|||||||
|-arm: ARM-specific platform source files
|
|-arm: ARM-specific platform source files
|
||||||
|-x86: x86-specific platform source files
|
|-x86: x86-specific platform source files
|
||||||
|-perf: performance-related source files (extensions); speeds up
|
|-perf: performance-related source files (extensions); speeds up
|
||||||
Fail* <-> simulator interaction (e.g., when using breakpoints)
|
FAIL* <-> simulator interaction (e.g., when using breakpoints)
|
||||||
|-cpn: campaign- (and therefore server-)related source files
|
|-cpn: campaign- (and therefore server-)related source files
|
||||||
|-efw: experiment-framework- (and therefore client-)related source files
|
|-efw: experiment-framework- (and therefore client-)related source files
|
||||||
|-comm: communication related source files (these files are used by cpn and efw), incl.
|
|-comm: communication related source files (these files are used by cpn and efw), incl.
|
||||||
protobuf message definitions used for communication purposes
|
protobuf message definitions used for communication purposes
|
||||||
|-experiments: experiment code files (within a new dir) need to be located here
|
|-experiments: experiment code files (within a new dir) need to be located here
|
||||||
|-plugins: plugin code files (within a new dir) need to be located here
|
|-plugins: plugin code files (within a new dir) need to be located here
|
||||||
|-tools: Fail*-related tools, e.g., for tracing or fault-space pruning
|
|-tools: FAIL*-related tools, e.g., for tracing or fault-space pruning
|
||||||
|-[build]: recommended location of your build-tree, generated files will be placed here
|
|-[build]: recommended location of your build-tree, generated files will be placed here
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
=========================================================================================
|
=========================================================================================
|
||||||
Additional libraries/packages/tools needed for Fail*:
|
Additional libraries/packages/tools needed for FAIL*:
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
|
|
||||||
Required for Fail*:
|
Required for FAIL*:
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
- libmysqlclient-dev or libmariadbclient-dev
|
- libmysqlclient-dev or libmariadbclient-dev
|
||||||
- libprotobuf-dev
|
- libprotobuf-dev
|
||||||
@ -79,10 +79,10 @@ For distribution/parallelization:
|
|||||||
it exists.
|
it exists.
|
||||||
|
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
Compiling, building and modifying: Simulators and Fail*
|
Compiling, building and modifying: Simulators and FAIL*
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
|
|
||||||
Building Fail*:
|
Building FAIL*:
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
|
|
||||||
For the first time:
|
For the first time:
|
||||||
@ -101,7 +101,7 @@ For the first time:
|
|||||||
$ ccmake .
|
$ ccmake .
|
||||||
Select "BUILD_BOCHS" or "BUILD_GEM5". Select an experiment to enable by
|
Select "BUILD_BOCHS" or "BUILD_GEM5". Select an experiment to enable by
|
||||||
naming its "experiments/" subdirectory under "EXPERIMENTS_ACTIVATED".
|
naming its "experiments/" subdirectory under "EXPERIMENTS_ACTIVATED".
|
||||||
Configure Fail* features you need for this experiment by enabling
|
Configure FAIL* features you need for this experiment by enabling
|
||||||
"CONFIG_*" options. Press 'c', 'g' to regenerate the build system.
|
"CONFIG_*" options. Press 'c', 'g' to regenerate the build system.
|
||||||
(Alternatively use
|
(Alternatively use
|
||||||
$ cmake-gui .
|
$ cmake-gui .
|
||||||
@ -111,18 +111,18 @@ For the first time:
|
|||||||
for your need.
|
for your need.
|
||||||
|
|
||||||
|
|
||||||
After changes to Fail* code:
|
After changes to FAIL* code:
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
Compile (in ${BUILD_DIR}, optionally "add -jN" for parallel building):
|
Compile (in ${BUILD_DIR}, optionally "add -jN" for parallel building):
|
||||||
$ make
|
$ make
|
||||||
CMake will build all Fail* libraries and link them with the simulator backend
|
CMake will build all FAIL* libraries and link them with the simulator backend
|
||||||
library to a binary called "fail-client". You may use the shell script
|
library to a binary called "fail-client". You may use the shell script
|
||||||
$ ${FAIL_DIR}/scripts/rebuild-bochs.sh [-]
|
$ ${FAIL_DIR}/scripts/rebuild-bochs.sh [-]
|
||||||
to speed up repetitive tasks regarding Fail/Bochs builds. This script contains
|
to speed up repetitive tasks regarding Fail/Bochs builds. This script contains
|
||||||
a concise documentation on itself.
|
a concise documentation on itself.
|
||||||
|
|
||||||
|
|
||||||
Add new Fail* sources to build chain:
|
Add new FAIL* sources to build chain:
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
To add new source files to the build, see CMakeLists.txt in the subdirectory of the
|
To add new source files to the build, see CMakeLists.txt in the subdirectory of the
|
||||||
corresponding component in "${FAIL_DIR}/src/core/", and probably consultate the
|
corresponding component in "${FAIL_DIR}/src/core/", and probably consultate the
|
||||||
@ -136,7 +136,7 @@ new subdirectory in "experiments/", activate it in the CMake configuration step
|
|||||||
above).
|
above).
|
||||||
|
|
||||||
|
|
||||||
Generating the Doxygen documentation for Fail*:
|
Generating the Doxygen documentation for FAIL*:
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
To generate the Doxygen documentation, type:
|
To generate the Doxygen documentation, type:
|
||||||
$ make doc
|
$ make doc
|
||||||
@ -151,7 +151,7 @@ to be compiled previously:
|
|||||||
FailBochs: Bochs configuration features
|
FailBochs: Bochs configuration features
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
|
|
||||||
The autotools-based bochs is configured within the Fail* build run.
|
The autotools-based bochs is configured within the FAIL* build run.
|
||||||
The configuration flags can be set within the ccmake configuration (ccmake ${FAIL_DIR}/build)
|
The configuration flags can be set within the ccmake configuration (ccmake ${FAIL_DIR}/build)
|
||||||
- Sufficient:
|
- Sufficient:
|
||||||
--enable-cpu-level=6;--enable-ne2000;--enable-trace-cache;--enable-gdb-stub;--disable-docbook;--with-nogui
|
--enable-cpu-level=6;--enable-ne2000;--enable-trace-cache;--enable-gdb-stub;--disable-docbook;--with-nogui
|
||||||
@ -160,7 +160,7 @@ FailBochs: Bochs configuration features
|
|||||||
The --with-nogui flag suffices for for "headless" experiments, with the
|
The --with-nogui flag suffices for for "headless" experiments, with the
|
||||||
advantage of removing lots of library dependencies (thus reducing startup
|
advantage of removing lots of library dependencies (thus reducing startup
|
||||||
overhead). --with-x11 enables only the "x" (X11), --with-wx only the "wx"
|
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
|
(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
|
"restore" feature (FailBochs will fall back to "x" if available, or die
|
||||||
trying.)
|
trying.)
|
||||||
Once you know everything works as it should, you may want to add the
|
Once you know everything works as it should, you may want to add the
|
||||||
@ -189,7 +189,7 @@ Debug build:
|
|||||||
Configure Bochs to use debugging-related compiler flags (expects to be in ${BUILD_DIR}):
|
Configure Bochs to use debugging-related compiler flags (expects to be in ${BUILD_DIR}):
|
||||||
$ cd ../simulator/bochs
|
$ cd ../simulator/bochs
|
||||||
$ CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix=... ... (see above)
|
$ CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix=... ... (see above)
|
||||||
You might additionally want to configure the rest of Fail* into debug mode by
|
You might additionally want to configure the rest of FAIL* into debug mode by
|
||||||
setting CMAKE_BUILD_TYPE to "Debug" (ccmake, see above).
|
setting CMAKE_BUILD_TYPE to "Debug" (ccmake, see above).
|
||||||
FIXME: Does this still work?
|
FIXME: Does this still work?
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ Building gem5:
|
|||||||
|
|
||||||
For the first time (incl. selecting an experiment):
|
For the first time (incl. selecting an experiment):
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
1. Change to the Fail* directory (expects to be in ${FAIL_DIR}) and
|
1. Change to the FAIL* directory (expects to be in ${FAIL_DIR}) and
|
||||||
create a new build directory.
|
create a new build directory.
|
||||||
$ cd ${FAIL_DIR}; mkdir build; cd build
|
$ cd ${FAIL_DIR}; mkdir build; cd build
|
||||||
3. Start the configuration by typing
|
3. Start the configuration by typing
|
||||||
@ -233,7 +233,7 @@ For the first time (incl. selecting an experiment):
|
|||||||
BUILD_BOCHS and BUILD_X86.
|
BUILD_BOCHS and BUILD_X86.
|
||||||
5. Typing
|
5. Typing
|
||||||
$ make (or nice make -jN)
|
$ make (or nice make -jN)
|
||||||
will start the build process of Fail* and gem5. This automatically
|
will start the build process of FAIL* and gem5. This automatically
|
||||||
builds the debug variant for ARM targets. (Note that this build will
|
builds the debug variant for ARM targets. (Note that this build will
|
||||||
automatically include the ${FAIL_DIR}/src/core/sal/gem5 as an
|
automatically include the ${FAIL_DIR}/src/core/sal/gem5 as an
|
||||||
"EXTRAS" feature, see gem5/scons build system documentation for
|
"EXTRAS" feature, see gem5/scons build system documentation for
|
||||||
@ -248,13 +248,13 @@ For the first time (incl. selecting an experiment):
|
|||||||
NOTE: gem5 currently does not compile with the newer clang-based daily builds
|
NOTE: gem5 currently does not compile with the newer clang-based daily builds
|
||||||
of AspectC++ (ac++). You may need to use the ac++ 1.2 release instead.
|
of AspectC++ (ac++). You may need to use the ac++ 1.2 release instead.
|
||||||
|
|
||||||
After changes to Fail*/gem5 code (incl. aspect headers):
|
After changes to FAIL*/gem5 code (incl. aspect headers):
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
1. Clean the current build by typing
|
1. Clean the current build by typing
|
||||||
$ make gem5-allclean
|
$ make gem5-allclean
|
||||||
(in your build dir ${FAIL_DIR}/build). This cleans the current
|
(in your build dir ${FAIL_DIR}/build). This cleans the current
|
||||||
Fail* and gem5 build directories. Note that "make clean" only cleans
|
FAIL* and gem5 build directories. Note that "make clean" only cleans
|
||||||
the Fail* build directory. Furthermore, all remaining CMake remnants
|
the FAIL* build directory. Furthermore, all remaining CMake remnants
|
||||||
should be deleted:
|
should be deleted:
|
||||||
$ find -name CMakeCache.txt | xargs rm
|
$ find -name CMakeCache.txt | xargs rm
|
||||||
2. Rebuild by typing
|
2. Rebuild by typing
|
||||||
@ -290,7 +290,7 @@ Database backend setup: MySQL / MariaDB
|
|||||||
Building LLVM from sources
|
Building LLVM from sources
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
If your Linux distribution does not provide a library package for LLVM 3.3 or
|
If your Linux distribution does not provide a library package for LLVM 3.3 or
|
||||||
newer, and you need LLVM support in Fail*, you may need to build LLVM from the
|
newer, and you need LLVM support in FAIL*, you may need to build LLVM from the
|
||||||
sources and install it, e.g., locally in your home.
|
sources and install it, e.g., locally in your home.
|
||||||
|
|
||||||
1. Download the source tarball of LLVM 3.4 from http://llvm.org (or use the git
|
1. Download the source tarball of LLVM 3.4 from http://llvm.org (or use the git
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
=========================================================================================
|
=========================================================================================
|
||||||
Steps to run a boot image in Fail* using the Bochs simulator backend:
|
Steps to run a boot image in FAIL* using the Bochs simulator backend:
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
Follow the Bochs documentation, and start your own "bochsrc" configuration file
|
Follow the Bochs documentation, and start your own "bochsrc" configuration file
|
||||||
based on the "${PREFIX}/share/doc/bochs/bochsrc-sample.txt" template (or
|
based on the "${PREFIX}/share/doc/bochs/bochsrc-sample.txt" template (or
|
||||||
@ -15,17 +15,17 @@ based on the "${PREFIX}/share/doc/bochs/bochsrc-sample.txt" template (or
|
|||||||
- For an X11 GUI:
|
- For an X11 GUI:
|
||||||
config_interface: textconfig
|
config_interface: textconfig
|
||||||
display_library: x
|
display_library: x
|
||||||
- For a wxWidgets GUI (does not play well with Fail*'s "restore" feature):
|
- For a wxWidgets GUI (does not play well with FAIL*'s "restore" feature):
|
||||||
config_interface: wx
|
config_interface: wx
|
||||||
display_library: wx
|
display_library: wx
|
||||||
- Reduce the guest system's RAM to a minimum to reduce Fail*'s memory footprint
|
- Reduce the guest system's RAM to a minimum to reduce FAIL*'s memory footprint
|
||||||
and save/restore overhead, e.g.:
|
and save/restore overhead, e.g.:
|
||||||
memory: guest=16, host=16
|
memory: guest=16, host=16
|
||||||
- If you want to redirect FailBochs's output to a file using the shell's
|
- 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
|
redirection operator '>', make sure "/dev/stdout" is not used as a target
|
||||||
file for logging. (The Debian "bochsrc" template unfortunately does this
|
file for logging. (The Debian "bochsrc" template unfortunately does this
|
||||||
in two places. It suffices to comment out these entries.)
|
in two places. It suffices to comment out these entries.)
|
||||||
- To make Fail* terminate if something unexpected happens in a larger
|
- To make FAIL* terminate if something unexpected happens in a larger
|
||||||
campaign, be sure it doesn't "ask" in these cases, e.g.:
|
campaign, be sure it doesn't "ask" in these cases, e.g.:
|
||||||
panic: action=fatal
|
panic: action=fatal
|
||||||
error: action=fatal
|
error: action=fatal
|
||||||
@ -63,7 +63,7 @@ An example of a DatabaseCampaign with separate experiment.
|
|||||||
CONFIG_EVENT_MEMWRITE, CONFIG_EVENT_TRAP, CONFIG_SR_RESTORE and CONFIG_SR_SAVE
|
CONFIG_EVENT_MEMWRITE, CONFIG_EVENT_TRAP, CONFIG_SR_RESTORE and CONFIG_SR_SAVE
|
||||||
The options BUILD_BOCHS, BUILD_X86 are needed as well, but are defaults.
|
The options BUILD_BOCHS, BUILD_X86 are needed as well, but are defaults.
|
||||||
3. In weather-monitor/experimentInfo.hpp set "PREREQUISITES" to 1 and build
|
3. In weather-monitor/experimentInfo.hpp set "PREREQUISITES" to 1 and build
|
||||||
Fail*/Bochs using e.g. fail/scripts/rebuild-bochs.sh (-> how-to-build.txt).
|
FAIL*/Bochs using e.g. fail/scripts/rebuild-bochs.sh (-> how-to-build.txt).
|
||||||
Upon minor changes (i.e. not e.g. to aspects), append " -" to the call to
|
Upon minor changes (i.e. not e.g. to aspects), append " -" to the call to
|
||||||
the script. This will rebuild only parts that changed.
|
the script. This will rebuild only parts that changed.
|
||||||
4. Enter experiment_targets/weathermonitor and run:
|
4. Enter experiment_targets/weathermonitor and run:
|
||||||
@ -76,7 +76,7 @@ An example of a DatabaseCampaign with separate experiment.
|
|||||||
being VARIANT.trace
|
being VARIANT.trace
|
||||||
6. Use "import-trace" (using correct -b & -v, -t is VARIANT.trace) to get the
|
6. Use "import-trace" (using correct -b & -v, -t is VARIANT.trace) to get the
|
||||||
trace into the database and "prune-trace" to (obviously) prune the data.
|
trace into the database and "prune-trace" to (obviously) prune the data.
|
||||||
7. Change PREREQUISITES (see 5) back to "0" and rebuild Fail*/Bochs.
|
7. Change PREREQUISITES (see 5) back to "0" and rebuild FAIL*/Bochs.
|
||||||
8. Run the "weather-monitor-server" (Don't forget -v & -b!) and "fail-client -q"
|
8. Run the "weather-monitor-server" (Don't forget -v & -b!) and "fail-client -q"
|
||||||
from within experiment_targets/weathermonitor/.
|
from within experiment_targets/weathermonitor/.
|
||||||
You'll need several clients to finish the campaign.
|
You'll need several clients to finish the campaign.
|
||||||
@ -87,7 +87,7 @@ A simple standalone experiment (without a separate campaign). To compile this
|
|||||||
experiment, the following steps are required:
|
experiment, the following steps are required:
|
||||||
1. Add "hsc-simple" to ccmake's EXPERIMENTS_ACTIVATED.
|
1. Add "hsc-simple" to ccmake's EXPERIMENTS_ACTIVATED.
|
||||||
2. Enable CONFIG_EVENT_BREAKPOINTS, CONFIG_SR_RESTORE and CONFIG_SR_SAVE.
|
2. Enable CONFIG_EVENT_BREAKPOINTS, CONFIG_SR_RESTORE and CONFIG_SR_SAVE.
|
||||||
3. Build Fail* and Bochs, see "how-to-build.txt" for details.
|
3. Build FAIL* and Bochs, see "how-to-build.txt" for details.
|
||||||
4. Enter experiment_targets/hscsimple/, bunzip2 -k *.bz2
|
4. Enter experiment_targets/hscsimple/, bunzip2 -k *.bz2
|
||||||
5. Start the Bochs simulator by typing
|
5. Start the Bochs simulator by typing
|
||||||
$ fail-client -q
|
$ fail-client -q
|
||||||
@ -130,7 +130,7 @@ fail-client for the next 2k experiments.
|
|||||||
|
|
||||||
The experiments can be significantly sped up by
|
The experiments can be significantly sped up by
|
||||||
a) parallelization (run more FailBochs clients and
|
a) parallelization (run more FailBochs clients and
|
||||||
b) a headless (and more optimized) Fail* configuration (see above).
|
b) a headless (and more optimized) FAIL* configuration (see above).
|
||||||
|
|
||||||
|
|
||||||
Experiment "MHTestCampaign":
|
Experiment "MHTestCampaign":
|
||||||
@ -211,7 +211,7 @@ To compile this experiment, the following steps are required:
|
|||||||
CONFIG_EVENT_MEMREAD, CONFIG_EVENT_MEMWRITE, CONFIG_EVENT_TRAP, CONFIG_SR_RESTORE
|
CONFIG_EVENT_MEMREAD, CONFIG_EVENT_MEMWRITE, CONFIG_EVENT_TRAP, CONFIG_SR_RESTORE
|
||||||
and CONFIG_SR_SAVE.
|
and CONFIG_SR_SAVE.
|
||||||
6. Enable STEP1 in fail/src/experiments/weather-monitor/experiment.cc
|
6. Enable STEP1 in fail/src/experiments/weather-monitor/experiment.cc
|
||||||
7. Build Fail* and gem5, see "how-to-build.txt" for details.
|
7. Build FAIL* and gem5, see "how-to-build.txt" for details.
|
||||||
8. Start the gem5-fail-client by typing
|
8. Start the gem5-fail-client by typing
|
||||||
"../scripts/run-gem5.sh ../../experiment_targets/weathermonitor_arm/weather.elf
|
"../scripts/run-gem5.sh ../../experiment_targets/weathermonitor_arm/weather.elf
|
||||||
weathermonitor_arm/weather.elf"
|
weathermonitor_arm/weather.elf"
|
||||||
@ -222,7 +222,7 @@ To compile this experiment, the following steps are required:
|
|||||||
10. Prune the trace with
|
10. Prune the trace with
|
||||||
"prune-trace -d YOUR_DB -v baseline -b weather"
|
"prune-trace -d YOUR_DB -v baseline -b weather"
|
||||||
11. Enable STEP3 in fail/src/experiments/weather-monitor/experiment.cc
|
11. Enable STEP3 in fail/src/experiments/weather-monitor/experiment.cc
|
||||||
12. Build Fail* and gem5, see "how-to-build.txt" for details.
|
12. Build FAIL* and gem5, see "how-to-build.txt" for details.
|
||||||
13. Start the campaign-server
|
13. Start the campaign-server
|
||||||
"bin/weather-monitor-server -v baseline -b weather"
|
"bin/weather-monitor-server -v baseline -b weather"
|
||||||
14. Start the gem5-fail-client by typing
|
14. Start the gem5-fail-client by typing
|
||||||
@ -231,18 +231,18 @@ To compile this experiment, the following steps are required:
|
|||||||
=========================================================================================
|
=========================================================================================
|
||||||
Parallelization
|
Parallelization
|
||||||
=========================================================================================
|
=========================================================================================
|
||||||
Fail* is designed to allow parallelization of experiment execution allowing to reduce
|
FAIL* is designed to allow parallelization of experiment execution allowing to reduce
|
||||||
the time needed to execute the experiments on a (larger) set of experiment data (aka
|
the time needed to execute the experiments on a (larger) set of experiment data (aka
|
||||||
input parameters for the experiment execution, e.g. instruction pointer, registers, bit
|
input parameters for the experiment execution, e.g. instruction pointer, registers, bit
|
||||||
numbers, ...). We call such "experiment data" the parameter sets. The so called "campaign"
|
numbers, ...). We call such "experiment data" the parameter sets. The so called "campaign"
|
||||||
is responsible for managing the parameter sets (i.e., the data to be used by the experiment
|
is responsible for managing the parameter sets (i.e., the data to be used by the experiment
|
||||||
flows), inquired by the clients. As a consequence, the campaign is running on the server-
|
flows), inquired by the clients. As a consequence, the campaign is running on the server-
|
||||||
side and the experiment flows are running on the (distributed) clients.
|
side and the experiment flows are running on the (distributed) clients.
|
||||||
First of all, the Fail* instances (and other required files, e.g. saved state) are
|
First of all, the FAIL* instances (and other required files, e.g. saved state) are
|
||||||
distributed to the clients. In the second step the campaign(-server) is started, preparing
|
distributed to the clients. In the second step the campaign(-server) is started, preparing
|
||||||
its parameter sets in order to be able to answer the requests from the clients. (Once
|
its parameter sets in order to be able to answer the requests from the clients. (Once
|
||||||
there are available parameter sets, the clients can request them.) In the final step,
|
there are available parameter sets, the clients can request them.) In the final step,
|
||||||
the distributed Fail* clients have to be started. As soon as this setup is finished,
|
the distributed FAIL* clients have to be started. As soon as this setup is finished,
|
||||||
the clients request new parameter sets, execute their experiment code and return their
|
the clients request new parameter sets, execute their experiment code and return their
|
||||||
results to the server (aka campaign) in an iterative way, until all paremeter sets have
|
results to the server (aka campaign) in an iterative way, until all paremeter sets have
|
||||||
been processed successfully. If all (new) parameter sets have been distributed, the
|
been processed successfully. If all (new) parameter sets have been distributed, the
|
||||||
|
|||||||
@ -211,7 +211,7 @@ Erledigt:
|
|||||||
-> benenne Events um ("Listener")
|
-> benenne Events um ("Listener")
|
||||||
-> Erstelle neue Klassenhierarchie, die den "Informationsanteil" der "Events"
|
-> Erstelle neue Klassenhierarchie, die den "Informationsanteil" der "Events"
|
||||||
repräsentiert. Diese kapseln dann die Informationen in den Events und
|
repräsentiert. Diese kapseln dann die Informationen in den Events und
|
||||||
werden zudem intern im Fail*-Framework verwendet (genauer: kommuniziert).
|
werden zudem intern im FAIL*-Framework verwendet (genauer: kommuniziert).
|
||||||
|
|
||||||
==========================================================================================
|
==========================================================================================
|
||||||
Theorie TODO
|
Theorie TODO
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
This file documents ideas/wishes especially from a Fail* *user* perspective.
|
This file documents ideas/wishes especially from a FAIL* *user* perspective.
|
||||||
|
|
||||||
- Recurring Fail* API usage patterns in experiment/campaign implementations
|
- Recurring FAIL* API usage patterns in experiment/campaign implementations
|
||||||
(that could be implemented in a reusable way, e.g. in a library that sits
|
(that could be implemented in a reusable way, e.g. in a library that sits
|
||||||
between the Fail* API and the experiment)
|
between the FAIL* API and the experiment)
|
||||||
* Fault-space pruning (FIXME elaborate)
|
* Fault-space pruning (FIXME elaborate)
|
||||||
* Preparation vs. final experiment steps -> cmake-driven, automatically
|
* Preparation vs. final experiment steps -> cmake-driven, automatically
|
||||||
build 2 fail-client binaries? (FIXME elaborate)
|
build 2 fail-client binaries? (FIXME elaborate)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# fail-env.sh
|
# fail-env.sh
|
||||||
# default values for several Fail* environment variables
|
# default values for several FAIL* environment variables
|
||||||
# If you want to set your own defaults, or need a script to source from, e.g.,
|
# If you want to set your own defaults, or need a script to source from, e.g.,
|
||||||
# your ~/.bashrc, please copy this file and do not edit it in-place.
|
# your ~/.bashrc, please copy this file and do not edit it in-place.
|
||||||
#
|
#
|
||||||
@ -17,7 +17,7 @@ export FAIL_DISTRIBUTE_HOSTS=${FAIL_DISTRIBUTE_HOSTS:-"ios kos virtuos plutonium
|
|||||||
export FAIL_EXPERIMENT_HOSTS=${FAIL_EXPERIMENT_HOSTS:-"bigbox.informatik.uni-erlangen.de plutonium:4 uran:4 virtuos ios:32 kos:16 bohrium:12 polonium:12 radon $(for hostnr in $(seq 100 254); do echo -n fiws$hostnr\ ; done) $(for hostnr in $(seq 39 58); do echo -n cloudhost$hostnr\ ; done)"}
|
export FAIL_EXPERIMENT_HOSTS=${FAIL_EXPERIMENT_HOSTS:-"bigbox.informatik.uni-erlangen.de plutonium:4 uran:4 virtuos ios:32 kos:16 bohrium:12 polonium:12 radon $(for hostnr in $(seq 100 254); do echo -n fiws$hostnr\ ; done) $(for hostnr in $(seq 39 58); do echo -n cloudhost$hostnr\ ; done)"}
|
||||||
|
|
||||||
# A homedir-relative directory on the distribution hosts where all necessary
|
# A homedir-relative directory on the distribution hosts where all necessary
|
||||||
# Fail* ingredients reside (see multiple-clients.sh).
|
# FAIL* ingredients reside (see multiple-clients.sh).
|
||||||
export FAIL_EXPERIMENT_TARGETDIR=${FAIL_EXPERIMENT_TARGETDIR:-.fail-experiment}
|
export FAIL_EXPERIMENT_TARGETDIR=${FAIL_EXPERIMENT_TARGETDIR:-.fail-experiment}
|
||||||
|
|
||||||
# Number of parallel build processes. If unset, #CPUs+1.
|
# Number of parallel build processes. If unset, #CPUs+1.
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# ab-fail-env.sh (Adrian Böckenkamp)
|
# ab-fail-env.sh (Adrian Böckenkamp)
|
||||||
# default values for several Fail* environment variables
|
# default values for several FAIL* environment variables
|
||||||
#
|
#
|
||||||
|
|
||||||
# A whitespace-separated list of hosts to rsync the experiment data to. This
|
# A whitespace-separated list of hosts to rsync the experiment data to. This
|
||||||
@ -15,5 +15,5 @@ export FAIL_DISTRIBUTE_HOSTS=${FAIL_DISTRIBUTE_HOSTS:='kos plutonium'}
|
|||||||
export FAIL_EXPERIMENT_HOSTS=${FAIL_EXPERIMENT_HOSTS:="plutonium uran kos:6 bohrium polonium radon $(for hostnr in $(seq 100 254); do echo fiws$hostnr; done)"}
|
export FAIL_EXPERIMENT_HOSTS=${FAIL_EXPERIMENT_HOSTS:="plutonium uran kos:6 bohrium polonium radon $(for hostnr in $(seq 100 254); do echo fiws$hostnr; done)"}
|
||||||
|
|
||||||
# A homedir-relative directory on the distribution hosts where all necessary
|
# A homedir-relative directory on the distribution hosts where all necessary
|
||||||
# Fail* ingredients reside (see multiple-clients.sh).
|
# FAIL* ingredients reside (see multiple-clients.sh).
|
||||||
export FAIL_EXPERIMENT_TARGETDIR=.fail-experiment
|
export FAIL_EXPERIMENT_TARGETDIR=.fail-experiment
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# - needs to be called from within your build directory
|
# - needs to be called from within your build directory
|
||||||
# - "rebuild-bochs.sh": rebuild all of both Fail* and Bochs
|
# - "rebuild-bochs.sh": rebuild all of both FAIL* and Bochs
|
||||||
# (e.g., possibly necessary if you don't understand what was changed by others)
|
# (e.g., possibly necessary if you don't understand what was changed by others)
|
||||||
# - "rebuild-bochs.sh fail": rebuild all of Fail* and link fail-client
|
# - "rebuild-bochs.sh fail": rebuild all of FAIL* and link fail-client
|
||||||
# (e.g., possibly necessary if you changed Fail-affecting aspects or the
|
# (e.g., possibly necessary if you changed Fail-affecting aspects or the
|
||||||
# build system)
|
# build system)
|
||||||
# - "rebuild-bochs.sh bochs": rebuild all of Bochs and link fail-client
|
# - "rebuild-bochs.sh bochs": rebuild all of Bochs and link fail-client
|
||||||
# (e.g., necessary if you changed Bochs-affecting aspects/code that must be
|
# (e.g., necessary if you changed Bochs-affecting aspects/code that must be
|
||||||
# inlined in Bochs)
|
# inlined in Bochs)
|
||||||
# - "rebuild-bochs.sh -": rebuild only changed parts of Fail* and Bochs
|
# - "rebuild-bochs.sh -": rebuild only changed parts of FAIL* and Bochs
|
||||||
# (e.g., sufficient if you only changed experiment code)
|
# (e.g., sufficient if you only changed experiment code)
|
||||||
#
|
#
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
if(EXISTS $ENV{T32SYS})
|
if(EXISTS $ENV{T32SYS})
|
||||||
SET(T32_SYS $ENV{T32SYS})
|
SET(T32_SYS $ENV{T32SYS})
|
||||||
message(STATUS "[Fail*] T32 base directory: T32SYS=${T32_SYS}")
|
message(STATUS "[FAIL*] T32 base directory: T32SYS=${T32_SYS}")
|
||||||
else()
|
else()
|
||||||
SET(T32_SYS "/proj/i4ciao/tools/t32-20130226-qt") ## defaulting to I4 installation
|
SET(T32_SYS "/proj/i4ciao/tools/t32-20130226-qt") ## defaulting to I4 installation
|
||||||
#message(FATAL_ERROR "Please set env variable T32SYS to a valid T32 installation base directory.")
|
#message(FATAL_ERROR "Please set env variable T32SYS to a valid T32 installation base directory.")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "[Fail*] T32 base directory: T32SYS=${T32_SYS}")
|
message(STATUS "[FAIL*] T32 base directory: T32SYS=${T32_SYS}")
|
||||||
|
|
||||||
if(EXISTS $ENV{FAIL_ELF_PATH})
|
if(EXISTS $ENV{FAIL_ELF_PATH})
|
||||||
SET(T32_ELF_PATH $ENV{FAIL_ELF_PATH})
|
SET(T32_ELF_PATH $ENV{FAIL_ELF_PATH})
|
||||||
message(STATUS "[Fail*] T32 ELF under test: ${T32_ELF_PATH}")
|
message(STATUS "[FAIL*] T32 ELF under test: ${T32_ELF_PATH}")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Please set the FAIL_ELF_PATH enviroment variable to the binary under test.")
|
message(FATAL_ERROR "Please set the FAIL_ELF_PATH enviroment variable to the binary under test.")
|
||||||
endif()
|
endif()
|
||||||
@ -34,9 +34,9 @@ set(T32_EXE "${T32_SYS}/bin/pc_linux64/" CACHE INTERNAL "") # TODO: set pc_linux
|
|||||||
add_subdirectory(${T32_ARCHITECTURE})
|
add_subdirectory(${T32_ARCHITECTURE})
|
||||||
|
|
||||||
|
|
||||||
message(STATUS "[Fail*] T32 Architecture: ${T32_ARCHITECTURE}")
|
message(STATUS "[FAIL*] T32 Architecture: ${T32_ARCHITECTURE}")
|
||||||
message(STATUS "[Fail*] T32 CPU name: ${T32_CPUNAME}")
|
message(STATUS "[FAIL*] T32 CPU name: ${T32_CPUNAME}")
|
||||||
message(STATUS "[Fail*] T32 Executable: ${T32_EXE}")
|
message(STATUS "[FAIL*] T32 Executable: ${T32_EXE}")
|
||||||
|
|
||||||
add_custom_target(runt32
|
add_custom_target(runt32
|
||||||
COMMAND T32CONFIG=${PROJECT_BINARY_DIR}/cmm/config.t32 T32SYS=${T32_SYS} ${T32_EXE} &
|
COMMAND T32CONFIG=${PROJECT_BINARY_DIR}/cmm/config.t32 T32SYS=${T32_SYS} ${T32_EXE} &
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# --------------------------------------------------------------
|
# --------------------------------------------------------------
|
||||||
# This script invokes the gem5 simulator. It is written to be used
|
# This script invokes the gem5 simulator. It is written to be used
|
||||||
# with the Fail* framework. For further information, see
|
# with the FAIL* framework. For further information, see
|
||||||
# http://www.m5sim.org/Simulation_Scripts_Explained
|
# http://www.m5sim.org/Simulation_Scripts_Explained
|
||||||
# This script is based on $FAIL/simulators/gem5/configs/example/fs.py
|
# This script is based on $FAIL/simulators/gem5/configs/example/fs.py
|
||||||
#
|
#
|
||||||
@ -33,7 +33,7 @@ Options.addFSOptions(parser) # TODO: dito
|
|||||||
if args:
|
if args:
|
||||||
print "Error: script doesn't take any positional arguments"
|
print "Error: script doesn't take any positional arguments"
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
print "[Fail*] Welcome to the FULL SYSTEM simulation script for gem5!"
|
print "[FAIL*] Welcome to the FULL SYSTEM simulation script for gem5!"
|
||||||
|
|
||||||
# Sets up the low-level system parameter:
|
# Sets up the low-level system parameter:
|
||||||
class FailArmSystem(System):
|
class FailArmSystem(System):
|
||||||
@ -130,10 +130,10 @@ test_sys = makeFailArmSystem(test_mem_mode, options.machine_type)
|
|||||||
# experiment target (e.g., the abo-simple-arm.elf file). It should
|
# experiment target (e.g., the abo-simple-arm.elf file). It should
|
||||||
# contain the bootload code as well.
|
# contain the bootload code as well.
|
||||||
if options.kernel is not None:
|
if options.kernel is not None:
|
||||||
print "[Fail*] Using target: " + options.kernel
|
print "[FAIL*] Using target: " + options.kernel
|
||||||
test_sys.kernel = options.kernel
|
test_sys.kernel = options.kernel
|
||||||
else:
|
else:
|
||||||
print "[Fail*] No kernel target given, exiting!"
|
print "[FAIL*] No kernel target given, exiting!"
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
test_sys.init_param = options.init_param
|
test_sys.init_param = options.init_param
|
||||||
|
|||||||
@ -584,7 +584,7 @@ class FloatRegOperand(Operand):
|
|||||||
return self.buildWriteCode(func)
|
return self.buildWriteCode(func)
|
||||||
# (DanceOS hack begin...
|
# (DanceOS hack begin...
|
||||||
if self.ctype == 'int32_t' or self.ctype == 'int16_t':
|
if self.ctype == 'int32_t' or self.ctype == 'int16_t':
|
||||||
print "Applying Fail* hack in %s@%s ... :-)" % \
|
print "Applying FAIL* hack in %s@%s ... :-)" % \
|
||||||
(__file__, inspect.currentframe().f_lineno)
|
(__file__, inspect.currentframe().f_lineno)
|
||||||
wb = '''
|
wb = '''
|
||||||
{
|
{
|
||||||
|
|||||||
@ -15,10 +15,10 @@ SET(PROTOBUF_IMPORT_DIRS "/usr/include;${CMAKE_CURRENT_SOURCE_DIR}/core/comm"
|
|||||||
# is generated by CMake from config/FailConfig.hpp.in and stored in
|
# is generated by CMake from config/FailConfig.hpp.in and stored in
|
||||||
# your build-dir. (The same goes for "FailControlMessage.pb.h", etc.)
|
# your build-dir. (The same goes for "FailControlMessage.pb.h", etc.)
|
||||||
# This is done in the "src"-folder because experiments need to include
|
# This is done in the "src"-folder because experiments need to include
|
||||||
# Fail* headers as well (see hierarchy of CMakeLists.txt's).
|
# FAIL* headers as well (see hierarchy of CMakeLists.txt's).
|
||||||
|
|
||||||
## Add CMakeLists from subdirectories ##
|
## Add CMakeLists from subdirectories ##
|
||||||
# The Fail* core source files (and it's subdirectories):
|
# The FAIL* core source files (and it's subdirectories):
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
|
|
||||||
# Here we add all user-defined experiments (which fills the target list)
|
# Here we add all user-defined experiments (which fills the target list)
|
||||||
@ -39,8 +39,8 @@ endforeach(plugin_name)
|
|||||||
# (probably there's a smarter way to do that with cmake?)
|
# (probably there's a smarter way to do that with cmake?)
|
||||||
add_library(fail dummy.cc)
|
add_library(fail dummy.cc)
|
||||||
|
|
||||||
## Setup build dependencies of the Fail* lib
|
## Setup build dependencies of the FAIL* lib
|
||||||
## -> the Fail* targets and user defined experiment targets
|
## -> the FAIL* targets and user defined experiment targets
|
||||||
# start/end-group: ld must iterate over these archives more than once to figure
|
# start/end-group: ld must iterate over these archives more than once to figure
|
||||||
# out which objects are needed
|
# out which objects are needed
|
||||||
set(experiment_libraries "")
|
set(experiment_libraries "")
|
||||||
|
|||||||
@ -7,7 +7,7 @@ link_directories(${Boost_LIBRARY_DIRS})
|
|||||||
# The autogenerated header files
|
# The autogenerated header files
|
||||||
add_subdirectory(config)
|
add_subdirectory(config)
|
||||||
|
|
||||||
# Fail* targets
|
# FAIL* targets
|
||||||
add_subdirectory(comm)
|
add_subdirectory(comm)
|
||||||
add_subdirectory(cpn)
|
add_subdirectory(cpn)
|
||||||
add_subdirectory(efw)
|
add_subdirectory(efw)
|
||||||
|
|||||||
@ -53,7 +53,7 @@ public:
|
|||||||
* the subclasses.
|
* the subclasses.
|
||||||
* @param trigger the triggering address of the breakpoint event
|
* @param trigger the triggering address of the breakpoint event
|
||||||
* @param address_space the address space identifier for this event
|
* @param address_space the address space identifier for this event
|
||||||
* @param cpu the Fail* CPU object that triggered the breakpoint
|
* @param cpu the FAIL* CPU object that triggered the breakpoint
|
||||||
*/
|
*/
|
||||||
BPEvent(address_t trigger, address_t address_space, ConcreteCPU* cpu = NULL)
|
BPEvent(address_t trigger, address_t address_space, ConcreteCPU* cpu = NULL)
|
||||||
: BaseEvent(cpu), m_TriggerInstrPtr(trigger), m_AddressSpace(address_space) { }
|
: BaseEvent(cpu), m_TriggerInstrPtr(trigger), m_AddressSpace(address_space) { }
|
||||||
|
|||||||
@ -231,7 +231,7 @@ BP_CTOR_SCOPE:
|
|||||||
*/
|
*/
|
||||||
BPSingleListener(address_t ip = 0, address_t address_space = ANY_ADDR, ConcreteCPU* cpu = NULL)
|
BPSingleListener(address_t ip = 0, address_t address_space = ANY_ADDR, ConcreteCPU* cpu = NULL)
|
||||||
: BPListener(address_space, cpu), m_WatchInstrPtr(ip) { }
|
: BPListener(address_space, cpu), m_WatchInstrPtr(ip) { }
|
||||||
public: // reset scope in order to allow compiling the various other Fail* sources
|
public: // reset scope in order to allow compiling the various other FAIL* sources
|
||||||
/**
|
/**
|
||||||
* Returns the instruction pointer this listener waits for.
|
* Returns the instruction pointer this listener waits for.
|
||||||
* @return the instruction pointer specified in the constructor or by
|
* @return the instruction pointer specified in the constructor or by
|
||||||
|
|||||||
@ -33,7 +33,7 @@ typedef std::vector<BaseListener*> deletelist_t;
|
|||||||
/**
|
/**
|
||||||
* \class ListenerManager
|
* \class ListenerManager
|
||||||
*
|
*
|
||||||
* \brief This class manages the listeners of the Fail* implementation.
|
* \brief This class manages the listeners of the FAIL* implementation.
|
||||||
*
|
*
|
||||||
* If a listener is triggered, the internal data structure will be updated (i.e.,
|
* If a listener is triggered, the internal data structure will be updated (i.e.,
|
||||||
* the listener will be removed from the so called buffer-list and added to the
|
* the listener will be removed from the so called buffer-list and added to the
|
||||||
|
|||||||
@ -50,7 +50,7 @@ void SimulatorController::startup()
|
|||||||
std::cout << "[SimulatorController] Initializing..." << std::endl;
|
std::cout << "[SimulatorController] Initializing..." << std::endl;
|
||||||
// TODO: Log-Level?
|
// TODO: Log-Level?
|
||||||
|
|
||||||
// Set Fail* as initialized
|
// Set FAIL* as initialized
|
||||||
m_isInitialized = true;
|
m_isInitialized = true;
|
||||||
|
|
||||||
// Activate previously added experiments to allow initialization:
|
// Activate previously added experiments to allow initialization:
|
||||||
|
|||||||
@ -30,10 +30,10 @@ typedef ArmArchitecture Architecture;
|
|||||||
* simulators/gem5/src/arch/arm/miscregs.hh and
|
* simulators/gem5/src/arch/arm/miscregs.hh and
|
||||||
* simulators/gem5/src/arch/arm/intregs.hh
|
* simulators/gem5/src/arch/arm/intregs.hh
|
||||||
* which we cannot include because they are generated (probably after we need
|
* which we cannot include because they are generated (probably after we need
|
||||||
* them). As integer and "misc" register IDs overlap in gem5, and Fail* needs
|
* them). As integer and "misc" register IDs overlap in gem5, and FAIL* needs
|
||||||
* unique IDs, we split at RI_INTREGS_MAX and map to the original IDs in
|
* unique IDs, we split at RI_INTREGS_MAX and map to the original IDs in
|
||||||
* sal/gem5/Gem5Wrapper.cc . If more ARM backends emerge, we may need to find
|
* sal/gem5/Gem5Wrapper.cc . If more ARM backends emerge, we may need to find
|
||||||
* more sophisticated backend<->Fail* register ID mappings.
|
* more sophisticated backend<->FAIL* register ID mappings.
|
||||||
*/
|
*/
|
||||||
enum GPRegIndex {
|
enum GPRegIndex {
|
||||||
RI_R0,
|
RI_R0,
|
||||||
|
|||||||
@ -42,7 +42,7 @@ aspect BochsListener {
|
|||||||
bx_pc_system.register_timer(pev, fail::onTimerTrigger,
|
bx_pc_system.register_timer(pev, fail::onTimerTrigger,
|
||||||
pev->getTimeout() /*timeout in microseconds*/,
|
pev->getTimeout() /*timeout in microseconds*/,
|
||||||
false /*non-continuous*/,
|
false /*non-continuous*/,
|
||||||
true /*start immediately*/, "Fail*: BochsController"/*name*/));
|
true /*start immediately*/, "FAIL*: BochsController"/*name*/));
|
||||||
}
|
}
|
||||||
bool m_unregisterTimer(TimerListener* pev)
|
bool m_unregisterTimer(TimerListener* pev)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -38,7 +38,7 @@ private:
|
|||||||
return static_cast<timer_id_t>(
|
return static_cast<timer_id_t>(
|
||||||
oocdw_register_timer(pev, fail::onTimerTrigger,
|
oocdw_register_timer(pev, fail::onTimerTrigger,
|
||||||
pev->getTimeout() /*timeout in microseconds*/,
|
pev->getTimeout() /*timeout in microseconds*/,
|
||||||
true /*start immediately*/, "Fail*: PandaController"/*name*/));
|
true /*start immediately*/, "FAIL*: PandaController"/*name*/));
|
||||||
}
|
}
|
||||||
bool m_unregisterTimer(TimerListener* pev)
|
bool m_unregisterTimer(TimerListener* pev)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,7 +12,7 @@ namespace fail {
|
|||||||
*/
|
*/
|
||||||
class BlackholeLogger {
|
class BlackholeLogger {
|
||||||
public:
|
public:
|
||||||
Logger(const std::string& description = "Fail*", bool show_time = true,
|
Logger(const std::string& description = "FAIL*", bool show_time = true,
|
||||||
std::ostream& dest = std::cout) { }
|
std::ostream& dest = std::cout) { }
|
||||||
void setDescription(const std::string& descr) { }
|
void setDescription(const std::string& descr) { }
|
||||||
void showTime(bool choice) { }
|
void showTime(bool choice) { }
|
||||||
|
|||||||
@ -66,7 +66,7 @@ find_program(FAIL_OBJDUMP "${THE_OBJDUMP}" DOC "binutils object dump tool")
|
|||||||
if(${FAIL_OBJDUMP} STREQUAL FAIL_OBJDUMP-NOTFOUND)
|
if(${FAIL_OBJDUMP} STREQUAL FAIL_OBJDUMP-NOTFOUND)
|
||||||
message(FATAL_ERROR "Cannot find objdump exeuctable (tried: ${THE_OBJDUMP}")
|
message(FATAL_ERROR "Cannot find objdump exeuctable (tried: ${THE_OBJDUMP}")
|
||||||
else()
|
else()
|
||||||
message(STATUS "[Fail*] objdump binary -> ${FAIL_OBJDUMP}")
|
message(STATUS "[FAIL*] objdump binary -> ${FAIL_OBJDUMP}")
|
||||||
endif()
|
endif()
|
||||||
mark_as_advanced(FAIL_OBJDUMP)
|
mark_as_advanced(FAIL_OBJDUMP)
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ namespace fail {
|
|||||||
|
|
||||||
const std::string DISASSEMBLER::FAILED = "[Disassembler] Disassemble failed.";
|
const std::string DISASSEMBLER::FAILED = "[Disassembler] Disassemble failed.";
|
||||||
|
|
||||||
Disassembler::Disassembler() : m_log("Fail*Disassembler", false) { }
|
Disassembler::Disassembler() : m_log("FAIL*Disassembler", false) { }
|
||||||
|
|
||||||
int Disassembler::init() {
|
int Disassembler::init() {
|
||||||
// try to open elf file from environment variable
|
// try to open elf file from environment variable
|
||||||
|
|||||||
@ -26,7 +26,7 @@ std::ostream& operator<< (std::ostream &out, const ElfSymbol &symbol) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
ElfReader::ElfReader() : m_log("Fail*Elfinfo", false) {
|
ElfReader::ElfReader() : m_log("FAIL*Elfinfo", false) {
|
||||||
// try to open elf file from environment variable
|
// try to open elf file from environment variable
|
||||||
char * elfpath = getenv("FAIL_ELF_PATH");
|
char * elfpath = getenv("FAIL_ELF_PATH");
|
||||||
if (elfpath == NULL) {
|
if (elfpath == NULL) {
|
||||||
@ -36,7 +36,7 @@ ElfReader::ElfReader() : m_log("Fail*Elfinfo", false) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ElfReader::ElfReader(const char* path) : m_log("Fail*Elfinfo", false) {
|
ElfReader::ElfReader(const char* path) : m_log("FAIL*Elfinfo", false) {
|
||||||
setup(path);
|
setup(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,7 +24,7 @@ public:
|
|||||||
* @param show_time Show a timestamp with each log entry.
|
* @param show_time Show a timestamp with each log entry.
|
||||||
* @param dest Stream to log into.
|
* @param dest Stream to log into.
|
||||||
*/
|
*/
|
||||||
Logger(const std::string& description = "Fail*", bool show_time = true,
|
Logger(const std::string& description = "FAIL*", bool show_time = true,
|
||||||
std::ostream& dest = std::cout)
|
std::ostream& dest = std::cout)
|
||||||
: m_pDest(&dest), m_description(description), m_showTime(show_time) { }
|
: m_pDest(&dest), m_description(description), m_showTime(show_time) { }
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -9,7 +9,7 @@ namespace fail {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Translates LLVM disassembler ids
|
* Translates LLVM disassembler ids
|
||||||
* to Fail* SAL representations.
|
* to FAIL* SAL representations.
|
||||||
*/
|
*/
|
||||||
class LLVMtoFailTranslator {
|
class LLVMtoFailTranslator {
|
||||||
public:
|
public:
|
||||||
@ -51,7 +51,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Translates a backend-specific register ID to a Fail register ID.
|
* Translates a backend-specific register ID to a Fail register ID.
|
||||||
* @param regid A backend-specific register ID.
|
* @param regid A backend-specific register ID.
|
||||||
* @return A Fail* register ID, or LLVMtoFailTranslator::notfound if no
|
* @return A FAIL* register ID, or LLVMtoFailTranslator::notfound if no
|
||||||
* mapping was found.
|
* mapping was found.
|
||||||
*/
|
*/
|
||||||
const reginfo_t & getFailRegisterID(unsigned int regid);
|
const reginfo_t & getFailRegisterID(unsigned int regid);
|
||||||
|
|||||||
@ -93,7 +93,7 @@ bool CoolChecksumExperiment::run()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif 1
|
#elif 1
|
||||||
// FIXME consider moving experiment repetition into Fail* or even the
|
// FIXME consider moving experiment repetition into FAIL* or even the
|
||||||
// SAL -- whether and how this is possible with the chosen backend is
|
// SAL -- whether and how this is possible with the chosen backend is
|
||||||
// backend specific
|
// backend specific
|
||||||
for (int i = 0; i < 2000; ++i) {
|
for (int i = 0; i < 2000; ++i) {
|
||||||
|
|||||||
@ -152,7 +152,7 @@ private:
|
|||||||
/**
|
/**
|
||||||
* Adds the value of the config file to the parameter list and
|
* Adds the value of the config file to the parameter list and
|
||||||
* parse the parameter list. This function makes use of the
|
* parse the parameter list. This function makes use of the
|
||||||
* CommandLine Parser from the fail* framework.
|
* CommandLine Parser from the FAIL* framework.
|
||||||
*/
|
*/
|
||||||
void parseOptions(L4SysConfig&);
|
void parseOptions(L4SysConfig&);
|
||||||
|
|
||||||
|
|||||||
@ -34,7 +34,7 @@ you to read this whole document before investigating further.
|
|||||||
\section{Overview}
|
\section{Overview}
|
||||||
|
|
||||||
This is the user manual of the \lfs{} generic system test framework.
|
This is the user manual of the \lfs{} generic system test framework.
|
||||||
The framework builds on Fail* and provides means to perform fault injection
|
The framework builds on FAIL* and provides means to perform fault injection
|
||||||
experiments for applications running on top of the Fiasco.OC/L4Re
|
experiments for applications running on top of the Fiasco.OC/L4Re
|
||||||
microkernel-based operating system as well as the underlying microkernel.
|
microkernel-based operating system as well as the underlying microkernel.
|
||||||
|
|
||||||
@ -47,13 +47,13 @@ microkernel-based operating system as well as the underlying microkernel.
|
|||||||
\noindent \lfs{} currently works for x86/32 running in Fail/Bochs only.
|
\noindent \lfs{} currently works for x86/32 running in Fail/Bochs only.
|
||||||
This is partly due to some issues with timing --- as soon as a valid model of
|
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
|
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
|
in the FAIL* framework are established, I would recommend a backend change, as
|
||||||
Bochs' reliability is very limited.
|
Bochs' reliability is very limited.
|
||||||
|
|
||||||
\section{Framework Setup}
|
\section{Framework Setup}
|
||||||
|
|
||||||
To prepare a fault injection campaign you will first need to configure and
|
To prepare a fault injection campaign you will first need to configure and
|
||||||
build Fail* itself. This process is described in \texttt{doc/how-to-build.txt}.
|
build FAIL* itself. This process is described in \texttt{doc/how-to-build.txt}.
|
||||||
The following CMake flags need to be set:
|
The following CMake flags need to be set:
|
||||||
|
|
||||||
\begin{itemize}[itemsep=0em]
|
\begin{itemize}[itemsep=0em]
|
||||||
@ -94,7 +94,7 @@ in Bochs.
|
|||||||
|
|
||||||
\section{Client Setup}
|
\section{Client Setup}
|
||||||
|
|
||||||
Now that we have Fail* and the L4Re setup running, we can prepare our fault
|
Now that we have FAIL* and the L4Re setup running, we can prepare our fault
|
||||||
injection campaign. This requires three (+ one optional) steps:
|
injection campaign. This requires three (+ one optional) steps:
|
||||||
\begin{enumerate}[topsep=0em,itemsep=0em]
|
\begin{enumerate}[topsep=0em,itemsep=0em]
|
||||||
\item \emph{OPTIONAL:} If we want to perform a campaign that only targets
|
\item \emph{OPTIONAL:} If we want to perform a campaign that only targets
|
||||||
@ -203,7 +203,7 @@ be added to specify the host name or ip addr. of the machine running
|
|||||||
|
|
||||||
Each experiment client processes exactly one experiment
|
Each experiment client processes exactly one experiment
|
||||||
and exits. To complete your campaign, you should use the \verb+client.sh+
|
and exits. To complete your campaign, you should use the \verb+client.sh+
|
||||||
script in the \texttt{scripts} subdirectory of Fail*.
|
script in the \texttt{scripts} subdirectory of FAIL*.
|
||||||
|
|
||||||
|
|
||||||
\section{Get your results}
|
\section{Get your results}
|
||||||
|
|||||||
@ -126,7 +126,7 @@ bool NanoJPEGCampaign::run()
|
|||||||
// all IN registers close an equivalence class and generate experiments
|
// all IN registers close an equivalence class and generate experiments
|
||||||
for (Udis86Helper::UDRegisterSet::const_iterator it = in_regs.begin();
|
for (Udis86Helper::UDRegisterSet::const_iterator it = in_regs.begin();
|
||||||
it != in_regs.end(); ++it) {
|
it != in_regs.end(); ++it) {
|
||||||
// determine Fail* register ID and bitmask
|
// determine FAIL* register ID and bitmask
|
||||||
uint64_t access_mask;
|
uint64_t access_mask;
|
||||||
fail::GPRegisterId reg = udis_helper.udisGPRToFailBochsGPR(*it, access_mask);
|
fail::GPRegisterId reg = udis_helper.udisGPRToFailBochsGPR(*it, access_mask);
|
||||||
uint64_t remaining_access_mask = access_mask;
|
uint64_t remaining_access_mask = access_mask;
|
||||||
@ -168,7 +168,7 @@ bool NanoJPEGCampaign::run()
|
|||||||
// special case: empty EC!
|
// special case: empty EC!
|
||||||
for (Udis86Helper::UDRegisterSet::const_iterator it = out_regs.begin();
|
for (Udis86Helper::UDRegisterSet::const_iterator it = out_regs.begin();
|
||||||
it != out_regs.end(); ++it) {
|
it != out_regs.end(); ++it) {
|
||||||
// determine Fail* register ID and bitmask
|
// determine FAIL* register ID and bitmask
|
||||||
uint64_t access_mask;
|
uint64_t access_mask;
|
||||||
fail::GPRegisterId reg = udis_helper.udisGPRToFailBochsGPR(*it, access_mask);
|
fail::GPRegisterId reg = udis_helper.udisGPRToFailBochsGPR(*it, access_mask);
|
||||||
uint64_t remaining_access_mask = access_mask;
|
uint64_t remaining_access_mask = access_mask;
|
||||||
@ -213,7 +213,7 @@ bool NanoJPEGCampaign::run()
|
|||||||
// close all open ECs
|
// close all open ECs
|
||||||
for (map<GPRegisterId, std::list<std::pair<unsigned, uint64_t> > >::iterator it = reg_cascade.begin();
|
for (map<GPRegisterId, std::list<std::pair<unsigned, uint64_t> > >::iterator it = reg_cascade.begin();
|
||||||
it != reg_cascade.end(); ++it) {
|
it != reg_cascade.end(); ++it) {
|
||||||
// determine Fail* register ID and bitmask
|
// determine FAIL* register ID and bitmask
|
||||||
uint64_t access_mask = 0xffffffffULL;
|
uint64_t access_mask = 0xffffffffULL;
|
||||||
fail::GPRegisterId reg = it->first;
|
fail::GPRegisterId reg = it->first;
|
||||||
uint64_t remaining_access_mask = access_mask;
|
uint64_t remaining_access_mask = access_mask;
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
VisualFail*
|
VisualFAIL*
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Guest-system setup
|
Guest-system setup
|
||||||
------------------
|
------------------
|
||||||
For analysis with VisualFail*, the guest-system ELF binary must be compiled with
|
For analysis with VisualFAIL*, the guest-system ELF binary must be compiled with
|
||||||
debugging information (gcc/g++/clang/clang++ compiler flag "-g"). Note that
|
debugging information (gcc/g++/clang/clang++ compiler flag "-g"). Note that
|
||||||
debugging information quality/accuracy usually decreases with higher
|
debugging information quality/accuracy usually decreases with higher
|
||||||
optimization levels.
|
optimization levels.
|
||||||
@ -16,7 +16,7 @@ Database preparation
|
|||||||
|
|
||||||
Step 1 is the prerequisite to run the fault-injection campaign (you may use
|
Step 1 is the prerequisite to run the fault-injection campaign (you may use
|
||||||
other importers as well, e.g., the RegisterImporter). Steps 2 and 3 are
|
other importers as well, e.g., the RegisterImporter). Steps 2 and 3 are
|
||||||
required for VisualFail* to work.
|
required for VisualFAIL* to work.
|
||||||
|
|
||||||
Setup
|
Setup
|
||||||
-----
|
-----
|
||||||
@ -25,20 +25,20 @@ database credentials and the result-table name (usually starting with
|
|||||||
"result...", "echo SHOW TABLES | mysql yourdatabase" on the command line should
|
"result...", "echo SHOW TABLES | mysql yourdatabase" on the command line should
|
||||||
give you the correct table name).
|
give you the correct table name).
|
||||||
|
|
||||||
(In a later version of VisualFail*, we will probably add automatic loading of
|
(In a later version of VisualFAIL*, we will probably add automatic loading of
|
||||||
~/.my.cnf if available.)
|
~/.my.cnf if available.)
|
||||||
|
|
||||||
Running and using VisualFail*
|
Running and using VisualFAIL*
|
||||||
-----------------------------
|
-----------------------------
|
||||||
./StartVF.sh requires PHP 5.4.0 or newer and uses its simple built-in web
|
./StartVF.sh requires PHP 5.4.0 or newer and uses its simple built-in web
|
||||||
server. You can connect to it by using http://localhost:1234 in a web browser
|
server. You can connect to it by using http://localhost:1234 in a web browser
|
||||||
on the same machine. (If you need to connect from another machine, manually run
|
on the same machine. (If you need to connect from another machine, manually run
|
||||||
"php -S 0.0.0.0:1234 -t .")
|
"php -S 0.0.0.0:1234 -t .")
|
||||||
|
|
||||||
Alternatively, VisualFail* can be set up using a "real" web server with a recent
|
Alternatively, VisualFAIL* can be set up using a "real" web server with a recent
|
||||||
PHP version (5.x should suffice).
|
PHP version (5.x should suffice).
|
||||||
|
|
||||||
Once the web server runs, you can use VisualFail*:
|
Once the web server runs, you can use VisualFAIL*:
|
||||||
|
|
||||||
- Pick a coloring (currently, only "Right margin" really makes sense), a
|
- Pick a coloring (currently, only "Right margin" really makes sense), a
|
||||||
benchmark and a variant from the drop-down menus. Click "Analyze". Wait.
|
benchmark and a variant from the drop-down menus. Click "Analyze". Wait.
|
||||||
|
|||||||
@ -40,7 +40,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<!--<div class="container"> -->
|
<!--<div class="container"> -->
|
||||||
<!--<a class="navbar-brand" href="#">Visual FAIL*</a>-->
|
<!--<a class="navbar-brand" href="#">Visual FAIL*</a>-->
|
||||||
<img class="navbar-brand logo" src="images/logos/visualfaillogo_klein.png" alt="Visual Fail* logo" />
|
<img class="navbar-brand logo" src="images/logos/visualfaillogo_klein.png" alt="Visual FAIL* logo" />
|
||||||
<!--</div>-->
|
<!--</div>-->
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
Fail* Result Browser
|
FAIL* Result Browser
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
* Python
|
* Python
|
||||||
@ -9,7 +9,7 @@ Requirements:
|
|||||||
Based on Flask web microframework (Werkzeug, Jinja 2)
|
Based on Flask web microframework (Werkzeug, Jinja 2)
|
||||||
and old school MySQL bindings.
|
and old school MySQL bindings.
|
||||||
|
|
||||||
Connects to a Fail* result database given by a mysql config file.
|
Connects to a FAIL* result database given by a mysql config file.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
./run.py
|
./run.py
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Fail* Results</title>
|
<title>FAIL* Results</title>
|
||||||
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"></strong>
|
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"></strong>
|
||||||
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/barchart.css') }}"></strong>
|
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/barchart.css') }}"></strong>
|
||||||
</head>
|
</head>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<header>
|
<header>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="logo">Fail*</h1>
|
<h1 class="logo">FAIL*</h1>
|
||||||
<strong><nav>
|
<strong><nav>
|
||||||
<ul class="menu">
|
<ul class="menu">
|
||||||
<li><a href="{{ url_for('index') }}">Home</a></li>
|
<li><a href="{{ url_for('index') }}">Home</a></li>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
© Fail* - Fault Injection Leveraged
|
© FAIL* - Fault Injection Leveraged
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -24,7 +24,7 @@ fi
|
|||||||
echo "importing $VARIANT/$BENCHMARK symbols from $ELF ..."
|
echo "importing $VARIANT/$BENCHMARK symbols from $ELF ..."
|
||||||
|
|
||||||
|
|
||||||
# get fail*'s variant_id
|
# get FAIL*'s variant_id
|
||||||
ID=$(echo "SELECT id FROM variant WHERE variant='$VARIANT' AND benchmark='$BENCHMARK'" | $MYSQL -N)
|
ID=$(echo "SELECT id FROM variant WHERE variant='$VARIANT' AND benchmark='$BENCHMARK'" | $MYSQL -N)
|
||||||
if [ -z $ID ]; then
|
if [ -z $ID ]; then
|
||||||
echo "no such variant/benchmark!" >&2
|
echo "no such variant/benchmark!" >&2
|
||||||
|
|||||||
Reference in New Issue
Block a user