Removed SCC
authorDavid Cock <david.cock@inf.ethz.ch>
Thu, 27 Aug 2015 11:39:42 +0000 (13:39 +0200)
committerDavid Cock <david.cock@inf.ethz.ch>
Thu, 27 Aug 2015 11:39:42 +0000 (13:39 +0200)
Signed-off-by: David Cock <david.cock@inf.ethz.ch>

53 files changed:
doc/005-scc/Hakefile [deleted file]
doc/005-scc/SCC.tex [deleted file]
doc/005-scc/figures/exp1.pdf [deleted file]
doc/005-scc/figures/exp1.svg [deleted file]
doc/005-scc/figures/exp2.pdf [deleted file]
doc/005-scc/figures/exp2.svg [deleted file]
doc/005-scc/plots/header.gnuplot [deleted file]
doc/005-scc/plots/mpbbench/Makefile [deleted file]
doc/005-scc/plots/mpbbench/mpbbench_oneway.dat [deleted file]
doc/005-scc/plots/mpbbench/mpbbench_oneway.pdf [deleted file]
doc/005-scc/plots/mpbbench/mpbbench_recv.dat [deleted file]
doc/005-scc/plots/mpbbench/mpbbench_send.dat [deleted file]
doc/005-scc/plots/mpbbench/plot-line.sh [deleted file]
doc/005-scc/plots/rcce_bench/Makefile [deleted file]
doc/005-scc/plots/rcce_bench/bt.dat [deleted file]
doc/005-scc/plots/rcce_bench/lu.dat [deleted file]
doc/005-scc/plots/rcce_bench/plot-rcce-speedup.sh [deleted file]
doc/005-scc/plots/rcce_bench/plot-rcce.sh [deleted file]
doc/005-scc/plots/rcce_bench/rcce_bt.pdf [deleted file]
doc/005-scc/plots/rcce_bench/rcce_bt_speedup.pdf [deleted file]
doc/005-scc/plots/rcce_bench/rcce_lu.pdf [deleted file]
doc/005-scc/plots/rcce_bench/rcce_lu_speedup.pdf [deleted file]
doc/005-scc/sloccount.txt [deleted file]
hake/ARMv8.hs
hake/RuleDefs.hs
hake/X86_64.hs
hake/menu.lst.scc [deleted file]
hake/symbolic_targets.mk
if/arch/scc.if [deleted file]
if/platform/scc.if [deleted file]
include/arch/scc/barrelfish/bulk_transfer_arch.h [deleted file]
include/arch/scc/barrelfish/cpu_arch.h [deleted file]
kernel/arch/scc/boot.S [deleted file]
kernel/arch/scc/rck.c [deleted file]
kernel/include/arch/scc/rck.h [deleted file]
lib/barrelfish/Hakefile
lib/elf/Hakefile
lib/newlib/newlib/libc/machine/Hakefile
tools/scc/barrelfish48.mt [deleted file]
tools/scc/bigimage.map [deleted file]
tools/scc/bootscc.sh [deleted file]
tools/scc/bootvector.dat [deleted file]
tools/scc/bootvector.map [deleted file]
tools/scc/watchall.sh [deleted file]
usr/mem_serv_dist/Hakefile
usr/monitor/Hakefile
usr/monitor/arch/scc/boot.c [deleted file]
usr/monitor/arch/scc/inter.c [deleted file]
usr/skb/Shm/src/Hakefile
usr/skb/eclipse_kernel/src/Hakefile
usr/skb/icparc_solver/Hakefile
usr/skb/skb_simple/Hakefile
usr/tests/net-test/Hakefile

diff --git a/doc/005-scc/Hakefile b/doc/005-scc/Hakefile
deleted file mode 100644 (file)
index 5033133..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-----------------------------------------------------------------------
--- Copyright (c) 2010, ETH Zurich.
--- All rights reserved.
---
--- This file is distributed under the terms in the attached LICENSE file.
--- If you do not find this file, copies can be found by writing to:
--- ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
---
--- Hakefile for /doc/005-scc
---
-----------------------------------------------------------------------
-
-[ buildTechNote "SCC.tex" "TN-005-SCC.pdf" True False
-                    [ "figures/exp1", "figures/exp2",
-                      "plots/mpbbench/mpbbench_oneway", 
-                      "plots/rcce_bench/rcce_bt",
-                      "plots/rcce_bench/rcce_bt_speedup",
-                      "plots/rcce_bench/rcce_lu",
-                      "plots/rcce_bench/rcce_lu_speedup" ]
-]
diff --git a/doc/005-scc/SCC.tex b/doc/005-scc/SCC.tex
deleted file mode 100644 (file)
index 847b587..0000000
+++ /dev/null
@@ -1,1448 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Copyright (c) 2011, 2012, ETH Zurich.
-% All rights reserved.
-%
-% This file is distributed under the terms in the attached LICENSE file.
-% If you do not find this file, copies can be found by writing to:
-% ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\documentclass[a4paper,twoside]{report} % for a report (default)
-
-\usepackage{bftn} % You need this
-\usepackage{multirow}
-\usepackage{listings}
-\usepackage{color}
-
-\title{Barrelfish on the Intel Single-chip Cloud Computer}   % title of report
-\author{Simon Peter \and Timothy Roscoe \and Andrew Baumann}   % author
-\tnnumber{005}  % give the number of the tech report
-\tnkey{Single-chip Cloud Computer} % Short title, will appear in footer
-
-% \date{Month Year} % Not needed - will be taken from version history
-
-\begin{document}
-\maketitle
-
-%
-% Include version history first
-%
-\begin{versionhistory}
-\vhEntry{0.1}{08.02.2010}{SP,TR}{Initial version}
-\vhEntry{1.0}{20.07.2010}{SP,TR,AB}{Updates, more detail}
-\vhEntry{1.1}{11.08.2010}{SP}{Fill in missing details}
-\vhEntry{1.2}{12.08.2010}{TR}{Initial release version}
-\vhEntry{1.3}{09.09.2010}{SP,RB}{Corrections to typos and for clarity}
-\vhEntry{1.4}{10.05.2012}{SP}{Fake VGA console removed. Physical
-  memory layout added.}
-\vhEntry{1.5}{12.12.2013}{TR}{Final.  SCC program terminated.}
-\end{versionhistory}
-
-% \intro{Abstract}             % Insert abstract here
-% \intro{Acknowledgements}     % Uncomment (if needed) for acknowledgements
-% \tableofcontents             % Uncomment (if needed) for final draft
-% \listoffigures               % Uncomment (if needed) for final draft
-% \listoftables                        % Uncomment (if needed) for final draft
-
-\lstset{
-  language=C,
-  basicstyle=\ttfamily \small,
-  flexiblecolumns=false,
-  basewidth={0.5em,0.45em},
-  boxpos=t,
-}
-
-\newcommand{\eclipse}{ECL\textsuperscript{i}PS\textsuperscript{e}\xspace}
-\newcommand{\codesize}{\scriptsize}
-\newcommand{\note}[1]{[\textcolor{red}{\emph{#1}}]}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Introduction}
-
-\textit{Note: the Intel MARC program involving the Single-Chip Cloud
-  Computer was a part, was terminated in 2013.  As a consequence,
-  Barrelfish support for the SCC also stopped at the end of the year
-  and this technical note should be regarded as historical.}
-
-This report describes the Barrelfish port to the Intel Single-chip
-Cloud Computer \cite{intel:scc:isscc10}.   It serves as a general
-repository for information about the SCC platform, and therefore
-contains a number of very different kinds of information, for
-different audiences.  It should be regarded as an evolving set of
-notes, rather than a polished document. 
-
-\begin{itemize}
-
-\item Chapter~\ref{chap:impl} describes the SCC-specific aspects of the
-port. This information is of most interest to people trying to
-understand the SCC-specific functionality in Barrelfish. 
-
-\item Chapter~\ref{chap:bench} collects various hardware
-  microbenchmarks which were used to guide the implementation.  This
-  is of interest to those wishing to understand the performance of
-  individual operations on the SCC, for example to optimize the 
-  Barrelfish implementation. 
-
-\item Chapter~\ref{chap:eval} provides both a quantitative and
-  qualitative evaluation of Barrelfish running on the SCC.  This
-  summarizes our results of running a limited number of applications
-  on Barrelfish using the SCC. 
-
-\item Chapter~\ref{chap:refl} discusses the implications of our early
-  experience for future system software on the SCC, and provides some
-  thoughts on the suitability of the SCC's hardware for running a
-  message-based OS such as Barrelfish.  This deals primarily with how
-  well-matched the Barrelfish design is with the hardware features of
-  the SCC. 
-
-\item Chapter~\ref{chap:historical} collects information about
-  historical features of the port that are not supported anymore.
-\end{itemize}
-
-The work described in the current version of this document was carried
-out entirely on the ``Copper Ridge'' SCC platform.  
-As the Barrelfish project gains more experience with the ``Rocky
-Lake'' SCC platform, this document will be updated accordingly. 
-
-We would like
-thank Intel Corporation, in particular the SCC team and the Intel
-Braunschweig Lab, for their help and early access to the SCC
-platform. 
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Barrelfish implementation on SCC}\label{chap:impl}
-
-This chapter describes the SCC-specific parts of Barrelfish, and how
-they differ from other target architectures.   The SCC port of
-Barrelfish is still in its early stages (the version described here is
-based on less than 10 person-days of access to early SCC hardware), so
-this should be viewed as a preliminary discussion.  
-
-The work was carried out by Simon Peter at the Intel Braunschweig lab
-from the 8th to the 12th March 2010, and subsequently from the 26th to
-the 30th April 2010. 
-
-\section{CPU driver}
-
-All cores in a Barrelfish system run a CPU driver, which is the only
-code which runs in privileged mode on the core.  
-
-The SCC CPU driver is based on the x86-32 port of Barrelfish, and is
-identical to it except for not supporting the various address
-extensions (PAE, etc.) available on modern 32-bit ia32
-machines. Instead, kernel-mode support for multiplexing access to
-message passing buffers (MPBs) and configuration registers is
-provided.
-
-The SCC CPU driver also supports the x86 UART for debugging output. A
-version of the SCC host PC driver\footnote{Available at:
-  \url{http://www.dcl.hpi.uni-potsdam.de/research/scc/serial.htm}}
-supports a virtual UART for each core on the SCC.
-
-\section{Compilation}
-
-A symbolic target \texttt{scc} has been added to the Barrelfish
-makefile. This target carries out two additional steps necessary to
-produce a bootable binary image file:
-
-\begin{enumerate}
-\item A Barrelfish binary image is compiled from ELF images of the
-  kernel and user-space binaries, together with essential bootup
-  information (like commandline parameters for those binaries and a
-  memory map) from an enhanced GRUB~\cite{grub} \texttt{menu.lst}
-  file. This is done using the \texttt{dite} image generation tool,
-  written at ETH and included in the \texttt{/tools/dite} directory of
-  the Barrelfish source tree. The image is relocated to be loaded at
-  address 0xff000.
-
-\item This binary image is converted into Intel 32.obj binary format
-  (an Intel-proprietary format) and combined with a 5 byte jump
-  vector, to be loaded at address 0xfffffff0, long jumping to
-  0x100000, the fixed entry point of the kernel.
-
-\item Another 32.obj file is created, containing only the 5 byte jump
-  vector to the same fixed entry point of the kernel.
-\end{enumerate}
-
-\section{Boot process: first (bootstrap) core}
-
-The \verb+tools/scc/bootscc.sh+ shell script can be used to boot the
-SCC. This script will invoke the following sccKit tools on the host PC
-to bootstrap the first SCC core:
-
-\begin{alltt}
-  sccReset -g
-  sccMerge -m4 -n12 -noimage -lut\_default -force barrelfish48.mt
-  sccBoot -g obj
-  sccReset -r 0
-\end{alltt}
-
-The first \texttt{sccReset} will reset the SCC board into a known
-state, in particular all configuration registers.
-
-\texttt{sccMerge} creates memory images for all memory controllers
-from the previously created 32.obj files. It will load the boot image
-to core 0's memory and load the boot jump vector to all other
-cores. The default LUT mappings are created for each core. The file
-\texttt{barrelfish48.mt} provided on the commandline is responsible
-for this configuration. It is shipped with the Barrelfish source
-distribution. \texttt{sccMerge} creates an \texttt{obj} subdirectory
-containing the produced memory images. If the directory already
-exists, it is removed first.
-
-\texttt{sccBoot} loads the memory images into the memory controllers
-from the \texttt{obj} subdirectory.
-
-The second \texttt{sccReset} will release the reset pin of the first
-SCC core (core ID 0).
-
-The kernel boot code switches from real mode to protected mode,
-activates paging, all caches and the message passing buffers. In
-addition to the regular x86-32 startup sequence, it initializes the
-in-kernel SCC support code and reads the core ID from the local core
-mapping.
-
-The rest of the local boot process is identical to the x86-32 boot
-process.
-
-\section{Boot process: subsequent cores}
-
-When told to boot another SCC core with a given core ID, the CPU
-driver will modify the booter's LUT mapping to map in the first 16MB
-(one LUT entry) of the bootee at a known fixed address, known not to
-contain useful memory of the booter.
-
-The booter will then ELF load a copy of the CPU driver to address
-0x10000 and append copies of the ELF binaries of the CPU driver, the
-monitor, init, and mem\_serv. These programs are needed to bring up
-the bootee core. A special configuration region at address 0xff00 is
-also written to inform the bootee that it is an application kernel,
-the address of the inter-monitor CC-UMP message passing region in
-shared RAM, the location of the binary copies, as well as the
-notification channel ID used for that channel. CC-UMP and notification
-channels are described in Section~\ref{sec:interconnect}.  Then, the
-reset pin of the bootee is released via configuration registers.
-
-\section{Physical address space}
-
-The SCC allows the physical address space of each core to be
-configured using the 256-entry Lookup Table~\cite{rockcreek_eas}
-(LUT).  In normal operation, we use the default LUT memory map, as is
-used by Intel for the Linux OS, and amend it for extra physical memory
-if available. The memory map is described in the
-\verb+hake/menu.lst.scc+ file, and inserted into the boot image by the
-\verb+dite+ tool, where the kernel can find it.
-
-\begin{center}
-\begin{tabular}{lll}
-Area & start & end\\
-\hline
-Private DDR3 RAM & 0 & 0x28ffffff \\
-Remote boot LUT & 0x29000000 & 0x29ffffff \\
-\emph{Unused} & 0x2a000000 & 0x7fffffff \\
-Shared DDR3 RAM & 0x80000000 & 0xbfffffff \\
-On-tile MPBs & 0xc0000000 & 0xd7ffffff \\
-Local on-tile MPB & 0xd8000000 & 0xd8ffffff \\
-\emph{Unused} & 0xd9000000 & 0xdfffffff \\
-Configuration registers & 0xe0000000 & 0xf7ffffff \\
-Local configuration regs & 0xf8000000 & 0xf8ffffff \\
-eMAC access & 0xf9000000 & 0xf9ffffff \\
-TCP/IP traffic (unused) & 0xfa000000 & 0xfaffffff \\
-RPC (unused) & 0xfb000000 & 0xfbffffff \\
-SATA (unused) & 0xfc000000 & 0xfcffffff \\
-\emph{Unused} & 0xfd000000 & 0xfeffffff \\
-Private DDR3 RAM & 0xff000000 & 0xffffffff \\
-\end{tabular}
-\end{center}
-
-\section{Virtual address space}
-
-The available virtual address space on a core is split into 2GB
-user-space access (addresses 0x0 -- 0x7fffffff) and 2GB for
-kernel-only access (addresses 0x80000000 -- 0xffffffff).
-
-The kernel-only space maps directly to physical address 0x0 until
-0x3fffffff, allowing access to all of private RAM with the default LUT
-mapping. This resembles mappings used in single address space
-operating systems and provides better performance when handling kernel
-objects than can be provided with classical operating systems, like
-Linux. Kernel objects can point to other objects directly and the
-mapping is identical across all cores. Also, physical addresses can be
-calculated simply by subtracting an offset, instead of via complicated
-mappings.
-
-Space is reserved at the top of this range to map all MPBs and all
-configuration registers, as well as the local APIC and one remappable
-4K page to map in a foreign core's private RAM, used for booting that
-core.  The rest of kernel virtual address space is unused. This
-implies that kernel objects can only be created in the lower 2GB of
-physical memory (ie. in private RAM), which is sufficient in
-Barrelfish, as kernel objects are never shared between cores.
-
-The user-space address range can be arbitrarily mapped to physical
-addresses.
-
-\section{Memory allocation}
-
-A memory allocation server (\texttt{mem\_serv}) is spawned for every
-on-line core in the system.
-
-Available shared RAM is equi-partitioned into 48 regions. Remaining
-shared RAM not fitting this partition is thrown away and is not
-usable. The reason for this is that the memory allocators are not able
-to handle allocation from unaligned memory regions and sizes that are
-not a power of two.
-
-The server gets given capabilities for all of the private RAM of the
-local core and \textbf{all of shared RAM}. This is necessary so that
-allocation of shared mappings is possible from every core's region
-without having to contact a designated memory allocator for this
-region of RAM, a feature not yet implemented.
-
-As shared RAM is handled identical to private RAM, the kernel is
-responsible for clearing a newly allocated page of memory from
-previous usage before allowing it to be mapped into the allocator's
-address space. As shared RAM resides outside the lower 2GB of physical
-address space, the kernel is incapable of accessing that RAM in order
-to clear it. For SCC, we have modified the kernel to instead neglect
-clearing the page, at the expense of protection when memory is reused
-from other address spaces.
-
-This issue is fixable however, either by reserving another remappable
-address range inside the kernel that can be used to map and clear the
-page before allowing the user to map it, at an expense of
-performance. Another way to fix it is to introduce a special memory
-allocator for shared RAM that would map and clear allocated RAM first
-into its own address space before granting it to the requesting
-address space.
-
-Per-core memory servers are necessary on SCC. Memory servers do not
-currently support allocation from multiple private RAM regions with
-overlapping address regions.
-
-\section{Interconnect driver}\label{sec:interconnect}
-
-In Barrelfish, an interconnect driver is the lowest-level part of a
-particular messaging mechanism. The inter-core interconnect driver for
-the SCC is based on the cache-coherent user-level message passing
-(CC-UMP) driver used by Barrelfish on x86 systems. With some
-modifications this mechanism reliably transports cache-line-sized
-messages through non-coherent shared memory on SCC.
-
-The modifications are:
-\begin{itemize}
-\item The size of a cache-line, and thus message, is 32 bytes.
-
-\item Memory for both the send and receive message channel is
-  allocated in the core's region of shared RAM that is initiating a
-  bind to another core, using the NUMA allocation features of
-  Barrelfish. These are currently not thread-safe and thus the
-  interconnect driver initialisation phase is currently not
-  thread-safe.
-
-\item Memory for the message channel is mapped as cacheable, message
-  passing buffer type, enabling the use of the write-combining buffer
-  for faster memory writes. For this, the implementation of the
-  virtual memory manager inside \texttt{libbarrelfish} had to be
-  extended to support the architecture-specific mapping flags.
-\end{itemize}
-
-While CC-UMP was originally optimized for cache-coherent transports, these
-optimizations do not hurt performance on SCC and we are not aware of other
-SCC-specific optimizations that CC-UMP does not already employ.
-
-However, the polling approach used by CC-UMP on Barrelfish to detect incoming
-messages is inappropriate on the SCC, since each poll of a message-passing
-channel requires a \texttt{CL1INVMB} operation followed by a load from DDR3
-memory.
-
-Consequently, an additional SCC notification driver (named
-\texttt{rck\_notify}) was implemented which augments the CC-UMP driver
-with notification support. For this, support for pluggable
-notification drivers was added to CC-UMP.
-
-The notification driver uses the on-tile MPB for efficiently
-communicating the identifiers of active message channels, and
-an inter-core interrupt as the notification mechanism. It is implemented
-mostly within the CPU driver on each core, as follows: \note{AB: Diagram?}
-
-\begin{itemize}
-\item A ring-buffer of IDs of those channels containing unread payload
-  is held in the receiver's MPB. The buffer is written only by senders and
-  read only by the receiver. However, there are two read-shared
-  cache lines before the buffer, holding the current write and current
-  read position, respectively.
-\item A buffer entry spans a cache-line (32 bytes). Currently, only a
-  16-bit channel ID is written to that cache-line, limiting the number
-  of distinct notifiable channels to 65,536. The rest of the space in
-  unused. Using a cache-line per ID allows a sender to write new
-  channel IDs to the buffer without having to read the cacheline for
-  already existing IDs first.
-\item A new capability type is used on the sender side, holding the
-  core ID and channel ID of the receiver core of the
-  notification. When invoked, the sender's CPU driver:
-  \begin{enumerate}
-   \item Acquires the test-and-set lock for the receiving core
-   \item Reads the current write position from the receiver's MPB
-   \item Writes the channel ID into the next slot in the reciever's MPB
-   \item Updates the current write position in the receiver's MPB
-   \item Reads the receiver's interrupt status
-   \item If no inter-core interrupt is pending, writes the status word
-         with the interrupt set to trigger a remote interrupt
-   \item Clears the test-and-set lock for the receiving core
-  \end{enumerate}
-\item On the receiver, a regular LMP endpoint capability is registered
-  in a special notification table inside the CPU driver. This table maps
-  channel IDs to local LMP endpoints that will be signalled on notification.
-  When the receiver core is interrupted, it looks up all pending channel IDs
-  present in the MPB ring-buffer, and dispatches an empty message on the
-  registered endpoint in the table. If no endpoint is registered, an error
-  is signalled.
-\item In user-space, the notification driver triggers the waitset used
-  to wait on incoming messages for the corresponding message channel,
-  activating the receive message handler in the generated stubs, which
-  are described in the following section.
-\end{itemize}
-
-In case of the receiver ring buffer being full when the sender tries
-to write a new channel ID, the sender aborts the process and returns
-with an error code to the sending user-space application, indicating a
-failed notification. The user-space application should try to notify
-the receiver again at a later point in time (currently unimplemented
-as we did not reach this case during our benchmarks). Rolling back the
-message send is not easily possible, as the receiver might have been
-actively polling for and already reading it.
-
-Allocation of new channel IDs is managed by the monitor of the
-receiving core as part of the bind process. The CPU driver does not
-allocate IDs.
-
-There are many design alternatives for an SCC interconnect driver, and
-the above should be regarded as only one point in the space.  At first
-sight, it may seem odd to use main memory (rather than the on-tile
-MPB) for passing message payloads, and to require a trap to the kernel
-to send a message notification.
-
-This design is motivated by the need to support many message channels
-in Barrelfish and, furthermore, more than one application running on a
-core.  The SCC's message-passing functionality does not appear to have
-been designed with this use-case in mind.
-We discuss this issue further in Chapter~\ref{chap:refl}. 
-
-We considered two further design alternatives: \emph{notification
-  trees} and \emph{payload in MPB}. The former we have implemented and
-benchmarked, but it turned out to have worse performance than the ring
-buffer implementation presented above.
-
-Notification trees use the same notification scheme as ring buffers,
-but employ a bitmap of channel IDs, represented as a two-level tree in
-the receiver's MPB. One bit for every distinct channel that can be
-notified. Tree nodes are of the size of one cache-line (256 bits). The
-tree's layout in the ring buffer is such that the root node occupies
-the first cache-line. All other nodes are leaves and are stored in
-left-to-right order after the root node. There are 255 leaves which
-contain a bit for each notifiable channel, yielding 65,280 notifiable
-channels. A bit set in the root node indicates that the corresponding
-leave contains set bits and should be scanned when the tree is
-traversed. In this scheme, sending a notification can never fail: A
-bit can either be set or is already set, in which case no further
-notifications need to be sent for the respective channel ID.
-
-Sending a notification for a given channel ID in this design requires
-the sender to:
-
-\begin{enumerate}
-\item Acquire the test-and-set lock for the receiving core
-\item Read the root node from the receiver's MPB
-\item Set the bit for the corresponding leaf node of the channel ID
-  in the root node
-\item Write the root node to the receiver's MPB
-\item Read the leaf node from the receiver's MPB
-\item Set the bit for the corresponding channel ID in the leaf node
-\item Write the leaf node to the receiver's MPB
-   \item Read the receiver's interrupt status
-   \item If no inter-core interrupt is pending, write the status word
-     with the interrupt set to trigger a remote interrupt
-\item Clear the test-and-set lock for the receiving core
-\end{enumerate}
-
-This mechanism requires 2 full cache-line reads and 2 full cache-line
-writes from/to the receiver's MPB and 2 bit operations as opposed to
-only two 32-bit reads and 2 full cache-line writes in the ring buffer
-scheme. We originally proposed notification trees, assuming the cost
-to access remote MPBs would be an order of magnitude lower, as well as
-cheaper bit operations on full cache-lines. After implementing and
-benchmarking this scheme, it turned out not to be the case. We assume
-the slow bit operations to be due to the size of the operands. Holding
-a full cache-line would require 8 integer registers on the Pentium.
-With only 7 present, we always have to go to memory in order to
-execute a bit-scan, an expensive operation, especially when the cache
-does not allocate on a write miss.
-
-The final design we devised is ``payload in MPB''. In this scheme,
-instead of notifying the receiver of a message in shared RAM, the
-message payload itself is written to the MPB, obliviating the need for
-shared RAM. The main drawback of this scheme is that it requires quite
-complicated book-keeping, as messages are variable size and might not
-fit into the rather small 8KB receive buffer.
-
-It also complicates managing quality of service, as multiple
-applications now compete for the same receiver MPB. This forbids
-receiving applications the use of the payload inside the MPB directly,
-as the MPB has to be freed up as quickly as possible to allow other
-competing applications to make progress. This requires copying the
-message out of the MPB into private RAM of the receiver, which is
-again a costly operation, especially as caches do not allocate on a
-write miss. We elaborate more on this issue in
-Chapter~\ref{chap:refl}.
-
-\section{Message passing stubs}
-
-In Barrelfish, message-passing stubs are the next layer of functionality
-above the interconnect driver, and implement typed variably-sized messages
-over various interconnects. They are generated by our stub-generation tool,
-named \emph{Flounder}.
-
-The Flounder backend for SCC message passing is derived from, and shares much
-code with, the backend for CC-UMP. The important differences are:
-
-\begin{itemize}
-\item The generated stubs are configured for a cache-line size of 32 bytes,
-  and thus the message-fragments used to transmit message payload are never
-  more than 32-bytes in size.
-\item The binding logic allocates and initialises the SCC notification
-  endpoints, and transmits their capabilities to the receiver.
-\item The code to send messages is modified to emit a notification either at
-  the end of a complete (application-level) message, or when the message
-  channel ring buffer is full and the sender needs to block. In this way,
-  needless notifications (for fragments of a high-level message) are avoided.
-\item The receive side never polls for incoming messages. When no more messages
-  are present in the channel, it instead blocks on a waitset that will be
-  signalled when an inter-core notification arrives.
-\end{itemize}
-
-\section{Bulk transfer}
-
-Bulk transfer shared memory is mapped the same way as CC-UMP
-memory on SCC (cacheable, MPB).  
-
-As shared memory is directly manipulated by the application for a bulk
-transfer region, the bulk\_prepare() function for SCC touches a random
-cacheline that is not of the bulk transfer region. This forces the
-write combine buffer to flush the last written cacheline out to
-memory (see Section 1.4.5 of~\cite{rockcreek_core_eas}). This needs
-to be done, as an application may have written an incomplete cacheline
-to the transfer area, to force that line out to memory before sending.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Hardware measurements}\label{chap:bench}
-
-Cost of assorted local operations: 
-
-\begin{center}
-\begin{tabular}{rl}
-operation & cycles \\
-\hline \\
-NOP system call & 200 \\
-RDTSC instruction & 14 \\
-XCHG instruction & 35 \\
-LOCK CMPXCHG instruction & 39 \\
-LOCK DEC instruction & 36 \\
-clear memory & 3 \\
-NOP instruction & 2 \\
-CL1INVMB & 1 \\
-\end{tabular}
-\end{center}
-
-Cost in cycles to write a complete 32-byte cache line (8 DWORD writes)
-to an on-tile MPB from a core on tile 0:
-
-\begin{center}
-\begin{tabular}{cc|cccccc}
-&  &\multicolumn{6}{c}{\textit{target tile x-coordinate}} \\
- &   & 0   & 1   & 2   & 3   & 4   & 5 \\ \hline 
-\multirow{4}{*}{\textit{y}} & 0 & 39  & 84  & 89  & 90  & 95  & 101 \\
- & 1 & 84  & 89  & 89  & 95  & 101 & 108 \\
- & 2 & 89  & 89  & 95 & 101 & 107 & 113 \\
- & 3 & 89  & 95  & 101 & 108 & 113 & 119 \\
-\end{tabular}
-\end{center}
-
-Cost to read a single DWORD from on-tile MPBs from tile 0 (this will
-pull the cache line into local L1 on tile 0):
-
-\begin{center}
-\begin{tabular}{cc|cccccc}
-&  &\multicolumn{6}{c}{\textit{source tile x-coordinate}} \\
- &   & 0   & 1   & 2   & 3   & 4   & 5 \\ \hline 
-\multirow{4}{*}{\textit{y}} & 0 & 20  & 63  & 69  & 72  & 78  & 84 \\
- & 1 & 63  & 69  & 72  & 78  & 84  & 90 \\
- & 2 & 69  & 72  & 78  & 84  & 90  & 96 \\
- & 3 & 72  & 78  & 84  & 90  & 96  & 102 \\
-\end{tabular}
-\end{center}
-
-\section{Memory map and shared memory areas}
-
-In this benchmark, a user-space application reads/writes repeatedly
-from/to shared memory, using different mapping configurations. Core 0
-executed this benchmark. All numbers presented are in machine cycles.
-
-\begin{center}
-\begin{tabular}{cccl}
-\hspace{3em} & Memory controller & average & total for 1,000,000 iterations \\
-\hline \\
-\multicolumn{4}{l}{DWORD from shared RAM (uncacheable):} \\
-\\
- & 0 & 97  & 97,338,585 \\
- & 1 & 121 & 121,492,066 \\
- & 2 & 105 & 105,348,809 \\
- & 3 & 134 & 133,690,789 \\
-\\
-\multicolumn{4}{l}{Cacheline to shared RAM (uncacheable):} \\
-\\
- & 0 & 779 & 778,680,899 \\
- & 1 & 972 & 971,920,810 \\
- & 2 & 843 & 842,761,220 \\
- & 3 & 1069 & 1,069,474,168 \\
-\\
-\multicolumn{4}{l}{Cacheline to shared RAM (MPB):} \\
-\\
- & 0 & 122 & 121,504,321 \\
- & 1 & 146 & 146,014,496 \\
- & 2 & 134 & 133,697,675 \\
- & 3 & 158 & 157,781,513 \\
-\end{tabular}
-\end{center}
-
-\section{Thread Switch Time}
-
-In this benchmark two threads are yielding between each  other in a
-ping-pong like benchmark. Therefore, Barrelfish's
-thread\_yield\_dispatcher function is used. This function donates the
-callers time-slice to the dispatcher pointed to by the argument to this
-function.
-
-A call to this function requires an endpoint capability to the
-partner, which needs to be exchanged between the threads at
-startup. One of the dispatchers acts as a server, calling export to
-offer the service to the nameserver, the other one as a client calling
-the bind function.
-
-The waitloops are broken as soon as both partners have the required
-endpoint capabilities set up. When looking at the numbers given in
-this benchmark, it is important to keep in mind that the domains might
-run some event processing code on scheduling.
-
-The decision to include those numbers in the measurements is on
-purpose for this analysis.
-
-The number of cycles given is from one thread to the partner and back
-to the original thread and therefore needs to be divided by two to get
-an approximation for the actual thread switch time.
-
-\begin{center}
-\begin{tabular}{rl}
-thread & cycles \\
-\hline \\
-server & 6732.79\\
-client & 6636.08\\
-\end{tabular}
-\end{center}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Evaluation of the implementation}\label{chap:eval}
-
-This chapter describes the effort required to bring up Barrelfish on
-the SCC, together with early micro- and application benchmark
-results. 
-
-\section{Development effort}
-
-Bringing up Barrelfish on the SCC first required a 32-bit ia32 port,
-since up to that point we had only targetted 64-bit Intel Archtecture
-platforms.  This port was carried out in advance by Simon using a
-mixture of real hardware and QEMU configured to emulate a Pentium
-processor, and substantially reduced the time required on actual SCC
-hardware. 
-
-The process was also helped by Orion Hodson's ARM port, and Richard
-Black's Beehive port, which threw up many 64-bit dependencies at an
-early stage.  In the event, most of these issues were resolved well
-before the SCC port started. 
-
-Lines of code, using David Wheeler's SLOCCount:
-
-\begin{itemize}
-% \item Using SLOCcount on only the x86-32 specific code yields 6108
-%   lines of C code and 130 lines of assembly code (not counting
-%   imported code, like libc or libm). Out of this, 70\% is kernel
-%   code.
-
-\item As of August 11, 2010, the x86-32 specific code yields 8705
-  lines of C code and 410 lines of assembly code (not counting
-  imported code, like libc or libm). Out of this, 6011 lines (69\%) is
-  kernel (CPU driver) code.
-
-\item In addition to the x86-32 specific code, 2235 lines of
-  SCC-specific C code and 130 lines of assembly code were written, 391 
-  lines (17\%) of these being CPU driver. This count does not include
-  the sections of x86-32 specific code that have workarounds for SCC
-  using \#ifdef constructs.
-\end{itemize}
-
-By and large, the bringup for SCC was straightforward:
-
-
-\begin{itemize}
-\item Porting back from x86-64 using a memory-window
-  based model for kernel state allowed us to keep the programming
-  model and general address space layout.  One minor issues was the
-  requirement to initialize shared RAM from
-  user-space.  This makes it unsafe to allow regular user-space
-  applications access to untyped memory, as they could snoop its
-  previous content without erasing the memory.
-
-\item At the time of the x86-32 port, most arch-generic Barrelfish
-  code was still mostly x86-64-specific and so time was spent on
-  separating out arch-specific quirks from otherwise generic code and
-  clean-up. 
-
-\item The message passing transport was designed within one
-  day. However, it turned out it was not as efficient as expected, due
-  to our (overly optimistic) assumptions about memory access latencies.
-
-\item Overall, the work took about 2 person-months.
-\end{itemize}
-
-At time of writing, we believe the major performance issues with our
-code are due to the SCC L2 caches' non-allocate-on-write policy. Our
-code is not optimized for this behavior and shows major
-inefficiencies, in particular on function call boundaries immediately after
-kernel crossings.
-
-% \section{Measurements}\label{sec:measurements}
-
-% %    * Breakdown of IPI pingpong benchmark (cores 0 \& 1): 16722
-% %     * Sender: Into kernel, up to rck\_send\_notification(): 687 cycles
-% %     * Sender: Time taken for rck\_send\_notification(): 605 cycles
-% %     * Sender: Upon receipt of message from peer: 7987 cycles
-
-% %    * cores 0 \& 2: 17372
-% %     * Sender: Into kernel, up to rck\_send\_notification(): 687 cycles
-% %     * Sender: Time taken for rck\_send\_notification(): 794 cycles
-% %     * Sender: Upon receipt of message from peer: 8224 cycles
-
-% %    * cores 0 \& 10: 17794
-% %     * Sender: Into kernel, up to rck\_send\_notification(): 688 cycles
-% %     * Sender: Time taken for rck\_send\_notification(): 927 cycles
-% %     * Sender: Upon receipt of message from peer: 8371 cycles
-
-% %    * As you can see, latency goes up the further the cores are away.
-
-\section{Microbenchmark: Notification via MPB}\label{sec:mpb_bench}
-
-We implemented a ping-pong notification experiment to evaluate the
-cost for OS-level notification delivery via message passing buffers
-(MPBs). MPB notifications are used in Barrelfish to notify a
-user-space program on another core of message payload arrival on a
-CC-UMP channel and are thus performance critical.
-
-The experiment entails two peer cores sending notifications back and
-forth. Based on their roles, we call these two cores \emph{initiator}
-and \emph{collaborator}, respectively. The experiment is driven by a
-user-space program on the initiator. After setup, one iteration of the
-experiment is carried out in several steps. The experiment as depicted
-by Figure~\ref{fig:mpbbench} is symmetric, thus we only describe the
-steps carried out and observed by the initiator:
-
-\begin{enumerate}
-\item The initiator's monitor calls a special system call to send a
-  message directly to the collaborator and control is transfered to the
-  initiator's CPU driver.
-
-\item The initiator's CPU driver writes the message into the collaborator's
-  MPB and sets the corresponding configuration registers of the collaborator
-  to raise its hardware INTR line.
-
-\item The collaborator receives the message and replies, by carrying out
-  steps 4, 1 and 2 in that order \note{AB: unclear}.
-
-\item The initiator's CPU driver traps upon receiving the interrupt,
-  determines the cause for the trap, reads the message from its MPB
-  and transfers control back to its monitor, which records the time
-  taken for all 4 steps.
-\end{enumerate}
-
-\begin{figure}
-  \centering
-  \includegraphics[width=6cm]{figures/exp1}
-  \caption{MPB ping-pong experiment setup}
-  \label{fig:mpbbench}
-\end{figure}
-
-% \note{AB: Need to describe clock speed config somehwere}
-
-We carried out this benchmark between core 0 and all other cores
-inside the system, measuring the round-trip latency for an MPB
-message containing one cacheline, and halved the result to extrapolate
-the one-way latency. Figure~\ref{fig:mpbresults1} shows the result, as
-well as a break-down into interesting steps of the experiment.
-
-\begin{figure}
-  \centering
-  \includegraphics[width=\textwidth]{plots/mpbbench/mpbbench_oneway.pdf}
-  \caption{MPB one-way messaging latency from core 0
-    (\emph{Overall}). \emph{Send} shows cumulative latency in steps 1
-    and 2. \emph{Receive} shows latency of step 4.}
-  \label{fig:mpbresults1}
-\end{figure}
-
-% Absolute numbers for IPI benchmark with optimization \texttt{-O3}, no
-% interrupts, array: \note{Please clarify what this benchmark is what
-%   ``array'' means.  Also, assume these are cycles as well?}
-
-% \begin{center}
-% \begin{tabular}{ p{0.2\textwidth}|p{0.3\textwidth}}
-% op & cycles \\
-% \hline \\
-% send: & 800 (includes user-space): \\
-% receive: & 2596 (includes user-space): \\
-% round-trip with both monitors: &  7026 \\
-% extrapolated one-way latency for short message: & 3513\\
-% \end{tabular}
-% \end{center}
-
-\section{Microbenchmark: Inter-processor interrupt (IPIs) latency}
-
-We modify the message latency ping-pong experiment described in
-Section~\ref{sec:mpb_bench} to approximate the cost for hardware-level
-inter-processor interrupt delivery. IPIs are used in Barrelfish to
-notify another core of message arrival and are thus performance
-critical.
-
-The core roles are kept and the numbers presented are still for two
-cores on the same tile. After setup, one iteration of the experiment
-is carried out in 5 steps, as depicted by Figure~\ref{fig:ipibench}:
-
-\begin{enumerate}
-\item The initiator's monitor calls a special system call to send a
-  message directly to the collaborator and control is transfered to the
-  initiator's CPU driver.
-
-\item The initiator's CPU driver writes the message into the collaborator's
-  MPB and sets the corresponding configuration registers of the collaborator
-  to raise its hardware INTR line.
-
-\item The collaborator's CPU driver traps upon receiving the interrupt,
-  determines the cause for the trap, reads the message from its MPB
-  and immediately replies with another message to the initiator, using
-  the mechanism of step 2, upon which the initiator's CPU driver
-  traps.
-
-\item Upon determining the trap cause, the initiator's CPU driver
-  reads the message from its MPB.
-
-\item The initiator's CPU driver transfers control back to its
-  monitor, which records the time taken for all 4 steps.
-\end{enumerate}
-
-% \note{AB: This is more than an IPI!}
-
-\begin{figure}
-  \centering
-  \includegraphics[width=6cm]{figures/exp2}
-  \caption{IPI ping-pong experiment setup}
-  \label{fig:ipibench}
-\end{figure}
-
-In this version of the experiment, which ran over 100,000 iterations,
-eliminating the first 10\% of values, the average time for an IPI
-round-trip is 8746 cycles. Table~\ref{tab:ipiresults} presents a
-break-down of the measured costs. The measured average latency for
-step $i$ is denoted as $\lambda_i$. We did not collect measurements
-for all steps individually and some measurements are only made for
-steps in combination.
-
-We can then approximate the latency $\lambda_{IPI}$ involved to
-deliver the IPI, including the time to execute the trap, by
-$\lambda_{IPI} = \frac{\lambda_3 - (\lambda_2 + \lambda_4)}{2}$, the
-total time spent inside the peer kernel, minus the time to send and
-receive an IPI inside the local kernel, divided by two to yield the
-time needed for only one trap (we are in a ping-pong loop).
-
-Note that this is an optimistic approximation. As the local side
-includes user-code to drive the benchmark, the measured latencies
-inside the local kernel might be too large, due to missing cache lines
-caused by executing user code. As this cost does not occur on the peer
-kernel, where only kernel code is executed, the real cost for an IPI
-might be higher. Furthermore, we only measured the cost for two
-kernels on the same tile. The cost to deliver an IPI between cores of
-far away tiles might be slightly higher.
-
-\begin{table}
-  \centering
-  \begin{tabular}{p{0.2\textwidth}|p{0.2\textwidth}}
-    op & cycles \\
-    \hline \\
-    $\sum_{i=1..5}{\lambda_i}$ & 8746 \\
-    $\lambda_1 + \lambda_2$ & 1135 \\
-    $\lambda_4 + \lambda_5$ & 3864 \\
-    $\lambda_2$ & 684 \\
-    $\lambda_3$ & 3662 \\
-    $\lambda_4$ & 1754 \\
-    $\lambda_{IPI}$ & \textbf{612} \\
-  \end{tabular}
-  \caption{Measured and extrapolated IPI benchmark latencies}
-  \label{tab:ipiresults}
-\end{table}
-
-We consider a latency of at least 612 cycles to deliver an IPI very
-high for it to be useful as a signaling primitive for the majority of
-message sends in a message-passing system like Barrelfish.
-
-\section{Application-level benchmarks}
-
-The only other software environment presently available on SCC uses a
-separate instance of the Linux kernel on each core. Above this runs
-RCCE~\cite{intel:rcce}, a library for light-weight, efficient
-communication that has been co-designed with SCC as a research vehicle
-for message-passing API design on non-cache-coherent many-core chips,
-and as such is highly optimized for this platform. RCCE runs in
-user-mode with raw access to the MPBs, providing basic point-to-point
-message passing functionality as well as a set of higher-level
-primitives, such as barriers and a reduce operation, akin to those
-found in MPI~\cite{mpi}.
-
-We implemented a substrate supporting the RCCE message-passing
-interface using Barrelfish stubs and interconnect drivers for
-messaging, and thus can securely support multiple applications. We
-evaluated the NASA benchmarks shipped with RCCE to compare the
-performance achieved on Barrelfish to a system running 48 instances of
-Linux, as used at Intel.
-
-Figures \ref{fig:appresults_total} and \ref{fig:appresults_speedup}
-show the result of this comparison. We can see that at the application
-level, when a single application is run, Barrelfish does show only
-slightly lower performance than 48 Linux instances. We attribute this
-to the early version of our port. There is no reason why Barrelfish
-should not have identical performance to 48 instances of Linux when
-only a single application is run. We furthermore expect Barrelfish to
-have better performance than the Linux setup when multiple
-applications need to be scheduled on the SCC.
-
-\begin{figure}
-  \centering
-  \includegraphics[width=.5\textwidth]{plots/rcce_bench/rcce_lu.pdf}%
-  \includegraphics[width=.5\textwidth]{plots/rcce_bench/rcce_bt.pdf}
-  \caption{RCCE benchmark absolute performance comparison}
-  \label{fig:appresults_total}
-\end{figure}
-
-\begin{figure}
-  \centering
-  \includegraphics[width=.5\textwidth]{plots/rcce_bench/rcce_lu_speedup.pdf}%
-  \includegraphics[width=.5\textwidth]{plots/rcce_bench/rcce_bt_speedup.pdf}
-  \caption{RCCE benchmark speedup comparison}
-  \label{fig:appresults_speedup}
-\end{figure}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Reflections on SCC as a platform}\label{chap:refl}
-
-This chapter contains a set of reflections on the challenges of
-implementing Barrelfish on SCC hardware.  It should be regarded as a
-snapshot of our current thinking, rather than a definite set of
-conclusions.  Indeed, as our understanding of how to effectively
-exploit SCC as a platform evolves, we expect some of these views to
-change.  We would warmly welcome any feedback or suggestions with
-regard to this points.  
-
-\section{Build environment}
-
-SCC is a straightforward platform for us to build Barrelfish for -- we
-already cross-compile for 32- and 64-bit Intel Architecture machines,
-and the P54C is fully supported by gcc. 
-
-Two features of the SCC development environment could be improved (or
-were during the porting process): 
-
-\begin{itemize}
-\item The tools provided for board setup, initialization, console,
-  etc. were all GUI-based, making it impossible to script commonly
-  used processes.  All the boot tools used for Barrelfish at ETHZ and
-  MSR are command-line based, and fully automated (for example, our
-  regression tools start by powering on the machine and turn the
-  hardware off when done) and we use build-and-boot scripts
-  extensively.  The bringup process would have been considerably
-  faster with CLI tools for board control.
-
-  Many of these tools exist (partly as a result of our feedback), but
-  it would be helpful if the command-line interface was regarded as a
-  first-class requirement. 
-
-\item A proper console driver (a low-level, bidirectional character
-  channel between the HCPC would have been very useful.  Our other
-  platforms (even Beehive) assume a low-level UART or analogous
-  hardware.  Our initial solution involved emulating a VGA character
-  frame buffer in shared memory, and reading this out from the host
-  PC, but this is highly unsatisfactory, and a better solution is a
-  synchronized ring buffer of characters in DDR3 together with a
-  logging daemon on the host which DMAs this regularly to the host,
-  and routes this to a Unix socket, for example.  Once again, GUIs are
-  of limited use here (though we appreciate their value in demos).
-
-\end{itemize}
-
-\section{Debugging}~\label{debugging}
-
-The SCC platform has no debugging facility. Instead, memory regions
-for per-core kernel log buffers were reserved on every core and later
-dumped into files using external memory reader tools provided.  This
-provided for convenient debugging, especially as we already use such a
-technique for fine-grained tracing on x86-64 hardware.  We found that
-log buffers could always simply be made big enough to carry the whole
-record needed for one debugging or performance measuring session.
-
-However, debugging timing-related issues, like races, was hard
-using this scheme, as there is no global clock inside SCC and so
-messages could not be reliably timestamped, making it unclear which
-messages are emitted at what times, when debugging processes that
-involve interactions between cores.  
-
-A preliminary workaround for this would be to derive clock skew
-information online and log this when cores start, post-processing this
-information by extending our existing trace analysis tools.   Adapting
-our tracing framework to use Lamport clocks would be a more elegant
-solution. 
-
-In the longer term, part of our research agenda is to deal with the 
-general clock problem in arbitrary machines, and so in this respect
-SCC is a useful case for us, the lack of synchronized clocks is
-actually a useful feature of the platform.  
-
-\section{Lack of cache coherence}
-
-We experienced no significant problems with Barrelfish due to the lack
-of coherent caches on the SCC.  This was not a huge surprise for us,
-but it was a nice confirmation of our expectations, and a validation
-of the OS design. 
-
-As with the lack of clock synchronization, we regard the lack of
-coherent caches as a useful feature from a research perspective.
-Indeed, we would like to be able to (perhaps selectively) turn off
-cache coherence in more mainstream Intel processors. 
-
-Much more useful to us would be the ability to have more than one
-memory write per core in flight (in particular, a simple write buffer
-would dramatically increase performance). 
-
-\section{The L2 caches}
-
-The caches (both L1 and L2) do not allocate a cache line on a write miss,
-treating it as an uncached write to memory. Furthermore, the M-unit allows the
-core to have only one outstanding write transaction; when such a write miss
-occurs, any subsequent memory or L2 cache access causes the core to stall
-until the write to memory completes (typically around 100 cycles on the SCC).
-Combined with the lack of a store buffer, this policy causes severe performance
-degradation for word-sized writes to data not already present in the cache.
-When storing to a fresh stack frame, or saving registers in a context switch
-path, each individual write instruction will stall the processor on memory
-access.
-
-For example, in Barrelfish kernel code, we observed that simple
-function calls in hot paths of the system regularly have an order of
-magnitude greater overhead (in cycles) on SCC than function calls on
-newer x86 processors. Our tentative explanation is that caller-saved
-registers will be pushed onto the stack upon a function call and then
-restored upon return from the function. Both cases miss in the cache,
-but the call incurs particularly high overhead, as each individual
-write goes to memory, and the cache lines are only allocated when
-reading them on return. We do not yet have an explanation of why this
-is occuring every time after entering the kernel -- the logical
-behaviour for it would be to only occur once when the cache is
-cold. We have also observed substantially increased costs for
-exception and trap handling, which may also be caused by the high cost
-of saving register state to memory not present in the cache.
-
-It is possible that an OS workload is a particularly bad case for this
-cache design -- systems software is well-known for exhibiting usage
-patterns very different to parallel HPC applications.
-More work is required to both confirm this as the cause, and explore possible
-solutions. Ideally this could be fixed in hardware, through changes to the
-cache architecture, the addition of a store buffer in the M unit, or simply
-allowing the write-combining buffer to be used for non-message-buffer memory,
-which would mitigate the problem by allowing full cache-line writes to memory.
-A possible software fix would involve reading from each cache line before it
-was written, to ensure its presence in the cache; in the case of context save
-code this could be done explicitly, but for stack access would probably
-require compiler modifications.
-
-\section{Message-passing memory}
-
-The ability to bypass the L2 cache for areas of address space
-designated messaging buffers, combined with an efficient L1
-invalidation of all such lines, is one of the most interesting
-features of SCC. 
-
-As with other message-passing features of the SCC, this functionality
-may have been designed with a single-application system in mind.  When
-using MB memory for the operating system, as in Barrelfish, we
-typically have a number of communication channels in use at any one
-time. 
-
-For this reason, although the CL1INVMB instruction is extremely cheap to
-execute, its effects may be somewhat heavyweight, since it invalidates
-all messaging data, some of which we may wish to have remain in the L1
-cache. 
-
-It would be useful for us to have more fine-grained control over the
-L1 cache.  An instruction which would
-invalidate a region around a given address would be ideal for us.  
-The size of this region would typically be a cache line, but it would
-be fine if this was implementation-defined (as long as we could find
-out at run time).
-
-In our message-passing implementations, we generally know precisely
-which addresses we wish to invalidate.  Consequently, we would find
-such fine-grained cache control very useful. 
-
-Better still would be to extend such functionality to the L2.
-Receiving data in an MPB generally involves an L1 miss (ideally to
-the on-tile MPB, but see below why this is problematic), followed by
-a miss to main memory caused by copying the data somewhere where it
-can be cached in L2, followed by a second L2 miss when the data needs
-to be subsequently read. 
-
-This penalty can be mitigated somewhat by performing a read of the
-destination location (and so populating the L2) before writing the
-received data there.  
-
-This latter miss penalty itself is generally doubled, due to the
-non-write-allocate property of the L2: there's the immediate stall
-while the write completes to DDR3, followed by an L2 miss later when
-the core tries to use it.  This is ironic: the cache
-architecture seems to prohibit any efficient zero-copy I/O
-implementation, since if it's from MPB, it will be flushed any time
-further I/O occurs. 
-
-Our position overall is that explicit cache management is good, and
-Barrelfish (and, we believe, other OS code) would benefit from future
-SCC implementations providing much more fine-grained control over it. 
-
-\section{Lookup tables}
-
-From the perspective of system software design, the SCC Lookup tables
-for physical memory are an interesting feature of the
-design.  In particular, being able to address any other core's
-configuration registers (including interrupt and reset pins), and that
-core's lookup table as well, is a powerful feature. 
-
-At present, we do not exploit this functionality fully in Barrelfish,
-other than for booting secondary cores and sending inter-processor
-interrupts, plus the use of the TAS bit for interlocking access to the
-on-tile MPB.   More novel uses of the LUTs are an interesting area of
-future research for us. 
-
-An interesting possibility, not explored by us at this stage, is to
-use the LUTs to completely ``sequester'' cores: by removing a core's
-access to its own LUT entries, its ability to access any system
-resources not its own can be tightly restricted.  This would allow us
-to provide stronger fault-containment properties than are possible in
-a shared-memory system, for example, which means that the
-message-passing structure of Barrelfish combined with suitable
-distributed algorithms at the intra-OS routing layer (which is a focus
-on ongoing work at ETH) may result in an OS tolerant to partial
-crash-failures or even Byzantine faults. 
-
-Another direction is to explore using the LUT for context-switching by
-integrating it much more into the OS, rather than using the static
-mapping we have now.  We currently have no performance data for how
-quickly updates to the LUT take, however, which will be a factor in
-how useful such operations are in practice.
-
-\section{Lock (TAS) bits}
-
-Not having TAS bits on the SCC would have caused serious problems
-for us.  However, we did not encounter any need for more than one
-TAS bit per core.  Since almost everything in Barrelfish is performed
-with a messaging model, we simply use the TAS bit to synchronize
-access to the receiving core's messaging and IPI state.  One lock is
-enough.  
-
-Our code would be simplified, however, if there was an operation to
-atomically assert IRQ on a remote core only if it has not already been
-asserted.
-
-\section{The on-tile message passing buffer}
-
-We experienced two significant challenges when using the on-tile
-message passing buffers on SCC.  These challenges are related, but
-different. 
-
-\subsection{Size}
-
-We are not the first to suggest that the on-tile MPBs are small. Small
-buffers mean that message queues have to be short.  If messages cannot
-be lost (a typical design assumption for message-passing applications,
-and at present also the case for Barrelfish), this means head-of-line
-blocking.  The smaller the buffer, the  shorter the queues, which
-means tighter coupling between communicating processes, making
-blocking on sends more likely. 
-
-Barrelfish uses message-passing throughout for communication, and
-consequently requires a large number of independent message channels
-to share the MPBs.   This leads to the question of how to allocate
-space in the MPBs to message channels.  Assuming (for simplicity at
-this stage) that each channel is allocated resources on the tile where
-its destination core resides, the options are:
-
-\begin{enumerate}
-\item Allocate a fixed portion of the on-tile MPB to each channel for
-  payload.  The minimum allocation is realistically a cache line (32
-  bytes), allowing a maximum of 256 incoming channel end-points per
-  core in the 8192 bytes available.   This is quite small (think
-  sockets), and even so allows only a single cacheline of buffering.
-  Giving each channel a buffer of 8 cache lines would only allow us 32
-  message channels per core, which is impractical. 
-\item Allocate a fixed portion of the on-tile MPB for channel
-  metadata, and pass payloads in DDR3 RAM.   Without inter-core
-  synchronization, this still requires a cache line per channel to
-  avoid corruption due to concurrent writes, limiting the number of
-  channels again to 256. 
-\item Allocate channel metadata in the on-tile MPB in units smaller
-  than a cache line, and use the TAS registers to mediate access.
-  With 16-bit pointers in memory, this allows 2048 channels per core,
-  at the cost of TAS-implemented spinlocks to prevent corruption.
-  This channel limit may be enough for Barrelfish, as we might then be
-  able to use the MPB locations as a cache for active channels and
-  ``swap'' idle channels to memory (though we have no idea if the
-  workloads would make this feasible or not). 
-\item Multiplex all Barrelfish channels onto a single channel per pair
-  of cores, requiring only 47 end-points in the on-tile MPB but kernel
-  code to demultiplex incoming messages.  This allows 170 bytes of
-  buffer per core pair, still small, but possibly useful for
-  Barrelfish (which messages are small).  The penalty here is a kernel
-  crossing, however (and see below for more on multiplexing). 
-\item Do away entirely with channels at this level, and since have
-  each core take out a spinlock on a destination core (via TAS),
-  followed by dynamic allocation in the whole 8k block.  
-\end{enumerate}
-
-\subsection{Multiplexing}\label{sec:mpbmux}
-
-The single most serious limitation of SCC as a platform for a
-message-passing OS like Barrelfish is the inability to securely
-multiplex the on-tile MPBs without a kernel-mode transition on the
-message path.    An operating system on the SCC must mediate access to
-the MPBs to ensure safe sharing of the buffers between applications. 
-This issue does not arise if the SCC is only running a single MPI
-application. 
-
-This is ironic, since the very high performance of loads from and
-stores to the on-tile MPB is completely swamped by the cost of kernel
-crossing to validate the access.  We have, to date, been unable to
-come up with a good workaround for this. 
-
-This strongly suggests that the intended use-case for the MPBs was
-single-application scientific computing, or perhaps the SCC chip as a
-dedicated, single-user ``accelerator'' (like a GPU), rather than a
-main processor in its own right.  
-
-Let's look at this issue in more detail. Like most resources in a
-computer, the MPBs can be multiplexed in space, and in time. 
-
-\subsubsection{The MPBs can't be efficiently space-multiplexed between
-  applications} 
-
-Space-multiplexing the MPBs requires a protection mechanism to divide
-the buffer between applications or other resource principals.  For
-main memory, this is performed by each core's MMU (on the SCC, the
-LUTs can do this as well).  The OS can allocate memory
-between different virtual address spaces in advance, but protection is
-enforced in hardware on every load or store (by the TLBs).  
-
-This doesn't work with the MPBs, since the MMU can only guarantee
-protection at page granularity, and each core's MPB is only two
-pages.  Two applications per core is better than one, but not by
-much. 
-
-The only way to enforce protection on MPB memory at a finer
-granularity is to delegate to the kernel the ability to read/write MPB
-memory, and pay the cost of a system call on every load and store. 
-
-As an additional cost, since multiple cores can be expected to be
-accessing each tile's MPB (Barrelfish makes extensive use of ``message
-channels'' between application dispatchers on different cores), write
-access to each core's memory must be done under a lock (hence the use
-of the TAS bit for each core to protect the MPB). 
-
-\subsubsection{The MPBs can't be efficiently time-multiplexed between
-  applications}
-
-Time-multiplexing the MPBs require copying each application's state
-into or out of the MPBs on a context switch, or performing this
-lazily.   This is potentially 8kb of message data, a substantial
-context-switch overhead (see the L2 cache discussion above). 
-
-It's actually worse than that.  Unlike memory which is under the
-exclusive use of an application, memory used for communication between
-applications on different cores is shared between a pair of
-principals.  Time-multiplexing on-tile MPB memory entails highly
-complex co-scheduling of communicating principals on different cores,
-which severely constrains the system-wide schedule and requires
-considerable communication overhead in itself. 
-
-\vspace{12pt}
-
-In summary:
-\begin{itemize}
-\item Lack of fine-grained protection prevents efficient space-sharing
-  of on-tile MPB without a kernel mediating all accesses. 
-\item The fact that the buffers are inherently shared between cores
-  (because they are used for communication) prevents efficient
-  time-sharing without a kernel mediating all accesses. 
-\item The cost of kernel entry and exit dwarfs any performance gain
-  from the fast on-tile memory. 
-\end{itemize}
-
-\section{Dynamic Voltage and Frequency Scaling}
-
-The flexibility of the dynamic voltage and frequency scaling features
-of the SCC look particular interesting.  Unfortunately, to date we
-have not explored how to use them in Barrelfish. 
-
-\section{System Interface}
-
-We are only beginning to exploit the System Interface as anything 
-more than a development / boot feature.  A new Barrelfish interconnect
-driver which spans the PCI Express bus and allows seamless communication
-between Barrelfish dispatchers on SCC cores and host PC cores is in
-development. 
-
-So far, we think the design of the software-visible aspects of the
-System Interface is nearly ideal from an OS design perspective.
-In particular, exposing flits to system software on the host machine
-allows us great  flexibility in how to communicate across the PCI
-Express bus. 
-
-In general, as OS designers we favor exposing more hardware mechanism (and
-thereby increasing policy freedom) as much as possible, unless this
-entails removing functionality from the fast data path which is
-critical to performance (as would be the case with virtual address
-translation, for example). 
-
-\section{Interrupt latency and notification}
-
-A second reason for the relatively leisurely performance of Barrelfish
-on SCC is the cost of kernel crossings, coupled with the need to
-perform them frequently for messaging (see Section~\ref{sec:mpbmux}).
-This is the case both for system calls and interrupts, since asserting
-IRQ is the only way to send notifications to cores (rather than
-waiting for polling to complete). 
-
-Part, but not all, of the overhead is due to L2 cache performance and
-lack of write-allocation.  
-
-As OS designers, we would really appreciate a fast way to transition
-to kernel mode, and hardware which allows us to something useful and
-fast when we get there (such as scratch registers, or alternative
-register banks).  This is an area where the ARM architecture really
-shines. 
-
-In addition, our experience with Barrelfish so far suggests that some
-kind of inter-core notification mechanism is an important complement
-to polled message-passing support.  The fact that we can access
-interrupt pins on cores remotely on the SCC is very nice in this
-regard, but even better would be some kind of fast user-space control
-transfer.  One option is to introduce address space identifiers (these
-should be orthogonal to virtualization in any case), and cause a
-lightweight same-address-space jump if and only if that address space
-is running. 
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Historical features}\label{chap:historical}
-
-This chapter described features once present in older versions of
-Barrelfish that have been deprecated or superseded by newer
-functionality.
-
-\section{Console driver}
-
-Up to \verb+release2012-03-02+, there is no support for serial or VGA
-console hardware on the SCC, so the CPU driver contains no kernel-mode
-support for either and the Barrelfish user-level UART and VGA drivers
-are not supported.
-
-Instead, console output is written into a core-local log buffer
-starting at address \texttt{0xb8000} in private RAM, which can be read
-by the \texttt{sccDump} tool on the host. The buffer size is
-configurable at compile time and defaults to 16,000 bytes.
-
-This technique evolved from the x86 VGA driver and is why the buffer
-originates at address \texttt{0xb8000}, the x86 text-mode buffer. We
-have removed VGA control character emission and are instead writing C
-strings as given into the buffer. This turned out to be the simplest
-way to achieve readable console output without having to write
-additional tools on the host to receive console characters emitted by
-kernels running on the SCC.
-
-We have developed a shell script to run on the host to periodically
-re-read a specified core's log buffer at a frequency of roughly 10
-times a second and output it to the host's console, so the log buffer
-can be displayed analogous to a monitor displaying the contents of
-video memory. As it evolved from the x86 VGA driver, our console
-driver will rearrange the contents of the log buffer when its capacity
-exceeds by assuming an 80x25 character matrix layout and moving all
-rows ``up'' by one matrix row position, eliminating the top row,
-freeing up another row of characters for more console output, just
-like a VGA driver would produce a line feed on an x86 VGA
-terminal. When the terminal on the host has equal dimensions, this
-technique provides an identical effect on the host terminal.
-
-A drawback with this technique despite suboptimal performance and
-logging capabilities is the inability to map console output across
-cores to a global timeline. There is no global clock inside the SCC,
-so timestamps on log messages do not help. We elaborate more on this
-in Section~\ref{debugging}.
-
-Obviously, this technique is a kludge and does not represent what
-could be done if proper console support were provided via the SCC
-system interface by additional software written on the host. We assume
-that standard UART support via the system interface would provide
-sufficient performance while moving all buffering capabilites into the
-host and providing a single concentrator for console output by all
-cores of the SCC simultaneously, eliminating the global timeline
-problem.
-
-\section{MPB emulator}
-
-As part of development, an MPB emulator for x86-32 was created. It was
-available up to version \verb+release2012-03-02+. The emulator is
-implemented as a device driver for the SCC CPU driver and replaces the
-original SCC device driver, exporting an identical interface.
-
-This emulator was used for functional testing and debugging of the SCC
-user-space interconnect driver and message passing stubs, as well as
-the ported RCCE library and user-space applications, without the
-need for access to a real SCC.
-
-As the emulator allowed us to compile and run the SCC CPU driver
-largely unmodified on a standard ia32 core, it was also used for
-initial testing of the SCC boot process, before gaining access to real
-SCC hardware for the first time.
-
-The emulator uses a region of unmapped RAM on an x86 for the
-MPBs and sends inter-core interrupts using the local APIC IPI
-mechanism. Configuration registers are unsupported. Core IDs are
-reported from the local APIC core ID register.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\bibliographystyle{abbrv} 
-\bibliography{defs,barrelfish}
-
-\end{document}
-
-\end{document}
diff --git a/doc/005-scc/figures/exp1.pdf b/doc/005-scc/figures/exp1.pdf
deleted file mode 100644 (file)
index d1dc1f9..0000000
Binary files a/doc/005-scc/figures/exp1.pdf and /dev/null differ
diff --git a/doc/005-scc/figures/exp1.svg b/doc/005-scc/figures/exp1.svg
deleted file mode 100644 (file)
index f3569f3..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="exp1.svg">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;">
-      <path
-         id="path3652"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective3602"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective4274"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8"
-       style="overflow:visible">
-      <path
-         id="path3652-7"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4513"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-0"
-       style="overflow:visible">
-      <path
-         id="path3652-7-6"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4541"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-5"
-       style="overflow:visible">
-      <path
-         id="path3652-7-9"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4569"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-9"
-       style="overflow:visible">
-      <path
-         id="path3652-7-0"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4597"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-1"
-       style="overflow:visible">
-      <path
-         id="path3652-7-7"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4625"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-11"
-       style="overflow:visible">
-      <path
-         id="path3652-7-5"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4653"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective4675"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-7"
-       style="overflow:visible">
-      <path
-         id="path3652-7-67"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="375"
-     inkscape:cy="560"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-global="true"
-     inkscape:snap-bbox="true"
-     inkscape:snap-midpoints="true"
-     inkscape:window-width="1200"
-     inkscape:window-height="1901"
-     inkscape:window-x="-6"
-     inkscape:window-y="-6"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3616" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93606043;stroke-opacity:1"
-       id="rect2818"
-       width="149.56393"
-       height="99.563942"
-       x="120.46803"
-       y="82.330215"
-       ry="5.9745607" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.83757281;stroke-opacity:1"
-       id="rect2818-4"
-       width="149.66243"
-       height="79.66243"
-       x="125.16879"
-       y="242.69975"
-       ry="4.7803254" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="166.91394"
-       y="284.63818"
-       id="text3618"><tspan
-         sodipodi:role="line"
-         id="tspan3620"
-         x="166.91394"
-         y="284.63818">Monitor</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="156.59363"
-       y="142.21819"
-       id="text3622"><tspan
-         sodipodi:role="line"
-         id="tspan3624"
-         x="156.59363"
-         y="142.21819">CPU Driver</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.90142637;stroke-opacity:1"
-       id="rect2818-7"
-       width="134.59856"
-       height="102.59857"
-       x="354.95071"
-       y="82.812889"
-       ry="6.156661" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.79563719;stroke-opacity:1"
-       id="rect2818-4-2"
-       width="135.07434"
-       height="79.648659"
-       x="354.92566"
-       y="242.28786"
-       ry="4.7794991" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="386.91394"
-       y="284.63818"
-       id="text3618-7"><tspan
-         sodipodi:role="line"
-         id="tspan3620-2"
-         x="386.91394"
-         y="284.63818">Monitor</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="386.59363"
-       y="142.21819"
-       id="text3622-2"><tspan
-         sodipodi:role="line"
-         id="tspan3624-6"
-         x="386.59363"
-         y="142.21819">CPU Driver</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 190,242.36218 0,-60"
-       id="path4317" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 430,182.36218 0,60"
-       id="path4317-1" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.14568949px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 270.53496,132.36202 79.46504,0"
-       id="path4317-4" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.14568949px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 350.68117,142.36218 -79.46505,0"
-       id="path4317-4-9" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 200,181.53416 0,60"
-       id="path4317-7" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 420,243.1902 0,-60"
-       id="path4317-3" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="169"
-       y="221.36218"
-       id="text4695"><tspan
-         sodipodi:role="line"
-         id="tspan4697"
-         x="169"
-         y="221.36218">(1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="304"
-       y="123.36218"
-       id="text4699"><tspan
-         sodipodi:role="line"
-         id="tspan4701"
-         x="304"
-         y="123.36218">(2)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="409"
-       y="222.36218"
-       id="text4707"><tspan
-         sodipodi:role="line"
-         id="tspan4709"
-         x="409"
-         y="222.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="310"
-       y="169.36218"
-       id="text4715"><tspan
-         sodipodi:role="line"
-         id="tspan4717"
-         x="310"
-         y="169.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="307"
-       y="173.36218"
-       id="text4719"><tspan
-         sodipodi:role="line"
-         id="tspan4721"
-         x="307"
-         y="173.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="308"
-       y="169.36218"
-       id="text4723"><tspan
-         sodipodi:role="line"
-         id="tspan4725"
-         x="308"
-         y="169.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="306"
-       y="168.36218"
-       id="text4727"><tspan
-         sodipodi:role="line"
-         id="tspan4729"
-         x="306"
-         y="168.36218">(3)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="210"
-       y="222.36218"
-       id="text4731"><tspan
-         sodipodi:role="line"
-         id="tspan4733"
-         x="210"
-         y="222.36218">(4)</tspan></text>
-  </g>
-</svg>
diff --git a/doc/005-scc/figures/exp2.pdf b/doc/005-scc/figures/exp2.pdf
deleted file mode 100644 (file)
index 1cab093..0000000
Binary files a/doc/005-scc/figures/exp2.pdf and /dev/null differ
diff --git a/doc/005-scc/figures/exp2.svg b/doc/005-scc/figures/exp2.svg
deleted file mode 100644 (file)
index 0b5b288..0000000
+++ /dev/null
@@ -1,397 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="exp2.svg">
-  <defs
-     id="defs4">
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;">
-      <path
-         id="path3652"
-         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <inkscape:perspective
-       id="perspective3602"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective4274"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8"
-       style="overflow:visible">
-      <path
-         id="path3652-7"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4513"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-0"
-       style="overflow:visible">
-      <path
-         id="path3652-7-6"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4541"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-5"
-       style="overflow:visible">
-      <path
-         id="path3652-7-9"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4569"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-9"
-       style="overflow:visible">
-      <path
-         id="path3652-7-0"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4597"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-1"
-       style="overflow:visible">
-      <path
-         id="path3652-7-7"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4625"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-11"
-       style="overflow:visible">
-      <path
-         id="path3652-7-5"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-    <inkscape:perspective
-       id="perspective4653"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <inkscape:perspective
-       id="perspective4675"
-       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
-       inkscape:vp_z="1 : 0.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 0.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend-8-7"
-       style="overflow:visible">
-      <path
-         id="path3652-7-67"
-         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="375"
-     inkscape:cy="560"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-global="true"
-     inkscape:snap-bbox="true"
-     inkscape:snap-midpoints="true"
-     inkscape:window-width="1200"
-     inkscape:window-height="1901"
-     inkscape:window-x="-6"
-     inkscape:window-y="-6"
-     inkscape:window-maximized="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3616" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93606043;stroke-opacity:1"
-       id="rect2818"
-       width="149.56393"
-       height="99.563942"
-       x="120.46803"
-       y="82.330215"
-       ry="5.9745607" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.83757281;stroke-opacity:1"
-       id="rect2818-4"
-       width="149.66243"
-       height="79.66243"
-       x="125.16879"
-       y="242.69975"
-       ry="4.7803254" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="166.91394"
-       y="284.63818"
-       id="text3618"><tspan
-         sodipodi:role="line"
-         id="tspan3620"
-         x="166.91394"
-         y="284.63818">Monitor</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="156.59363"
-       y="142.21819"
-       id="text3622"><tspan
-         sodipodi:role="line"
-         id="tspan3624"
-         x="156.59363"
-         y="142.21819">CPU Driver</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.90142637;stroke-opacity:1"
-       id="rect2818-7"
-       width="134.59856"
-       height="102.59857"
-       x="354.95071"
-       y="82.812889"
-       ry="6.156661" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="386.59363"
-       y="142.21819"
-       id="text3622-2"><tspan
-         sodipodi:role="line"
-         id="tspan3624-6"
-         x="386.59363"
-         y="142.21819">CPU Driver</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 190,242.36218 0,-60"
-       id="path4317" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.14568949px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 270.53496,132.36202 79.46504,0"
-       id="path4317-4" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1.14568949px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 350.68117,142.36218 -79.46505,0"
-       id="path4317-4-9" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
-       d="m 200,181.53416 0,60"
-       id="path4317-7" />
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="169"
-       y="221.36218"
-       id="text4695"><tspan
-         sodipodi:role="line"
-         id="tspan4697"
-         x="169"
-         y="221.36218">(1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="304"
-       y="123.36218"
-       id="text4699"><tspan
-         sodipodi:role="line"
-         id="tspan4701"
-         x="304"
-         y="123.36218">(2)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="409"
-       y="222.36218"
-       id="text4707"><tspan
-         sodipodi:role="line"
-         id="tspan4709"
-         x="409"
-         y="222.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="310"
-       y="169.36218"
-       id="text4715"><tspan
-         sodipodi:role="line"
-         id="tspan4717"
-         x="310"
-         y="169.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="307"
-       y="173.36218"
-       id="text4719"><tspan
-         sodipodi:role="line"
-         id="tspan4721"
-         x="307"
-         y="173.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="308"
-       y="169.36218"
-       id="text4723"><tspan
-         sodipodi:role="line"
-         id="tspan4725"
-         x="308"
-         y="169.36218" /></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="306"
-       y="168.36218"
-       id="text4727"><tspan
-         sodipodi:role="line"
-         id="tspan4729"
-         x="306"
-         y="168.36218">(3)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="210"
-       y="222.36218"
-       id="text4731"><tspan
-         sodipodi:role="line"
-         id="tspan4733"
-         x="210"
-         y="222.36218">(4)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:ETH;-inkscape-font-specification:ETH Light"
-       x="199"
-       y="171.36218"
-       id="text4819"><tspan
-         sodipodi:role="line"
-         id="tspan4821"
-         x="199"
-         y="171.36218" /></text>
-  </g>
-</svg>
diff --git a/doc/005-scc/plots/header.gnuplot b/doc/005-scc/plots/header.gnuplot
deleted file mode 100644 (file)
index 0d74986..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# ensure an embedded Helvetica font that matches the one Latex uses
-# NB: if gnuplot complains about no pfbtops program, you probably need to install the groff package (!)
-# set terminal postscript eps enhanced dashed \
-#   fontfile "/usr/share/fonts/type1/gsfonts/n019003l.pfb" \
-#   font "NimbusSanL-Regu" 20
-set terminal pdf
-
-#set xtics nomirror
-#set ytics nomirror
-
-# common line styles
-#set style line 1 lc 3 lw 2
-#set style line 2 lc 1 lw 2
diff --git a/doc/005-scc/plots/mpbbench/Makefile b/doc/005-scc/plots/mpbbench/Makefile
deleted file mode 100644 (file)
index 083d6a1..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-mpbbench_oneway.pdf: mpbbench_oneway.dat mpbbench_send.dat mpbbench_recv.dat
-       ./plot-line.sh $^
diff --git a/doc/005-scc/plots/mpbbench/mpbbench_oneway.dat b/doc/005-scc/plots/mpbbench/mpbbench_oneway.dat
deleted file mode 100644 (file)
index 071b65a..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# Always from core 0
-# To core      One-way latency (cycles)
-1      4860
-2      5043
-3      5044
-4      5078
-5      5078
-6      5106
-7      5108
-8      5133
-9      5133
-10     5168
-11     5168
-12     5043
-13     5043
-14     5078
-15     5078
-16     5107
-17     5107
-18     5133
-19     5133
-20     5167
-21     5167
-22     5191
-23     5191
-24     5078
-25     5078
-26     5108
-27     5108
-28     5133
-29     5133
-30     5166
-31     5166
-32     5210
-33     5210
-34     5241
-35     5241
-36     5107
-37     5125
-38     5151
-39     5151
-40     5186
-41     5186
-42     5212
-43     5212
-44     5241
-45     5221
-46     5275
-47     5257
diff --git a/doc/005-scc/plots/mpbbench/mpbbench_oneway.pdf b/doc/005-scc/plots/mpbbench/mpbbench_oneway.pdf
deleted file mode 100644 (file)
index 91ca70f..0000000
Binary files a/doc/005-scc/plots/mpbbench/mpbbench_oneway.pdf and /dev/null differ
diff --git a/doc/005-scc/plots/mpbbench/mpbbench_recv.dat b/doc/005-scc/plots/mpbbench/mpbbench_recv.dat
deleted file mode 100644 (file)
index ebff1ef..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# Always from core 0
-# To core      Send latency (cycles)
-1      3357
-2      3389
-3      3389
-4      3393
-5      3393
-6      3401
-7      3402
-8      3395
-9      3393
-10     3392
-11     3393
-12     3389
-13     3389
-14     3393
-15     3391
-16     3402
-17     3402
-18     3393
-19     3395
-20     3393
-21     3393
-22     3405
-23     3402
-24     3392
-25     3393
-26     3402
-27     3402
-28     3391
-29     3393
-30     3390
-31     3391
-32     3407
-33     3407
-34     3389
-35     3390
-36     3402
-37     3403
-38     3395
-39     3393
-40     3394
-41     3392
-42     3407
-43     3407
-44     3390
-45     3390
-46     3394
-47     3394
diff --git a/doc/005-scc/plots/mpbbench/mpbbench_send.dat b/doc/005-scc/plots/mpbbench/mpbbench_send.dat
deleted file mode 100644 (file)
index 49df2bb..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# Always from core 0
-# To core      Send latency (cycles)
-1      934
-2      1081
-3      1081
-4      1117
-5      1118
-6      1153
-7      1153
-8      1180
-9      1181
-10     1219
-11     1219
-12     1081
-13     1081
-14     1118
-15     1118
-16     1153
-17     1153
-18     1181
-19     1181
-20     1219
-21     1219
-22     1243
-23     1243
-24     1118
-25     1118
-26     1153
-27     1153
-28     1180
-29     1181
-30     1219
-31     1219
-32     1243
-33     1243
-34     1276
-35     1276
-36     1153
-37     1153
-38     1183
-39     1183
-40     1219
-41     1219
-42     1243
-43     1243
-44     1276
-45     1277
-46     1312
-47     1312
diff --git a/doc/005-scc/plots/mpbbench/plot-line.sh b/doc/005-scc/plots/mpbbench/plot-line.sh
deleted file mode 100755 (executable)
index 8ed01b7..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-gnuplot <<EOF
-set terminal pdf
-set output '`basename $1 .dat`.pdf'
-#set title "One-way MPB messaging latencies from core 0"
-set xlabel "Message to core"
-set ylabel "Latency (cycles)"
-set yrange [:6500]
-plot '$1' with linespoints title "Overall", '$2' with linespoints title "Send", '$3' with linespoints title "Receive"
-EOF
diff --git a/doc/005-scc/plots/rcce_bench/Makefile b/doc/005-scc/plots/rcce_bench/Makefile
deleted file mode 100644 (file)
index 37e6ef1..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-##########################################################################
-# Copyright (c) 2011, ETH Zurich.
-# All rights reserved.
-#
-# This file is distributed under the terms in the attached LICENSE file.
-# If you do not find this file, copies can be found by writing to:
-# ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
-##########################################################################
-
-all: rcce_lu.pdf rcce_bt.pdf rcce_lu_speedup.pdf rcce_bt_speedup.pdf
-
-.INTERMEDIATE: rcce_lu.eps rcce_bt.eps rcce_lu_speedup.eps
-
-rcce_lu.pdf: lu.dat ./plot-rcce.sh
-       ./plot-rcce.sh $@ $< "LU benchmark"
-
-rcce_bt.pdf: bt.dat ./plot-rcce.sh
-       ./plot-rcce.sh $@ $< "BT benchmark"
-
-rcce_lu_speedup.pdf: lu.dat ./plot-rcce-speedup.sh
-       ./plot-rcce-speedup.sh $@ $< "LU benchmark"
-
-rcce_bt_speedup.pdf: bt.dat ./plot-rcce-speedup.sh
-       ./plot-rcce-speedup.sh $@ $< "BT benchmark"
-
-%.pdf: %.eps
-       GS_OPTIONS=-dPDFSETTINGS=/prepress epstopdf $<
-
-clean::
-       $(RM) *.pdf *.eps
diff --git a/doc/005-scc/plots/rcce_bench/bt.dat b/doc/005-scc/plots/rcce_bench/bt.dat
deleted file mode 100644 (file)
index 3646c48..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# BT CLASS A
-# Linux gcc 4.3.2 dynamic
-#cores         time    MOPS    MOPS per process
-1      2088.9  80.6    80.6
-4      561.7   299.6   74.9
-9      274.8   612.4   68.0
-16     164.2   1024.7  64.0
-25     110.9   1517.9  60.7
-36     79.9    2106.1  58.5
-
-
-# Barrelfish
-#cores         time    MOPS    MOPS per process
-1      2071.3  81.3    81.3
-4      565.9   297.4   74.3
-9      279.7   601.6   66.8
-16     168.2   1000.6  62.5
-25     114.7   1467.2  58.7
-36     83.3    2019.9  56.1
diff --git a/doc/005-scc/plots/rcce_bench/lu.dat b/doc/005-scc/plots/rcce_bench/lu.dat
deleted file mode 100644 (file)
index bdee0b7..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# LU CLASS A
-# Linux gcc 4.3.2 dynamic
-#cores         time    MOPS    MOPS per process
-1      3053.1  39.1    39.1
-2      1499.9  79.5    39.8
-4      746.1   159.9   40.0
-8      391.9   304.4   38.1
-16     162.8   732.8   45.8
-32     90.0    1326.2  41.4
-
-
-# Barrelfish
-#cores         time    MOPS    MOPS per process
-1      3160.76 37.74   37.74
-2      1551.7  76.9    38.4
-4      780.7   152.8   38.2
-8      421.8   282.8   35.4
-16     181.0   659.0   41.2
-32     107.5   1110.0  34.7
diff --git a/doc/005-scc/plots/rcce_bench/plot-rcce-speedup.sh b/doc/005-scc/plots/rcce_bench/plot-rcce-speedup.sh
deleted file mode 100755 (executable)
index 7d88df3..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-
-SINGLE=$(grep '^1\b' $2 | cut -f2)
-LINUXSINGLE=$(echo $SINGLE | cut -d' ' -f1)
-BFSINGLE=$(echo $SINGLE | cut -d' ' -f2)
-
-gnuplot <<EOF
-load "../header.gnuplot"
-set xlabel "Cores"
-set ylabel "Speedup"
-set xrange [1:]
-set yrange [1:]
-set key top left
-set xtics (1,4,8,12,16,20,24,28,32,36,40)
-set output '$1'
-set title '$3'
-plot \
- '$2' index 0 using 1:($LINUXSINGLE/\$2) title "Linux" with linespoints, \
- '$2' index 1 using 1:($BFSINGLE/\$2) title "Barrelfish" with linespoints
-EOF
diff --git a/doc/005-scc/plots/rcce_bench/plot-rcce.sh b/doc/005-scc/plots/rcce_bench/plot-rcce.sh
deleted file mode 100755 (executable)
index b7fbcb5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-gnuplot <<EOF
-load "../header.gnuplot"
-set xlabel "Cores"
-set ylabel "Time (s)"
-set xrange [1:]
-set yrange [0:]
-set xtics (1,4,8,12,16,20,24,28,32,36,40)
-set output '$1'
-set title '$3'
-plot \
- '$2' index 1 using 1:2 title "Barrelfish" with linespoints, \
- '$2' index 0 using 1:2 title "Linux" with linespoints
-EOF
diff --git a/doc/005-scc/plots/rcce_bench/rcce_bt.pdf b/doc/005-scc/plots/rcce_bench/rcce_bt.pdf
deleted file mode 100644 (file)
index f7e600a..0000000
Binary files a/doc/005-scc/plots/rcce_bench/rcce_bt.pdf and /dev/null differ
diff --git a/doc/005-scc/plots/rcce_bench/rcce_bt_speedup.pdf b/doc/005-scc/plots/rcce_bench/rcce_bt_speedup.pdf
deleted file mode 100644 (file)
index a7bbb0c..0000000
Binary files a/doc/005-scc/plots/rcce_bench/rcce_bt_speedup.pdf and /dev/null differ
diff --git a/doc/005-scc/plots/rcce_bench/rcce_lu.pdf b/doc/005-scc/plots/rcce_bench/rcce_lu.pdf
deleted file mode 100644 (file)
index aff7e9b..0000000
Binary files a/doc/005-scc/plots/rcce_bench/rcce_lu.pdf and /dev/null differ
diff --git a/doc/005-scc/plots/rcce_bench/rcce_lu_speedup.pdf b/doc/005-scc/plots/rcce_bench/rcce_lu_speedup.pdf
deleted file mode 100644 (file)
index e8c3a3d..0000000
Binary files a/doc/005-scc/plots/rcce_bench/rcce_lu_speedup.pdf and /dev/null differ
diff --git a/doc/005-scc/sloccount.txt b/doc/005-scc/sloccount.txt
deleted file mode 100644 (file)
index 90abde1..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-./include/arch/x86_32
-221     top_dir         ansic=221
-195     barrelfish_kpi  ansic=195
-188     barrelfish      ansic=188
-4       bench           ansic=4
-
-./include/target/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-151     barrelfish_kpi  ansic=151
-54      barrelfish      ansic=54
-
-./kernel/include/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-503     x86_32          ansic=503
-
-./kernel/include/target/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-282     x86_32          ansic=282
-
-./kernel/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-3547    x86_32          ansic=3491,asm=56
-
-./usr/monitor/include/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-172     x86_32          ansic=172
-
-./lib/barrelfish/include/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-218     x86_32          ansic=218
-
-./lib/barrelfish/vspace/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-15      x86_32          ansic=15
-
-./lib/barrelfish/arch/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-352     x86_32          ansic=278,asm=74
-
-./lib/barrelfish/target/x86_32
-SLOC   Directory       SLOC-by-Language (Sorted)
-336     x86_32          ansic=336
index 5f7c437..fdc7297 100644 (file)
@@ -16,7 +16,6 @@
 module ARMv8 where
 
 import HakeTypes
-import Path
 import qualified Config
 import qualified ArchDefaults
 
index 03ea106..d0ba03f 100644 (file)
@@ -92,6 +92,7 @@ options "xscale" = XScale.options
 options "armv7" = ARMv7.options
 options "armv7-m" = ARMv7_M.options
 options "armv8" = ARMv8.options
+options s = error $ "Unknown architecture " ++ s
 
 kernelCFlags "x86_64" = X86_64.kernelCFlags
 kernelCFlags "k1om" = K1om.kernelCFlags
@@ -102,6 +103,7 @@ kernelCFlags "xscale" = XScale.kernelCFlags
 kernelCFlags "armv7" = ARMv7.kernelCFlags
 kernelCFlags "armv7-m" = ARMv7_M.kernelCFlags
 kernelCFlags "armv8" = ARMv8.kernelCFlags
+kernelCFlags s = error $ "Unknown architecture " ++ s
 
 kernelLdFlags "x86_64" = X86_64.kernelLdFlags
 kernelLdFlags "k1om" = K1om.kernelLdFlags
@@ -112,6 +114,7 @@ kernelLdFlags "xscale" = XScale.kernelLdFlags
 kernelLdFlags "armv7" = ARMv7.kernelLdFlags
 kernelLdFlags "armv7-m" = ARMv7_M.kernelLdFlags
 kernelLdFlags "armv8" = ARMv8.kernelLdFlags
+kernelLdFlags s = error $ "Unknown architecture " ++ s
 
 archFamily :: String -> String
 archFamily arch = optArchFamily (options arch)
index 28a8dc9..270168e 100644 (file)
@@ -32,7 +32,7 @@ ourCommonFlags = [ Str "-m64",
                    Str "-mno-red-zone",
                    Str "-fPIE",
                    Str "-fno-stack-protector", 
-                  Str "-Wno-unused-but-set-variable",
+                   Str "-Wno-unused-but-set-variable",
                    Str "-Wno-packed-bitfield-compat",
                    Str "-D__x86__" ]
 
@@ -43,7 +43,7 @@ cFlags = ArchDefaults.commonCFlags
 cxxFlags = ArchDefaults.commonCxxFlags
                  ++ ArchDefaults.commonFlags
                  ++ ourCommonFlags
-                ++ [Str "-std=gnu++11"]
+         ++ [Str "-std=gnu++11"]
 
 cDefines = ArchDefaults.cDefines options
 
diff --git a/hake/menu.lst.scc b/hake/menu.lst.scc
deleted file mode 100644 (file)
index 9b7cee0..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-timeout 0
-
-# spawnd is used to control which cpus are booted
-#
-# "spawnd boot" will use the skb and pci to figure out and
-#  boot all cores in the machine
-#
-# "spawnd boot bootscc=1-6" will not use the skb and
-# boot the list of cores passed as argument.
-# The hardware id of the cores to boot should be specified.
-# This list may not include the bsp core id.
-
-title  Barrelfish
-root   (nd)
-kernel /scc/sbin/cpu loglevel=4
-module /scc/sbin/cpu
-module /scc/sbin/init
-
-# Domains spawned by init
-module /scc/sbin/mem_serv
-module /scc/sbin/monitor
-
-module /scc/sbin/ramfsd boot
-module  /scc/sbin/skb boot
-module  /scc/sbin/spawnd boot bootscc=1-47
-module  /scc/sbin/startd boot
-# modules needed to start the networking
-# module  /scc/sbin/eMAC core=0
-# module  /scc/sbin/NGD_MNG core=0 cardname=eMAC2_0
-# module  /scc/sbin/netd core=0 cardname=eMAC2_0
-# module  /scc/sbin/eMAC core=1
-# module  /scc/sbin/NGD_MNG core=2 cardname=eMAC2_1
-# module  /scc/sbin/netd core=1 cardname=eMAC2_1
-
-# RCK memory map
-# 624MB private RAM
-mmap   map     0x0             0x27000000      1
-# 1GB shared RAM (over all MCs) in the middle of address space
-mmap    map     0x80000000      0x40000000      1
-# 16MB more private RAM (bootup jump is in here, too)
-mmap   map     0xff000000      0x1000000       1
index 10edfb3..9f0db70 100644 (file)
@@ -455,9 +455,6 @@ doxygen: Doxyfile
 #
 ######################################################################
 
-k1om/sbin/weever: k1om/sbin/weever_elf
-       $(K1OM_OBJCOPY) -O binary -R .note -R .comment -S k1om/sbin/weever_elf ./k1om/sbin/weever
-
 TESTS_k1om= \
        $(TESTS_x86) \
        sbin/tests/dma_test \
diff --git a/if/arch/scc.if b/if/arch/scc.if
deleted file mode 100644 (file)
index 9b3f318..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-alias errval uint32;
-alias cycles uint64;
diff --git a/if/platform/scc.if b/if/platform/scc.if
deleted file mode 100644 (file)
index 459214c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-alias genpaddr uint64;
-alias genvaddr uint64;
-alias rsrcid   uint32;
diff --git a/include/arch/scc/barrelfish/bulk_transfer_arch.h b/include/arch/scc/barrelfish/bulk_transfer_arch.h
deleted file mode 100644 (file)
index fc0a924..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * \file
- * \brief Unidirectional bulk data transfer via shared memory
- */
-
-/*
- * Copyright (c) 2009, 2010, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#ifndef ARCH_BULK_TRANSFER_H
-#define ARCH_BULK_TRANSFER_H
-
-static inline void bulk_arch_prepare_send(void *mem, size_t size)
-{
-    // Touch generic cacheline not in the buffer
-    volatile uintptr_t touch_this;
-    touch_this = 0;
-}
-
-static inline void bulk_arch_prepare_recv(void *mem, size_t size)
-{
-    // No-op: bulk buffers are mapped as MPB type
-}
-
-#endif
diff --git a/include/arch/scc/barrelfish/cpu_arch.h b/include/arch/scc/barrelfish/cpu_arch.h
deleted file mode 100644 (file)
index c1d92ef..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * \file
- * \brief Architecture specific CPU bits.
- */
-
-/*
- * Copyright (c) 2010, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#ifndef SCC_BARRELFISH_CPU_H
-#define SCC_BARRELFISH_CPU_H
-
-#define CURRENT_CPU_TYPE CPU_SCC
-
-#endif
diff --git a/kernel/arch/scc/boot.S b/kernel/arch/scc/boot.S
deleted file mode 100644 (file)
index 95df907..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2007, 2008, 2010, 2011, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#include <target/x86_32/offsets_target.h>
-#include <init.h>
-#include <x86.h>
-#include <barrelfish_kpi/pic_arch.h>
-#include <diteinfo.h>
-
-#define PROT_MODE_ENABLE 1
-#define PAGING_ENABLE 31
-#define PROT_CS 8
-#define PROT_DS 16
-#define PAE 0x20
-#define LME 8
-#define BOOT_AP_KERNEL_SIZE 4096
-#define SCC_REAL_MODE_SEGMENT  0xff00
-#define SCC_REAL_MODE_OFFSET   0x1000
-
-/**
- * Get doxygen to ignore the rest of this file, as it is very confused otherwise
- * \cond
- */
-
-       .text
-       .globl start, halt
-        .align 4
-       .code16
-
-//start the 16bit real-mode code here
-
-start:
-        cli
-       mov $SCC_REAL_MODE_SEGMENT,%ax
-       mov %ax,%ds
-       mov $(gdt_ptr - start + SCC_REAL_MODE_OFFSET),%esi
-       lgdt (%esi)
-       mov %cr0,%eax
-       or $PROT_MODE_ENABLE,%al
-       mov %eax,%cr0
-//     jmp PROT_CS:start_ap_pm
-       .byte 0x66
-           .byte 0xea
-           .long start_pm - start + X86_32_START_KERNEL_PHYS
-           .word PROT_CS
-
-//start the 32bit protected-mode code here
-
-        .code32
-start_pm:
-        // set up stack
-       mov $PROT_DS,%eax
-       mov %eax,%ss
-       mov %eax,%ds
-       mov %eax,%es
-       mov %eax,%fs
-       mov %eax,%gs
-
-       // Use fake stack and hope it doesn't break
-       lea     X86_32_KERNEL_STACK_SIZE, %esp
-
-       // Initialize position-independent code
-       INIT_PIC()
-
-       /* Initialize the stack pointer */
-       lea     MUNG_LOCAL(x86_32_kernel_stack + X86_32_KERNEL_STACK_SIZE), %esp
-
-       /* Reset EFLAGS */
-       pushl   $0
-       popf
-
-       /* Enter architecture-specific init -- this should never return */
-       pushl   $0
-       pushl   $DITE_BOOT_MAGIC
-       call    arch_init
-
-       /* Halt -- this should never be reached */
-halt:  hlt
-       jmp     halt
-
-qemu_start:
-       // Use fake stack and hope it doesn't break
-       lea     X86_32_KERNEL_STACK_SIZE, %esp
-
-       // Initialize position-independent code
-       INIT_PIC()
-
-       /* Initialize the stack pointer */
-       lea     MUNG_LOCAL(x86_32_kernel_stack + X86_32_KERNEL_STACK_SIZE), %esp
-
-       /* Reset EFLAGS */
-       pushl   $0
-       popf
-
-       /* Enter architecture-specific init -- this should never return */
-       push    %ebx            /* Pointer to multiboot info struct */
-       push    %eax            /* Multiboot magic value */
-       call    arch_init
-
-        .align 16
-gdt:
-        .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
-        .byte 0xff,0xff,0x00,0x00,0x00,0x9a,0xcf,0x00 // 32bit code segment for protected-mode
-        .byte 0xff,0xff,0x00,0x00,0x00,0x93,0xcf,0x00 // 32bit data segment for protected-mode
-
-gdt_ptr:
-        .word gdt_ptr - gdt
-       .long gdt - start + X86_32_START_KERNEL_PHYS
-       .long 0
-
-/**
- * \endcond
- */
diff --git a/kernel/arch/scc/rck.c b/kernel/arch/scc/rck.c
deleted file mode 100644 (file)
index 7fddaaf..0000000
+++ /dev/null
@@ -1,1083 +0,0 @@
-/**
- * \file
- * \brief Rockcreek (RCK) configuration registers driver.
- *
- * Message passing buffer layout
- * -----------------------------
- * We have two pages (8K) per core, in which we store a 2-level B-Tree of
- * bitmaps. We can fit 256 bitmaps of 256 bits (32 bytes) on the two pages.
- * We use the first 256 bits for the root node, which tells whether there are
- * bits set in the corresponding second level.
- *
- * 256 bits were chosen to equal the size of a cache line, which facilitates
- * I/O (only full lines can be read/written).
- */
-
-/*
- * Copyright (c) 2007, 2008, 2010, 2011, 2012, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#include <kernel.h>
-#include <dispatch.h>
-#include <paging_kernel_helper.h>
-#include <rck.h>
-#include <paging_kernel_arch.h>
-#include <arch/x86/apic.h>
-#include <string.h>
-#include <target/x86/barrelfish_kpi/coredata_target.h>
-#include <diteinfo.h>
-#include <elf/elf.h>
-#include <arch/x86/startup_x86.h>
-#include <dev/rck_dev.h>
-
-/// Number of tiles on the RCK board
-#define NUM_RCK_TILES           24
-
-/// Physical base address for configuration registers in the default PTE map
-#define RCK_CFG_REGS_BASE       0xe0000000
-
-/// Physical base address of own config registers
-#define RCK_CFG_REGS_OWN        0xf8000000
-
-/// Physical base address for message passing buffers (MPBs) in the default PTE map
-#define RCK_MPB_BASE             0xc0000000
-
-/// Physical base address for own MPB
-#define RCK_MPB_OWN             0xd8000000
-
-/// Address range mapped by one LUT entry
-#define LUT_SIZE                 0x1000000
-
-// Max number of notification IDs that fit into message passing buffers
-#define MAX_CHANIDS             65280
-
-/// Offset for core 0 of a tile's MPB
-#define CORE_0_OFFSET           0
-
-/// Offset for core 1 of a tile's MPB
-#define CORE_1_OFFSET           (2 * BASE_PAGE_SIZE)
-
-/// Number of bits in a machine word
-#define NBWO                    (NBBY * sizeof(uintptr_t))
-
-/// Number of bits in a B-tree node
-#define NODE_BITS               256
-
-/// Root has one less bit valid, because we're out of memory (there are 255 children)
-#define ROOT_BITS               255
-
-/// Mask to get remainder of a non-cacheline-aligned address (32-byte cachelines)
-#define CACHE_LINE_MASK         (CACHE_LINE_SIZE - 1)
-
-/// B-Tree node size in bytes (#NODE_BITS / #NBBY)
-#define NODE_SIZE               32
-
-/// Size of cache line in words
-#define CACHE_LINE_WORDS        (CACHE_LINE_SIZE / sizeof(uintptr_t))
-
-/// Message passing buffer page table flags
-#define MPB_PTABLE_FLAGS \
-    (X86_32_PTABLE_PRESENT | X86_32_PTABLE_USER_SUPERVISOR | X86_32_PTABLE_READ_WRITE | SCC_PTABLE_MESSAGE_BUFFER | X86_32_PTABLE_WRITE_THROUGH)
-
-/// Size of circular array in cachelines
-#define RING_SIZE       255
-
-/// Mackerel state for all the tiles
-static rck_t rck[NUM_RCK_TILES];
-
-// Mackerel state for my own tile
-static rck_t rck_own;
-
-/// Start addresses of MPBs for all tiles
-static lvaddr_t mpb[NUM_RCK_TILES];
-
-/// User-space endpoints awaiting notifications
-static struct cte endpoints[MAX_CHANIDS];
-
-/**
- * Acquire test&set lock.
- */
-static void __attribute__ ((noinline)) acquire_lock(uint8_t dest)
-{
-    int tile = dest / 2, core = dest % 2;
-    /* rck_tas_t tas; */
-
-    /* // Acquire lock via test&set */
-    /* do { */
-    /*     tas = rck_tas_rd(&rck[tile], core); */
-    /* } while(tas.val == 0); */
-
-    uint32_t tas;
-
-    // Acquire lock via test&set
-    do {
-        tas = rck_tas_rd_raw(&rck[tile], core);
-    } while(tas == 0);
-}
-
-/**
- * Release test&set lock.
- */
-static inline void release_lock(uint8_t dest)
-{
-    int tile = dest / 2, core = dest % 2;
-    /* rck_tas_t tas; */
-
-    // Release the lock via test&set
-    /* tas.val = 0; */
-    /* rck_tas_wr(&rck[tile], core, tas); */
-
-    uint32_t tas = 0;
-    rck_tas_wr_raw(&rck[tile], core, tas);
-}
-
-/**
- * Initialize RCK driver by mapping in config registers and MPBs.
- */
-void rck_init(void)
-{
-    for(int i = 0; i < NUM_RCK_TILES; i++) {
-        void *rck_base =
-            (void *)paging_map_device(RCK_CFG_REGS_BASE + LUT_SIZE * i,
-                                      2 * BASE_PAGE_SIZE);
-        assert(rck_base != NULL);
-        rck_initialize(&rck[i], rck_base);
-
-        // XXX: Reset GLCFG config registers
-        rck_glcfg_wr_raw(&rck[i], 0, 0x340df8);
-        rck_glcfg_wr_raw(&rck[i], 1, 0x340df8);
-    }
-
-    // Map my own config registers
-    void *rck_own_addr =
-        (void *)paging_map_device(RCK_CFG_REGS_OWN, 2 * BASE_PAGE_SIZE);
-    assert(rck_own_addr != NULL);
-    rck_initialize(&rck_own, rck_own_addr);
-
-    // Map message passing buffers
-    for(int i = 0; i < NUM_RCK_TILES; i++) {
-        // Map own MPB mappings for my tile
-        if(rck_get_coreid() / 2 == i) {
-            mpb[i] = paging_x86_32_map_special(RCK_MPB_OWN, 4 * BASE_PAGE_SIZE,
-                                               MPB_PTABLE_FLAGS);
-        } else {
-            mpb[i] = paging_x86_32_map_special(RCK_MPB_BASE + LUT_SIZE * i,
-                                               4 * BASE_PAGE_SIZE,
-                                               MPB_PTABLE_FLAGS);
-        }
-        assert(mpb[i] != 0);
-
-        // XXX: Bootstrap core clears all message buffers
-        if(rck_get_coreid() == 0) {
-            cl1flushmb();
-            memset((void *)mpb[i], 0, 4 * BASE_PAGE_SIZE);
-        }
-    }
-
-    // Map more shared RAM (960MB more)
-    /* static int addr[20] = {0x1ec, 0x28, 0x51, 0x7a, 0xa3, 0xcc, 0xf5, 0x11e, 0x147, 0x170, 0x199, 0x1c2, 0x1eb, 0x1ed, 0x1ee, 0x1ef, 0x1f0, 0x1f1, 0x1f2, 0x1f3}; */
-    static int addr[19] = {0x28, 0x51, 0x7a, 0xa3, 0xcc, 0xf5, 0x11e, 0x147, 0x170, 0x199, 0x1c2, 0x1eb, 0x1ed, 0x1ee, 0x1ef, 0x1f0, 0x1f1, 0x1f2, 0x1f3};
-    for(int i = 0; i < 76; i++) {
-        int current_lut;
-        if(i < 60) {
-            current_lut = 132 + i;
-        } else {
-            current_lut = 127 - (i - 60);
-        }
-        rck_lute_t lut = {
-            .bypass = 0
-        };
-
-        switch(i / 19) {
-        case 0:
-            lut.route = 0;
-            lut.subdest = rck_mc1_sd;
-            break;
-
-        case 1:
-            lut.route = 5;
-            lut.subdest = rck_mc2_sd;
-            break;
-
-        case 2:
-            lut.route = 0x20;
-            lut.subdest = rck_mc1_sd;
-            break;
-
-        case 3:
-            lut.route = 0x25;
-            lut.subdest = rck_mc2_sd;
-            break;
-
-        default:
-            assert(!"shouldn't happen");
-        };
-
-        lut.addrbits = addr[i % 19];
-
-        rck_lut0_wr(&rck_own, current_lut, lut);
-        rck_lut1_wr(&rck_own, current_lut, lut);
-    }
-}
-
-#define NUM_ROWS 4
-#define NUM_COLS 6
-#define NUM_CORES 2
-
-/**
- * Return core ID of this core.
- */
-uint8_t rck_get_coreid(void)
-{
-    /* rck_tileid_t tileid = rck_tileid_rd(&rck_own); */
-    uint32_t core = rck_tileid_rd_raw(&rck_own);
-
-    /* printf("rck_get_coreid: x = %d, y = %d, core = %d\n", */
-    /*        tileid.x, tileid.y, tileid.coreid); */
-
-    int x, y;
-
-    x=   (core>>3) & 0x0f; // bits 06:03
-    y=   (core>>7) & 0x0f; // bits 10:07
-    core=(core   ) & 0x07; // bits 02:00
-
-    /* printf("done right: x = %d, y = %d, core = %d\n", */
-    /*        x, y, core); */
-
-    /* return (NUM_CORES*NUM_COLS*tileid.y)+(NUM_CORES*tileid.x)+tileid.coreid; */
-    return (NUM_CORES*NUM_COLS*y)+(NUM_CORES*x)+core;
-}
-
-extern struct dcb *run_next;
-
-static void handle_channel(uintptr_t chanid)
-{
-    // Message pending, assert we have a waiting endpoint
-    struct capability *ep = &endpoints[chanid].cap;
-
-    if(ep->type == ObjType_Null) {
-        printk(LOG_WARN, "unhandled RCK channel %"PRIuPTR"\n", chanid);
-        return;
-    } else {
-      /* printf("%d: handle_channel(%d)\n", my_core_id, chanid); */
-    }
-    assert(ep->type == ObjType_EndPoint);
-
-    errval_t err = lmp_deliver_notification(ep);
-    if (err_is_fail(err)) {
-        if (err_no(err) == SYS_ERR_LMP_BUF_OVERFLOW) {
-            /* dispatcher_handle_t handle = ep->u.endpoint.listener->disp; */
-            /* struct dispatcher_shared_generic *disp = */
-            /*     get_dispatcher_shared_generic(handle); */
-            /* printk(LOG_DEBUG, "%.*s: RCK message buffer overflow\n", */
-            /*        DISP_NAME_LEN, disp->name); */
-        } else {
-            printk(LOG_ERR, "Unexpected error delivering RCK notification\n");
-        }
-    }
-
-    run_next = ep->u.endpoint.listener;
-}
-
-/**
- * Send a notification to a RCK core.
- *
- * \param dest          Destination RCK core ID
- * \param chanid        Destination notification ID
- */
-void rck_send_notification(uint8_t dest, uintptr_t chanid)
-{
-    assert(chanid < MAX_CHANIDS);
-    assert(dest != apic_id);
-
-    int tile = dest / 2, core = dest % 2;
-    lvaddr_t mb = mpb[tile] + core * CORE_1_OFFSET;
-    volatile uintptr_t *cl;
-
-    acquire_lock(dest);
-
-    uintptr_t reader_pos = *(uintptr_t *)mb;
-    uintptr_t writer_pos = *(uintptr_t *)(mb + 4);
-
-    cl1flushmb();
-    cl = (uintptr_t *)mb;
-    cl[0] = reader_pos;
-    cl[1] = (writer_pos + 1) % RING_SIZE;
-    cl[2] = 0;
-    cl[3] = 0;
-    cl[4] = 0;
-    cl[5] = 0;
-    cl[6] = 0;
-    cl[7] = 0;
-
-    /* printf("%d: rck_send_notification(%u (%d, %d), %u)\n", my_core_id, dest, tile, core, chanid); */
-
-    assert(reader_pos != (writer_pos + 1) % RING_SIZE);
-
-    lvaddr_t pos = mb + CACHE_LINE_SIZE + writer_pos * CACHE_LINE_SIZE;
-    assert(!(pos & CACHE_LINE_MASK));
-    cl = (uintptr_t *)pos;
-
-    cl[0] = chanid;
-    cl[1] = 0;
-    cl[2] = 0;
-    cl[3] = 0;
-    cl[4] = 0;
-    cl[5] = 0;
-    cl[6] = 0;
-    cl[7] = 0;
-
-#ifndef NO_INTERRUPT
-    // Send the interrupt if not already pending
-    /* rck_glcfg_t glcfg = rck_glcfg_rd(&rck[tile], core); */
-    /* if(!glcfg.intr) { */
-    /*     glcfg.intr = 1; */
-    /*     rck_glcfg_wr(&rck[tile], core, glcfg); */
-    /* } */
-    uint32_t glcfg = rck_glcfg_rd_raw(&rck[tile], core);
-    if(!(glcfg & (1 << 1))) {
-        glcfg |= 1 << 1;
-        rck_glcfg_wr_raw(&rck[tile], core, glcfg);
-    }
-#endif
-
-    release_lock(dest);
-}
-
-/**
- * Determine and handle pending local notifications.
- */
-void rck_handle_notification(void)
-{
-    uint8_t myself = rck_get_coreid();
-    int tile = myself / 2, core = myself % 2;
-    lvaddr_t mb = mpb[tile] + core * CORE_1_OFFSET;
-    volatile uintptr_t *cl;
-
-    /* printf("rck_handle_notification(0x%x)\n", mb); */
-
-    acquire_lock(myself);
-
-    // Get reader/writer pos
-    cl1flushmb();
-    uintptr_t reader_pos = *(uintptr_t *)mb;
-    uintptr_t writer_pos = *(uintptr_t *)(mb + 4);
-
-//#ifndef NO_INTERRUPT
-//    assert(reader_pos != writer_pos);
-//#else
-    if(reader_pos == writer_pos) {
-          printf("reader_pos == writer_pos\n"); 
-       goto out;
-    }
-//#endif
-
-    while(reader_pos != writer_pos) {
-        // Check channel ID
-        uintptr_t *pos = (uintptr_t *)(mb + CACHE_LINE_SIZE + reader_pos * CACHE_LINE_SIZE);
-        /* assert(!(pos & CACHE_LINE_MASK)); */
-        handle_channel(*pos);
-        reader_pos = (reader_pos + 1) % RING_SIZE;
-    }
-
-    // Update reader pos
-    cl = (uintptr_t *)mb;
-    cl[0] = reader_pos;
-    cl[1] = writer_pos;
-    cl[2] = 0;
-    cl[3] = 0;
-    cl[4] = 0;
-    cl[5] = 0;
-    cl[6] = 0;
-    cl[7] = 0;
-
-#ifndef NO_INTERRUPT
-    // Reset interrupt line
-    /* rck_glcfg_t glcfg = rck_glcfg_rd(&rck[tile], core); */
-    /* glcfg.intr = 0; */
-    /* rck_glcfg_wr(&rck[tile], core, glcfg); */
-    uint32_t glcfg = rck_glcfg_rd_raw(&rck[tile], core);
-    glcfg &= ~(1 << 1);
-    rck_glcfg_wr_raw(&rck[tile], core, glcfg);
-#endif
-
-//#ifdef NO_INTERRUPT
- out:
-//#endif
-    release_lock(myself);
-}
-
-void rck_reset_lint1(void)
-{
-    uint8_t myself = rck_get_coreid();
-    int tile = myself / 2, core = myself % 2;
-    uint32_t glcfg = rck_glcfg_rd_raw(&rck[tile], core);
-    glcfg &= ~1;
-    rck_glcfg_wr_raw(&rck[tile], core, glcfg);
-}
-
-errval_t rck_get_route(genpaddr_t base, size_t size, uint8_t *route,
-                       uint8_t *subdest, uint16_t *addrbits)
-{
-    uint8_t myself = rck_get_coreid();
-    int tile = myself / 2, core = myself % 2;
-    uint32_t lute;
-    genpaddr_t index = base >> 24;
-    assert(index < 256);
-    bool first = true;
-    assert(index + (size / LUT_SIZE) < 256);
-
-    // This is probably overkill. A device is probably only able to
-    // route to exactly one LUT mapping, and not multiple consecutive
-    // ones.
-    printf("#### base %"PRIxGENPADDR", %zu\n", base, size);
-    for(genpaddr_t i = 0; i <= size / LUT_SIZE; i++) {
-        if(core == 0) {
-            lute = rck_lut0_rd_raw(&rck[tile], index + i);
-        } else {
-            lute = rck_lut1_rd_raw(&rck[tile], index + i);
-        }
-
-        uint8_t myroute = (lute >> 13) & 0xff;
-        uint8_t mysubdest = (lute >> 10) & 0b111;
-        uint16_t myaddrbits = lute & 0x3ff;
-        printf("#### myroute = %x, %x %x\n", myroute, mysubdest, myaddrbits);
-        if(!first) {
-            if(myroute != *route || mysubdest != *subdest
-               || myaddrbits != *addrbits + i) {
-                return SYS_ERR_CROSS_MC;
-            }
-        } else {
-            *route = myroute;
-            *subdest = mysubdest;
-            *addrbits = myaddrbits;
-            first = false;
-        }
-    }
-
-    return SYS_ERR_OK;
-}
-
-errval_t rck_register_notification(capaddr_t ep, int chanid)
-{
-    struct cte *recv;
-    errval_t err;
-
-    err = caps_lookup_slot(&dcb_current->cspace.cap, ep,
-                           CPTR_BITS, &recv, CAPRIGHTS_WRITE);
-    if (err_is_fail(err)) {
-        return err_push(err, SYS_ERR_IRQ_LOOKUP);
-    }
-
-    assert(recv != NULL);
-
-    // Return w/error if cap is not an endpoint
-    if(recv->cap.type != ObjType_EndPoint) {
-        return SYS_ERR_IRQ_NOT_ENDPOINT;
-    }
-
-    // Return w/error if no listener on endpoint
-    if(recv->cap.u.endpoint.listener == NULL) {
-        return SYS_ERR_IRQ_NO_LISTENER;
-    }
-
-    if(chanid < MAX_CHANIDS) {
-        // check that we don't overwrite someone else's handler
-        if (endpoints[chanid].cap.type != ObjType_Null) {
-            printf("kernel: installing new handler for RCK notification %d\n", chanid);
-        }
-        return caps_copy_to_cte(&endpoints[chanid], recv, false, 0, 0);
-    } else {
-        return SYS_ERR_IRQ_INVALID;
-    }
-}
-
-errval_t rck_delete_notification(int chanid)
-{
-    if(chanid < MAX_CHANIDS) {
-        endpoints[chanid].cap.type = ObjType_Null;
-        return SYS_ERR_OK;
-    } else {
-        return SYS_ERR_IRQ_INVALID;
-    }
-}
-
-#define CORES_PER_QUADRANT      12
-/* #define LUTS_PER_CORE           20 */
-#define XCORE_LUT_BASE          41
-#define XCORE_PADDR_BASE        0x29000000
-
-struct mcdest {
-    int route;
-    rck_mcsubdests_t subdest;
-    int addrbits;
-};
-
-static struct mcdest dests[48] = {
-    // Core 0
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x0
-    },
-    // Core 1
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x1
-    },
-    // Core 2
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x2
-    },
-    // Core 3
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x3
-    },
-    // Core 4
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x4
-    },
-    // Core 5
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x5
-    },
-
-    // ---------------
-
-    // Core 6
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x0
-    },
-    // Core 7
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x1
-    },
-    // Core 8
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x2
-    },
-    // Core 9
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x3
-    },
-    // Core 10
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x4
-    },
-    // Core 11
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x5
-    },
-
-    // ---------------
-
-    // Core 12
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x6
-    },
-    // Core 13
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x7
-    },
-    // Core 14
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x8
-    },
-    // Core 15
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x9
-    },
-    // Core 16
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0xa
-    },
-    // Core 17
-    {
-        .route = 0,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0xb
-    },
-
-    // ---------------
-
-    // Core 18
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x6
-    },
-    // Core 19
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x7
-    },
-    // Core 20
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x8
-    },
-    // Core 21
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x9
-    },
-    // Core 22
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0xa
-    },
-    // Core 23
-    {
-        .route = 0x5,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0xb
-    },
-
-    // ---------------
-
-    // Core 24
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x0
-    },
-    // Core 25
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x1
-    },
-    // Core 26
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x2
-    },
-    // Core 27
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x3
-    },
-    // Core 28
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x4
-    },
-    // Core 29
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x5
-    },
-
-    // ---------------
-
-    // Core 30
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x0
-    },
-    // Core 31
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x1
-    },
-    // Core 32
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x2
-    },
-    // Core 33
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x3
-    },
-    // Core 34
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x4
-    },
-    // Core 35
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x5
-    },
-
-    // ---------------
-
-    // Core 36
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x6
-    },
-    // Core 37
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x7
-    },
-    // Core 38
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x8
-    },
-    // Core 39
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0x9
-    },
-    // Core 40
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0xa
-    },
-    // Core 41
-    {
-        .route = 0x20,
-        .subdest = rck_mc1_sd,
-        .addrbits = 0xb
-    },
-
-    // ---------------
-
-    // Core 42
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x6
-    },
-    // Core 43
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x7
-    },
-    // Core 44
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x8
-    },
-    // Core 45
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0x9
-    },
-    // Core 46
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0xa
-    },
-    // Core 47
-    {
-        .route = 0x25,
-        .subdest = rck_mc2_sd,
-        .addrbits = 0xb
-    }
-};
-
-errval_t rck_map_core_lut(uint8_t entry, uint8_t coreid, uint8_t offset)
-{
-    int route = dests[coreid].route;
-    rck_mcsubdests_t subdest = dests[coreid].subdest;
-    int addrbits = dests[coreid].addrbits * 0x29 + offset;
-
-    // XXX: Only works from core 0 for now
-    assert(rck_get_coreid() == 0);
-
-    printf("Kernel: Mapping entry %u to coreid %u, offset %u\n",
-           entry, coreid, offset);
-
-    uint32_t regval = ((route & 0xff) << 13) | ((subdest & 7) << 10) |
-        (addrbits & 1023);
-    rck_lut0_wr_raw(&rck_own, entry, regval);
-
-    return SYS_ERR_OK;
-}
-
-struct allocate_state {
-    void          *vbase;
-    genvaddr_t     elfbase;
-};
-
-static errval_t elfload_allocate(void *state, genvaddr_t base,
-                                 size_t size, uint32_t flags,
-                                 void **retbase)
-{
-    struct allocate_state *s = state;
-
-    *retbase = s->vbase + base - s->elfbase;
-    return SYS_ERR_OK;
-}
-
-#define SCC_L2_LINESIZE 32
-#define SCC_L2_WAYS     4
-#define SCC_L2_CAPACITY (256 * 1024)
-#define SCC_L2_WBSTRIDE (SCC_L2_CAPACITY / SCC_L2_WAYS)
-
-static void flush_l2_cache(void)
-{
-    for (lpaddr_t addr = 0; addr < SCC_L2_WBSTRIDE; addr += SCC_L2_LINESIZE) {
-        volatile char tmp;
-        lpaddr_t set = addr % SCC_L2_WBSTRIDE;
-        volatile char *dummy = (volatile char*)local_phys_to_mem(set);
-
-        /* Now read new data into all ways */
-        for (unsigned int i = 0; i < SCC_L2_WAYS; i++) {
-            tmp = *dummy;
-            dummy += SCC_L2_WBSTRIDE;
-        }
-    }
-}
-
-int rck_start_core(uint8_t coreid, genpaddr_t urpcframe_base,
-                   uint8_t urpcframe_bits, int chanid)
-{
-    int tile = coreid / 2, core = coreid % 2;
-    int current_lut = XCORE_LUT_BASE;
-
-    // XXX: Only works from core 0 for now
-    assert(rck_get_coreid() == 0);
-
-    int route = dests[coreid].route;
-    rck_mcsubdests_t subdest = dests[coreid].subdest;
-    int addrbits = dests[coreid].addrbits * 0x29;
-
-    // Map core's memory at LUT entry 41
-    // XXX: Something's utterly wrong here! The register isn't written correctly.
-    // route is 11b, even though it should be 0.
-#       if 0
-    rck_lute_t lut = {
-        .bypass = 0,
-        .route = route,
-        .subdest = subdest,
-        .addrbits = (coreid % CORES_PER_QUADRANT) * LUTS_PER_CORE
-    };
-    rck_lut0_wr(&rck_own, current_lut, lut);
-    printf("route = 0x%x, subdest = 0x%x, addrbits = 0x%x\n",
-           lut.route, lut.subdest, lut.addrbits);
-#       endif
-    uint32_t regval = ((route & 0xff) << 13) | ((subdest & 7) << 10) |
-        (addrbits & 1023);
-    /* uint32_t regval = ((route & 0xff) << 13) | ((subdest & 7) << 10) | */
-    /*     (((coreid % CORES_PER_QUADRANT) * LUTS_PER_CORE) & 1023); */
-    rck_lut0_wr_raw(&rck_own, current_lut, regval);
-    /* printf("wrote 0x%x\n", regval); */
-
-    lvaddr_t mem = local_phys_to_mem(XCORE_PADDR_BASE);
-
-    /* Look up modules */
-    struct multiboot_modinfo *cpu_region =
-        multiboot_find_module("scc/sbin/cpu");
-    assert(cpu_region != NULL);
-    lvaddr_t cpu_binary = local_phys_to_mem(cpu_region->mod_start);
-    size_t cpu_binary_size = MULTIBOOT_MODULE_SIZE(*cpu_region);
-
-    struct multiboot_modinfo *monitor_region =
-        multiboot_find_module("scc/sbin/monitor");
-    assert(monitor_region != NULL);
-    lvaddr_t monitor_binary = local_phys_to_mem(monitor_region->mod_start);
-    size_t monitor_binary_size = MULTIBOOT_MODULE_SIZE(*monitor_region);
-
-    struct multiboot_modinfo *init_region =
-        multiboot_find_module("scc/sbin/init");
-    assert(init_region != NULL);
-    lvaddr_t init_binary = local_phys_to_mem(init_region->mod_start);
-    size_t init_binary_size = MULTIBOOT_MODULE_SIZE(*init_region);
-
-    struct multiboot_modinfo *memserv_region =
-        multiboot_find_module("scc/sbin/mem_serv");
-    assert(memserv_region != NULL);
-    lvaddr_t memserv_binary = local_phys_to_mem(memserv_region->mod_start);
-    size_t memserv_binary_size = MULTIBOOT_MODULE_SIZE(*memserv_region);
-
-    struct multiboot_modinfo *spawnd_region =
-        multiboot_find_module("scc/sbin/spawnd");
-    assert(spawnd_region != NULL);
-    lvaddr_t spawnd_binary = local_phys_to_mem(spawnd_region->mod_start);
-    size_t spawnd_binary_size = MULTIBOOT_MODULE_SIZE(*spawnd_region);
-
-    // TODO: This needs to be updated -- it's incorrect
-    /* assert(X86_CORE_DATA_PAGES * BASE_PAGE_SIZE + cpu_memory + */
-    /*        monitor_binary_size + cpu_binary_size < (1 << 24)); */
-
-    /* Load cpu */
-    char *target_mem = (char *)mem;
-    struct allocate_state state;
-    state.elfbase = elf_virtual_base(cpu_binary);
-    state.vbase = target_mem + state.elfbase;
-    assert(sizeof(struct x86_core_data) <= BASE_PAGE_SIZE);
-    genvaddr_t cpu_entry;
-    errval_t err = elf_load(EM_386, elfload_allocate, &state, cpu_binary,
-                   cpu_binary_size, &cpu_entry);
-    if (err_is_fail(err)) {
-        return err;
-    }
-
-    // Copy CPU driver binary to target memory
-    target_mem += (state.elfbase + elf_virtual_size(cpu_binary)) & (~0xfff);
-    genpaddr_t cpu_binary_phys = (genpaddr_t)(target_mem - (char *)mem);
-    memcpy(target_mem, (void *)cpu_binary, cpu_binary_size);
-
-    // Copy monitor binary to target memory
-    target_mem += (cpu_binary_size & (~0xfff)) + 0x1000;
-    genpaddr_t monitor_binary_phys = (genpaddr_t)(target_mem - (char *)mem);
-    memcpy(target_mem, (void *)monitor_binary, monitor_binary_size);
-
-    // Copy init binary to target memory
-    target_mem += (monitor_binary_size & (~0xfff)) + 0x1000;
-    genpaddr_t init_binary_phys = (genpaddr_t)(target_mem - (char *)mem);
-    memcpy(target_mem, (void *)init_binary, init_binary_size);
-
-    // Copy mem_serv binary to target memory
-    target_mem += (init_binary_size & (~0xfff)) + 0x1000;
-    genpaddr_t memserv_binary_phys = (genpaddr_t)(target_mem - (char *)mem);
-    memcpy(target_mem, (void *)memserv_binary, memserv_binary_size);
-
-    // Copy spawnd binary to target memory
-    target_mem += (memserv_binary_size & (~0xfff)) + 0x1000;
-    genpaddr_t spawnd_binary_phys = (genpaddr_t)(target_mem - (char *)mem);
-    memcpy(target_mem, (void *)spawnd_binary, spawnd_binary_size);
-
-    // Go to after mem_serv binary image and page-align
-    target_mem += (spawnd_binary_size & (~0xfff)) + 0x1000;
-
-    struct diteinfo *core_data = (struct diteinfo *)
-        ((char *)mem + state.elfbase - BASE_PAGE_SIZE);
-    uint32_t cdbase = state.elfbase - BASE_PAGE_SIZE;
-    memset(core_data, 0, sizeof(struct diteinfo));
-
-    core_data->elf.size = sizeof(struct Elf32_Shdr);
-
-    struct Elf32_Ehdr *head32 = (struct Elf32_Ehdr *)cpu_binary;
-    core_data->elf.addr = cpu_binary_phys + (uintptr_t)head32->e_shoff;
-    core_data->elf.num  = head32->e_shnum;
-
-    // Copy MMAP verbatim
-    core_data->mmap_addr = cdbase + __builtin_offsetof(struct diteinfo, mmap);
-    core_data->mmap_length = glbl_core_data->mmap_length;
-    memcpy(core_data->mmap, (void *)local_phys_to_mem(glbl_core_data->mmap_addr),
-           core_data->mmap_length);
-
-    // Copy cmdline verbatim
-    char *strpos = core_data->strings;
-    core_data->cmdline = cdbase + __builtin_offsetof(struct diteinfo, strings);
-    strcpy(strpos, (void *)local_phys_to_mem(glbl_core_data->cmdline));
-    strpos += strlen(strpos) + 1;
-
-    // Generate modules
-    core_data->mods_count = 5;
-    core_data->mods_addr = cdbase + __builtin_offsetof(struct diteinfo, modinfo);
-
-    // CPU driver
-    core_data->modinfo[0].mod_start = cpu_binary_phys;
-    core_data->modinfo[0].mod_end = cpu_binary_phys + cpu_binary_size;
-    strcpy(strpos, "/scc/sbin/cpu");
-    core_data->modinfo[0].string = cdbase + (uint32_t)(strpos - (char *)core_data);
-    strpos += strlen(strpos) + 1;
-
-    // Monitor
-    core_data->modinfo[1].mod_start = monitor_binary_phys;
-    core_data->modinfo[1].mod_end = monitor_binary_phys + monitor_binary_size;
-    strcpy(strpos, "/scc/sbin/monitor");
-    core_data->modinfo[1].string = cdbase + (uint32_t)(strpos - (char *)core_data);
-    strpos += strlen(strpos) + 1;
-
-    // init module
-    core_data->modinfo[2].mod_start = init_binary_phys;
-    core_data->modinfo[2].mod_end = init_binary_phys + init_binary_size;
-    strcpy(strpos, "/scc/sbin/init");
-    core_data->modinfo[2].string = cdbase + (uint32_t)(strpos - (char *)core_data);
-    strpos += strlen(strpos) + 1;
-
-    // mem_serv module
-    core_data->modinfo[3].mod_start = memserv_binary_phys;
-    core_data->modinfo[3].mod_end = memserv_binary_phys + memserv_binary_size;
-    strcpy(strpos, "/scc/sbin/mem_serv");
-    core_data->modinfo[3].string = cdbase + (uint32_t)(strpos - (char *)core_data);
-    strpos += strlen(strpos) + 1;
-
-    // spawnd module
-    core_data->modinfo[4].mod_start = spawnd_binary_phys;
-    core_data->modinfo[4].mod_end = spawnd_binary_phys + spawnd_binary_size;
-    strcpy(strpos, "/scc/sbin/spawnd");
-    core_data->modinfo[4].string = cdbase + (uint32_t)(strpos - (char *)core_data);
-    strpos += strlen(strpos) + 1;
-
-    core_data->start_free_ram = glbl_core_data->start_free_ram;
-    core_data->urpc_frame_base = urpcframe_base;
-    core_data->urpc_frame_bits = urpcframe_bits;
-    core_data->src_core_id       = my_core_id;
-    core_data->chan_id           = chanid;
-
-    /* // Write back all caches */
-    wbinvd();
-    flush_l2_cache();
-
-    // Start core
-    rck_gcbcfg_t gcbcfg = rck_gcbcfg_rd(&rck[tile]);
-    if(core) {
-        gcbcfg.resc1 = 0;
-        gcbcfg.resl21 = 0;
-    } else {
-        gcbcfg.resc0 = 0;
-        gcbcfg.resl20 = 0;
-    }
-    rck_gcbcfg_wr(&rck[tile], gcbcfg);
-
-    return 0;
-}
diff --git a/kernel/include/arch/scc/rck.h b/kernel/include/arch/scc/rck.h
deleted file mode 100644 (file)
index 44c0701..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2007, 2008, 2010, 2011, 2012, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#ifndef RCK_H
-#define RCK_H
-
-#include <kernel_multiboot.h>
-#include <target/x86/barrelfish_kpi/coredata_target.h>
-
-void rck_init(void);
-uint8_t rck_get_coreid(void);
-void rck_send_notification(uint8_t dest, uintptr_t chanid);
-void rck_handle_notification(void);
-errval_t rck_register_notification(capaddr_t cap, int chanid);
-errval_t rck_delete_notification(int chanid);
-int rck_start_core(uint8_t coreid, genpaddr_t umpframe_base,
-                   uint8_t umpframe_bits, int chanid);
-void rck_reset_lint1(void);
-errval_t rck_get_route(genpaddr_t base, size_t size, uint8_t *route,
-                       uint8_t *subdest, uint16_t *addrbits);
-errval_t rck_map_core_lut(uint8_t entry, uint8_t coreid, uint8_t offset);
-
-#endif
index 5e34743..12eb7f0 100644 (file)
@@ -82,7 +82,6 @@
       archfam_srcs _         = []
 
       -- sources specific to the architecture
-      arch_srcs "scc" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs "x86_32" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs "x86_64" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs "k1om" = [ "arch/x86/ipi_notify.c" ]
       archfam_srcs _         = []
 
       -- sources specific to the architecture
-      arch_srcs "scc" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs "x86_32" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs "x86_64" = [ "arch/x86/ipi_notify.c" ]
       arch_srcs _     = []
index 519667b..8086091 100644 (file)
@@ -21,6 +21,6 @@
                            "-mno-sse3", "-mno-ssse3", "-mno-sse4.1",
                            "-mno-sse4.2", "-mno-sse4", "-mno-sse4a",
                            "-mno-3dnow" ],
-             architectures = [ "x86_64", "x86_32", "scc", "k1om" ]
+             architectures = [ "x86_64", "x86_32", "k1om" ]
            }
 ]
index 03010d8..a2250e4 100644 (file)
@@ -3,7 +3,6 @@ let
     arch_srcs "x86_64"  = [ "x86_64/" ++ x | x <- ["setjmp.S", "memcpy.S", "memset.S"]]
     arch_srcs "k1om"    = [ "x86_64/" ++ x | x <- ["setjmp.S", "memcpy.S", "memset.S"]]
     arch_srcs "x86_32"  = [ "i386/" ++ x   | x <- ["setjmp.S", "memcpy.S", "memset.S"]]
-    arch_srcs "scc"     = [ "i386/" ++ x   | x <- ["setjmp.S", "memcpy.S", "memset.S"]]
     arch_srcs "armv5"   = [ "arm/setjmp.S" ]
     arch_srcs "arm11mp" = [ "arm/setjmp.S" ]
     arch_srcs "xscale"  = [ "arm/setjmp.S" ]
diff --git a/tools/scc/barrelfish48.mt b/tools/scc/barrelfish48.mt
deleted file mode 100644 (file)
index 13200d2..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-# pid mch-route mch-dest-id mch-offset-base testcase
-0x00 0x00 6 0x00 barrelfish0.obj
-0x01 0x00 6 0x01 barrelfish1.obj
-0x02 0x00 6 0x02 barrelfish1.obj
-0x03 0x00 6 0x03 barrelfish1.obj
-0x04 0x00 6 0x04 barrelfish1.obj
-0x05 0x00 6 0x05 barrelfish1.obj
-0x06 0x05 4 0x00 barrelfish1.obj
-0x07 0x05 4 0x01 barrelfish1.obj
-0x08 0x05 4 0x02 barrelfish1.obj
-0x09 0x05 4 0x03 barrelfish1.obj
-0x0a 0x05 4 0x04 barrelfish1.obj
-0x0b 0x05 4 0x05 barrelfish1.obj
-0x0c 0x00 6 0x06 barrelfish1.obj
-0x0d 0x00 6 0x07 barrelfish1.obj
-0x0e 0x00 6 0x08 barrelfish1.obj
-0x0f 0x00 6 0x09 barrelfish1.obj
-0x10 0x00 6 0x0a barrelfish1.obj
-0x11 0x00 6 0x0b barrelfish1.obj
-0x12 0x05 4 0x06 barrelfish1.obj
-0x13 0x05 4 0x07 barrelfish1.obj
-0x14 0x05 4 0x08 barrelfish1.obj
-0x15 0x05 4 0x09 barrelfish1.obj
-0x16 0x05 4 0x0a barrelfish1.obj
-0x17 0x05 4 0x0b barrelfish1.obj
-0x18 0x20 6 0x00 barrelfish1.obj
-0x19 0x20 6 0x01 barrelfish1.obj
-0x1a 0x20 6 0x02 barrelfish1.obj
-0x1b 0x20 6 0x03 barrelfish1.obj
-0x1c 0x20 6 0x04 barrelfish1.obj
-0x1d 0x20 6 0x05 barrelfish1.obj
-0x1e 0x25 4 0x00 barrelfish1.obj
-0x1f 0x25 4 0x01 barrelfish1.obj
-0x20 0x25 4 0x02 barrelfish1.obj
-0x21 0x25 4 0x03 barrelfish1.obj
-0x22 0x25 4 0x04 barrelfish1.obj
-0x23 0x25 4 0x05 barrelfish1.obj
-0x24 0x20 6 0x06 barrelfish1.obj
-0x25 0x20 6 0x07 barrelfish1.obj
-0x26 0x20 6 0x08 barrelfish1.obj
-0x27 0x20 6 0x09 barrelfish1.obj
-0x28 0x20 6 0x0a barrelfish1.obj
-0x29 0x20 6 0x0b barrelfish1.obj
-0x2a 0x25 4 0x06 barrelfish1.obj
-0x2b 0x25 4 0x07 barrelfish1.obj
-0x2c 0x25 4 0x08 barrelfish1.obj
-0x2d 0x25 4 0x09 barrelfish1.obj
-0x2e 0x25 4 0x0a barrelfish1.obj
-0x2f 0x25 4 0x0b barrelfish1.obj
diff --git a/tools/scc/bigimage.map b/tools/scc/bigimage.map
deleted file mode 100644 (file)
index 3316de3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-0x000ff000 bigimage.dat
-0xfffffff0 bootvector.dat
diff --git a/tools/scc/bootscc.sh b/tools/scc/bootscc.sh
deleted file mode 100755 (executable)
index 3c14f1b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# Starts Barrelfish on SCC
-
-# Reset CRBs and everything else
-sccReset -g
-
-# Create an SCC memory image & LUT mapping
-sccMerge -m 8 -n 12 -noimage -lut_default -force barrelfish48.mt
-
-# Preload memory with image
-sccBoot -g obj
-
-# Release reset of core #0
-sccReset -r 0
-
-# Watch the output of all cores as it goes...
-./watchall.sh
diff --git a/tools/scc/bootvector.dat b/tools/scc/bootvector.dat
deleted file mode 100644 (file)
index 135f04e..0000000
Binary files a/tools/scc/bootvector.dat and /dev/null differ
diff --git a/tools/scc/bootvector.map b/tools/scc/bootvector.map
deleted file mode 100644 (file)
index 5c9debd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-0xfffffff0 bootvector.dat
diff --git a/tools/scc/watchall.sh b/tools/scc/watchall.sh
deleted file mode 100755 (executable)
index cffe207..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash -i
-#
-# Shows output of all Barrelfish SCC cores simultaneously, as it arrives.
-
-trap "pkill -P $$" SIGINT
-
-for i in `seq 0 47`; do
-# XXX: We use grep here to enforce line-buffered output, so concurrent
-# input from UARTs isn't garbled.
-    cat /dev/crbif0rb0c${i}ttyS0 | grep ^ -a --line-buffered &
-done
-
-wait
index 333ef58..81da819 100644 (file)
@@ -29,7 +29,7 @@
                                                 ("spawn", ["rpcclient"]), 
                                                 ("monitor_blocking", ["rpcclient"])],
                       addLibraries = [ "mm", "trace", "skb", "dist", "thc" ],
-                     architectures = [ "x86_64", "x86_32", "scc" ]
+                     architectures = [ "x86_64", "x86_32" ]
                     },
 
 -- fully thc
@@ -41,7 +41,7 @@
                                                 ("spawn", ["rpcclient"]),
                                                 ("monitor_blocking", ["rpcclient"])],
                       addLibraries = [ "mm", "trace", "skb", "dist", "thc" ],
-                      architectures = [ "x86_64", "x86_32", "scc" ]
+                      architectures = [ "x86_64", "x86_32" ]
                     },
   build application { target = "mem_bench",
                      cFiles = [ "mem_bench.c", "memtest_trace.c" ],
index da556d5..e9d399c 100644 (file)
@@ -16,7 +16,6 @@
      arch_dirs "x86_32" = [ arch_dir, "arch/x86" ]
      arch_dirs "x86_64" = [ arch_dir, "arch/x86" ]
      arch_dirs "k1om"   = [ arch_dir, "arch/x86" ]
-     arch_dirs "scc"    = [ arch_dir, "arch/x86" ]
      arch_dirs _        = [ arch_dir ]
 
      common_srcs = [ "trace_support.c", "bfscope_support.c", "ram_alloc.c", "inter.c", "spawn.c", "invocations.c", "iref.c",
@@ -32,7 +31,6 @@
      arch_srcs "x86_32"  = [ "arch/x86/boot.c", "arch/x86/inter.c", "arch/x86/monitor_server.c", "arch/x86/notify_ipi.c" ]
      arch_srcs "x86_64"  = [ "arch/x86/boot.c", "arch/x86/inter.c", "arch/x86/monitor_server.c", "arch/x86/notify_ipi.c" ]
      arch_srcs "k1om"    = [ "arch/x86/boot.c", "arch/x86/inter.c", "arch/x86/monitor_server.c", "arch/x86/notify_ipi.c" ]
-     arch_srcs "scc"     = [ "arch/scc/boot.c", "arch/scc/inter.c", "arch/x86/monitor_server.c", "arch/x86/notify_ipi.c" ]
      arch_srcs "armv5"   = [ "arch/arm/boot.c", "arch/arm/inter.c", "arch/arm/monitor_server.c" ]
      arch_srcs "xscale"  = [ "arch/arm/boot.c", "arch/arm/inter.c", "arch/arm/monitor_server.c" ]
      arch_srcs "armv7"   = [ "arch/armv7/boot.c", "arch/armv7/inter.c", "arch/armv7/monitor_server.c", "arch/armv7/notify_ipi.c" ]
diff --git a/usr/monitor/arch/scc/boot.c b/usr/monitor/arch/scc/boot.c
deleted file mode 100644 (file)
index de52552..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/**
- * \file
- * \brief Code for handling booting additional cores
- */
-
-/*
- * Copyright (c) 2010, 2011, 2012, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#include "monitor.h"
-#include <inttypes.h>
-#include <elf/elf.h>
-#include <target/x86/barrelfish_kpi/coredata_target.h>
-#include <barrelfish_kpi/shared_mem_arch.h>
-#include <notify_ipi.h>
-
-struct xcore_bind_handler {
-    coreid_t                    coreid;
-    enum cpu_type               cputype;
-    struct monitor_binding      *binding;
-};
-
-errval_t spawn_xcore_monitor(coreid_t id, int hwid, enum cpu_type cpu_type,
-                             const char *cmdline /* XXX: currently ignored */,
-                             struct intermon_binding **ret_binding)
-{
-    errval_t err;
-
-    switch(cpu_type) {
-    case CPU_SCC:
-        break;
-
-    default:
-        return SPAWN_ERR_UNKNOWN_TARGET_ARCH;
-    }
-
-    // Setup new inter-monitor connection
-    struct intermon_ump_ipi_binding *binding = malloc(sizeof(struct intermon_ump_ipi_binding));
-    assert(binding != NULL);
-
-    // compute size of frame needed and allocate it
-    struct capref frame;
-    size_t framesize = MON_URPC_CHANNEL_LEN * 2;
-    ram_set_affinity(SHARED_MEM_MIN + (PERCORE_MEM_SIZE * my_core_id),
-                     SHARED_MEM_MIN + (PERCORE_MEM_SIZE * (my_core_id + 1)));
-    err = frame_alloc(&frame, framesize, &framesize);
-    if (err_is_fail(err)) {
-        return err_push(err, LIB_ERR_FRAME_ALLOC);
-    }
-    ram_set_affinity(0, 0);
-
-    // Mark it remote
-    bool has_descendants;
-    err = monitor_cap_remote(frame, true, &has_descendants);
-    if (err_is_fail(err)) {
-        return err;
-    }
-
-    // map it in
-    void *buf;
-    err = vspace_map_one_frame_attr(&buf, framesize, frame,
-                                    VREGION_FLAGS_READ_WRITE_NOCACHE, NULL, NULL);
-    if (err_is_fail(err)) {
-        cap_destroy(frame);
-        return err_push(err, LIB_ERR_VSPACE_MAP);
-    }
-
-    memset(buf, 0, framesize);
-
-    // Bootee's notify channel ID is always 0
-    struct capref notify_cap;
-    err = notification_create_cap(0, hwid, &notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // Allocate my own notification caps
-    struct capref ep, my_notify_cap;
-    struct lmp_endpoint *iep;
-    int chanid;
-    err = endpoint_create(LMP_RECV_LENGTH, &ep, &iep);
-    assert(err_is_ok(err));
-    err = notification_allocate(ep, &chanid);
-    assert(err == SYS_ERR_OK);
-    err = notification_create_cap(chanid, my_core_id, &my_notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // init our end of the binding and channel
-    err = intermon_ump_ipi_init(binding, get_default_waitset(),
-                                buf, MON_URPC_CHANNEL_LEN,
-                                buf + MON_URPC_CHANNEL_LEN,
-                                MON_URPC_CHANNEL_LEN, notify_cap,
-                                my_notify_cap, ep, iep);
-    if (err_is_fail(err)) {
-        cap_destroy(frame);
-        return err_push(err, LIB_ERR_UMP_CHAN_BIND);
-    }
-
-    *ret_binding = &binding->b;
-
-    // Identify UMP frame for tracing
-    struct frame_identity umpid;
-    err = invoke_frame_identify(frame, &umpid);
-    assert(err_is_ok(err));
-    binding->ump_state.chan.recvid = (uintptr_t)umpid.base;
-    binding->ump_state.chan.sendid =
-        (uintptr_t)(umpid.base + MON_URPC_CHANNEL_LEN);
-
-    /* Look up information on the urpc_frame cap */
-    struct frame_identity urpc_frame_id  = { .base = 0, .bits = 0 };
-    err = invoke_frame_identify(frame, &urpc_frame_id);
-    assert(err_is_ok(err));
-
-    /* Invoke kernel capability to boot new core */
-    err = invoke_monitor_spawn_scc_core(hwid, urpc_frame_id.base,
-                                        urpc_frame_id.bits, chanid);
-    if (err_is_fail(err)) {
-        return err_push(err, MON_ERR_SPAWN_CORE);
-    }
-
-    return SYS_ERR_OK;
-}
-
-errval_t boot_arch_app_core(int argc, char *argv[],
-                            coreid_t *ret_parent_coreid,
-                            struct intermon_binding **ret_binding)
-{
-    errval_t err;
-    int argn = 1;
-
-    assert(argc == 5);
-
-    // First argument contains the bootinfo location
-    bi = (struct bootinfo*)strtol(argv[argn++], NULL, 10);
-
-    // core_id of the core that booted this core
-    coreid_t core_id = strtol(argv[argn++], NULL, 10);
-    *ret_parent_coreid = core_id;
-
-    // other monitor's channel id
-    assert(strncmp("chanid", argv[argn], strlen("chanid")) == 0);
-    int chan_id = strtol(strchr(argv[argn++], '=') + 1, NULL, 10);
-
-    // other monitor's frame base
-    assert(strncmp("frame", argv[argn], strlen("frame")) == 0);
-    uint64_t chanbase = strtoul(strchr(argv[argn++], '=') + 1, NULL, 10);
-
-    err = monitor_client_setup_mem_serv();
-    assert(err_is_ok(err));
-
-    /* Wait for mem_serv to advertise its iref to us */
-    while (mem_serv_iref == 0) {
-        messages_wait_and_handle_next();
-    }
-
-    /* Can now connect to and use mem_serv */
-    err = ram_alloc_set(NULL);
-    if (err_is_fail(err)) {
-        return err_push(err, LIB_ERR_RAM_ALLOC_SET);
-    }
-
-    printf("frame base at 0x%llx -- 0x%llx\n", chanbase, chanbase + BASE_PAGE_SIZE);
-
-    assert(MON_URPC_CHANNEL_LEN * 2 <= BASE_PAGE_SIZE);
-    ram_set_affinity(chanbase, chanbase + BASE_PAGE_SIZE);
-    struct capref frame;
-    err = frame_alloc(&frame, MON_URPC_CHANNEL_LEN * 2, NULL);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "frame_alloc failed");
-        return err; // FIXME: cleanup
-    }
-    ram_set_affinity(0, 0);     // Reset affinity
-
-    struct frame_identity frameid = { .base = 0, .bits = 0 };
-    err = invoke_frame_identify(frame, &frameid);
-    assert(err == SYS_ERR_OK);
-
-    printf("URPC physical frame at 0x%llx\n", frameid.base);
-
-    // Map frame locally
-    // XXX: Remove this and use URPC_BASE when spawning from other core
-    void *buf;
-    err = vspace_map_one_frame_attr(&buf, MON_URPC_CHANNEL_LEN * 2, frame,
-                                    VREGION_FLAGS_READ_WRITE_NOCACHE, NULL,
-                                    NULL);
-    if (err_is_fail(err)) {
-        return err_push(err, LIB_ERR_VSPACE_MAP);
-    }
-
-    // Create notify cap to other monitor
-    struct capref notify_cap;
-    err = notification_create_cap(chan_id, core_id, &notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // Allocate my own notification caps
-    struct capref ep, my_notify_cap;
-    struct lmp_endpoint *iep;
-    int chanid;
-    err = endpoint_create(LMP_RECV_LENGTH, &ep, &iep);
-    assert(err_is_ok(err));
-    err = notification_allocate(ep, &chanid);
-    assert(err == SYS_ERR_OK);
-    assert(chanid == 0);        // Make sure it's channel 0
-    err = notification_create_cap(chanid, my_core_id, &my_notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // setup our side of the binding
-    struct intermon_ump_ipi_binding *rckb;
-    rckb = malloc(sizeof(struct intermon_ump_ipi_binding));
-    assert(rckb != NULL);
-    err = intermon_ump_ipi_init(rckb, get_default_waitset(),
-                                buf + MON_URPC_CHANNEL_LEN,
-                                MON_URPC_CHANNEL_LEN,
-                                buf, MON_URPC_CHANNEL_LEN, notify_cap,
-                                my_notify_cap, ep, iep);
-    if (err_is_fail(err)) {
-        err = err_push(err, LIB_ERR_UMP_CHAN_BIND);
-        return err;
-    }
-
-    // Identify UMP frame for tracing
-    rckb->ump_state.chan.sendid = (uintptr_t)frameid.base;
-    rckb->ump_state.chan.recvid =
-        (uintptr_t)(frameid.base + MON_URPC_CHANNEL_LEN);
-
-    *ret_binding = &rckb->b;
-
-    return SYS_ERR_OK;
-}
diff --git a/usr/monitor/arch/scc/inter.c b/usr/monitor/arch/scc/inter.c
deleted file mode 100644 (file)
index d08f2f0..0000000
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * \file
- * \brief Arch-specific inter-monitor communication
- */
-
-/*
- * Copyright (c) 2009, 2010, 2011, 2012, ETH Zurich.
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-#include <inttypes.h>
-#include "monitor.h"
-#include <trace/trace.h>
-#include <barrelfish_kpi/shared_mem_arch.h>
-#include <notify_ipi.h>
-
-/******* stack-ripped bind_monitor_request_scc *******/
-
-static void bind_monitor_reply_scc_handler(struct intermon_binding *b,
-                                           struct intermon_msg_queue_elem *e);
-
-struct bind_monitor_reply_scc_state {
-    struct intermon_msg_queue_elem elem;
-    struct intermon_bind_monitor_reply_scc__args args;
-};
-
-static void bind_monitor_reply_scc_cont(struct intermon_binding *b,
-                                        errval_t err, chanid_t chanid)
-{
-    errval_t err2;
-
-    err2 = b->tx_vtbl.bind_monitor_reply_scc(b, NOP_CONT, err,
-                                             chanid, my_core_id);
-    if (err_is_fail(err2)) {
-        if(err_no(err2) == FLOUNDER_ERR_TX_BUSY) {
-            struct bind_monitor_reply_scc_state *me =
-                malloc(sizeof(struct bind_monitor_reply_scc_state));
-            assert(me != NULL);
-            struct intermon_state *ist = b->st;
-            assert(ist != NULL);
-            me->args.err = err;
-            me->args.chan_id = chanid;
-            me->elem.cont = bind_monitor_reply_scc_handler;
-
-            err = intermon_enqueue_send(b, &ist->queue,
-                                        get_default_waitset(), &me->elem.queue);
-            assert(err_is_ok(err));
-            return;
-        }
-
-        DEBUG_ERR(err2, "reply failed");
-    }
-}
-
-static void bind_monitor_reply_scc_handler(struct intermon_binding *b,
-                                           struct intermon_msg_queue_elem *e)
-{
-    struct bind_monitor_reply_scc_state *st = (struct bind_monitor_reply_scc_state *)e;
-    bind_monitor_reply_scc_cont(b, st->args.err, st->args.chan_id);
-    free(e);
-}
-
-/**
- * \brief A monitor receives request to setup a connection
- * with another newly booted monitor from a third monitor
- */
-static void bind_monitor_request_scc(struct intermon_binding *b,
-                                     coreid_t core_id, 
-                                     intermon_caprep_t caprep,
-                                     chanid_t chan_id, 
-                                     coreid_t from_core_id)
-{
-    struct intermon_ump_ipi_binding *umpb = NULL;
-    errval_t err;
-
-    /* Create the cap */
-    struct capability cap_raw;
-    caprep_to_capability(&caprep, &cap_raw);
-    if (cap_raw.type != ObjType_Frame) {
-        err = MON_ERR_WRONG_CAP_TYPE;
-        goto error;
-    }
-
-    struct capref frame;
-    err = slot_alloc(&frame);
-    if (err_is_fail(err)) {
-        goto error;
-    }
-
-    ram_set_affinity(cap_raw.u.frame.base, cap_raw.u.frame.base + ((genpaddr_t)1 << cap_raw.u.frame.bits));
-    err = frame_alloc(&frame, ((genpaddr_t)1 << cap_raw.u.frame.bits), NULL);
-    ram_set_affinity(0,0);
-    
-    /* err = monitor_cap_create(frame, &cap_raw, core_id); */
-    if (err_is_fail(err)) {
-        goto error;
-    }
-
-    struct frame_identity frameid = { .base = 0, .bits = 0 };
-    err = invoke_frame_identify(frame, &frameid);
-    assert(err == SYS_ERR_OK);
-
-    printf("bind_monitor_request: URPC physical frame at 0x%llx\n", frameid.base);
-
-    /* Setup the connection */
-    void *buf;
-    err = vspace_map_one_frame_attr(&buf, MON_URPC_SIZE, frame,
-                                    VREGION_FLAGS_READ_WRITE_NOCACHE, NULL,
-                                    NULL);
-    if (err_is_fail(err)) {
-        err = err_push(err, LIB_ERR_VSPACE_MAP);
-        goto error;
-    }
-
-    // Create remote notify cap
-    struct capref notify_cap;
-    err = notification_create_cap(chan_id, core_id, &notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // Allocate my own notification caps
-    struct capref ep, my_notify_cap;
-    struct lmp_endpoint *iep;
-    int chanid;
-    err = endpoint_create(LMP_RECV_LENGTH, &ep, &iep);
-    assert(err_is_ok(err));
-    err = notification_allocate(ep, &chanid);
-    assert(err == SYS_ERR_OK);
-    err = notification_create_cap(chanid, my_core_id, &my_notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // setup our side of the binding
-    umpb = malloc(sizeof(struct intermon_ump_ipi_binding));
-    assert(umpb != NULL);
-
-    err = intermon_ump_ipi_init(umpb, get_default_waitset(),
-                                buf + MON_URPC_CHANNEL_LEN,
-                                MON_URPC_CHANNEL_LEN,
-                                buf, MON_URPC_CHANNEL_LEN, notify_cap,
-                                my_notify_cap, ep, iep);
-    assert(err_is_ok(err));
-
-    // Identify UMP frame for tracing
-    struct frame_identity umpid;
-    err = invoke_frame_identify(frame, &umpid);
-    assert(err_is_ok(err));
-    umpb->ump_state.chan.recvid = (uintptr_t)umpid.base;
-    umpb->ump_state.chan.sendid =
-        (uintptr_t)(umpid.base + MON_URPC_CHANNEL_LEN);
-
-    // connect it to our request handlers
-    err = intermon_init(&umpb->b, core_id);
-    assert(err_is_ok(err));
-
-    /* Send reply */
-reply:
-    assert(umpb != NULL);
-    bind_monitor_reply_scc_cont(&umpb->b, err, chanid);
-    return;
-
-error:
-    assert(!"Argh");
-    // FIXME: cleanup!
-    goto reply;
-}
-
-/**
- * \brief The monitor that proxied the request for one monitor to
- * setup a connection with another monitor gets the reply
- */
-static void bind_monitor_reply_scc(struct intermon_binding *binding,
-                                   errval_t err, chanid_t chan_id,
-                                   coreid_t core_id)
-{
-    struct intermon_ump_ipi_binding *b = (struct intermon_ump_ipi_binding *)binding;
-
-    // Create notify cap to that core
-    struct capref notify_cap;
-    err = notification_create_cap(chan_id, core_id, &notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // And assign it to the binding
-    err = ipi_notify_set(&b->ipi_notify, notify_cap);
-    assert(err_is_ok(err));
-
-    if (err_is_fail(err)) { // XXX
-        DEBUG_ERR(err, "Got error in bind monitor reply");
-    }
-}
-
-/******* stack-ripped bind_monitor_proxy_scc *******/
-
-static void bind_monitor_request_scc_handler(struct intermon_binding *b,
-                                           struct intermon_msg_queue_elem *e);
-
-struct bind_monitor_request_scc_state {
-    struct intermon_msg_queue_elem elem;
-    struct intermon_bind_monitor_request_scc__args args;
-};
-
-static void bind_monitor_request_scc_cont(struct intermon_binding *dst_binding,
-                                          coreid_t src_core_id, 
-                                          intermon_caprep_t caprep,
-                                          chanid_t chan_id,
-                                          coreid_t core_id)
-{
-    errval_t err;
-
-    err = dst_binding->tx_vtbl.
-        bind_monitor_request_scc(dst_binding, NOP_CONT, src_core_id, 
-                                 caprep, chan_id, core_id);
-    if (err_is_fail(err)) {
-        if(err_no(err) == FLOUNDER_ERR_TX_BUSY) {
-            struct bind_monitor_request_scc_state *me =
-                malloc(sizeof(struct bind_monitor_request_scc_state));
-            assert(me != NULL);
-            struct intermon_state *ist = dst_binding->st;
-            assert(ist != NULL);
-            me->args.core_id = src_core_id;
-            me->args.cap = caprep;
-            me->args.chan_id = chan_id;
-            me->args.from_core_id = core_id;
-            me->elem.cont = bind_monitor_request_scc_handler;
-
-            err = intermon_enqueue_send(dst_binding, &ist->queue,
-                                        get_default_waitset(), &me->elem.queue);
-            assert(err_is_ok(err));
-            return;
-        }
-
-        DEBUG_ERR(err, "forwarding bind request failed");
-    }
-}
-
-static void bind_monitor_request_scc_handler(struct intermon_binding *b,
-                                           struct intermon_msg_queue_elem *e)
-{
-    struct bind_monitor_request_scc_state *st = (struct bind_monitor_request_scc_state *)e;
-    bind_monitor_request_scc_cont(b, st->args.core_id, st->args.cap,
-                                  st->args.chan_id, st->args.from_core_id);
-    free(e);
-}
-
-/**
- * \brief A monitor asks this monitor to proxy
- * its request to bind to another monitor
- */
-static void bind_monitor_proxy_scc(struct intermon_binding *b,
-                                   coreid_t dst_core_id,
-                                   intermon_caprep_t caprep,
-                                   chanid_t chan_id,
-                                   coreid_t core_id)
-{
-    seen_connections++;
-    errval_t err;
-
-    /* Get source monitor's core id */
-    coreid_t src_core_id = ((struct intermon_state *)b->st)->core_id;
-
-    /* Get destination monitor */
-    struct intermon_binding *dst_binding = NULL;
-    err = intermon_binding_get(dst_core_id, &dst_binding);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "intermon_binding_get failed");
-    }
-
-    // Proxy the request
-    bind_monitor_request_scc_cont(dst_binding, src_core_id, 
-                                  caprep, chan_id, core_id);
-}
-
-/**
- * \brief Notification of a newly booted monitor.
- *  Setup our connection and request the sender to proxy
- *  the bind request to the monitor
- */
-static void new_monitor_notify(struct intermon_binding *b,
-                               coreid_t core_id)
-{
-    errval_t err;
-
-    /* Setup the connection */
-    ram_set_affinity(SHARED_MEM_MIN + (PERCORE_MEM_SIZE * my_core_id),
-                     SHARED_MEM_MIN + (PERCORE_MEM_SIZE * (my_core_id + 1)));
-    struct capref frame;
-    err = frame_alloc(&frame, MON_URPC_SIZE, NULL);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "frame_alloc failed");
-        return; // FIXME: cleanup
-    }
-    ram_set_affinity(0, 0);     // Reset affinity
-
-    void *buf;
-    err = vspace_map_one_frame_attr(&buf, MON_URPC_SIZE, frame, VREGION_FLAGS_READ_WRITE_NOCACHE, NULL, NULL);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "vspace_map_one_frame failed");
-        assert(buf); // XXX
-    }
-    // XXX: Clear the frame (kernel can't do it for us)
-    memset(buf, 0, MON_URPC_SIZE);
-
-    // Allocate my own notification caps
-    struct capref ep, my_notify_cap;
-    struct lmp_endpoint *iep;
-    int chanid;
-    err = endpoint_create(LMP_RECV_LENGTH, &ep, &iep);
-    assert(err_is_ok(err));
-    err = notification_allocate(ep, &chanid);
-    assert(err == SYS_ERR_OK);
-    err = notification_create_cap(chanid, my_core_id, &my_notify_cap);
-    assert(err == SYS_ERR_OK);
-
-    // init our end of the binding and channel
-    struct intermon_ump_ipi_binding *ump_binding =
-        malloc(sizeof(struct intermon_ump_ipi_binding));
-    assert(ump_binding != NULL);
-    err = intermon_ump_ipi_init(ump_binding, get_default_waitset(),
-                                buf, MON_URPC_CHANNEL_LEN,
-                                buf + MON_URPC_CHANNEL_LEN,
-                                MON_URPC_CHANNEL_LEN, NULL_CAP, my_notify_cap,
-                                ep, iep);
-    assert(err_is_ok(err));
-    /* if (err_is_fail(err)) { */
-    /*     cap_destroy(frame); */
-    /*     return err_push(err, LIB_ERR_UMP_CHAN_BIND); */
-    /* } */
-
-    // Identify UMP frame for tracing
-    struct frame_identity umpid = { .base = 0, .bits = 0 };
-    err = invoke_frame_identify(frame, &umpid);
-    assert(err_is_ok(err));
-    ump_binding->ump_state.chan.recvid = (uintptr_t)umpid.base;
-    ump_binding->ump_state.chan.sendid =
-        (uintptr_t)(umpid.base + MON_URPC_CHANNEL_LEN);
-
-    err = intermon_init(&ump_binding->b, core_id);
-    assert(err_is_ok(err));
-
-    /* Identify the frame cap */
-    struct capability frame_cap;
-    err = monitor_cap_identify(frame, &frame_cap);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "monitor_cap_identify failed");
-        return; // FIXME: cleanup
-    }
-
-    intermon_caprep_t caprep;
-    capability_to_caprep(&frame_cap, &caprep);
-
-    /* reply to the sending monitor to proxy request */
-    err = b->tx_vtbl.bind_monitor_proxy_scc(b, NOP_CONT, core_id,
-                                            caprep, chanid, my_core_id);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "bind proxy request failed");
-    }
-}
-
-errval_t arch_intermon_init(struct intermon_binding *b)
-{
-    b->rx_vtbl.bind_monitor_request_scc = bind_monitor_request_scc;
-    b->rx_vtbl.bind_monitor_reply_scc = bind_monitor_reply_scc;
-    b->rx_vtbl.bind_monitor_proxy_scc = bind_monitor_proxy_scc;
-    b->rx_vtbl.new_monitor_notify = new_monitor_notify;
-
-    return SYS_ERR_OK;
-}
index 14aca2b..4ab68db 100644 (file)
@@ -23,6 +23,6 @@
                                  "-Wmissing-declarations",
                                  "-Wmissing-field-initializers",
                                  "-Wredundant-decls", "-std=c99" ],
-                 architectures = [ "x86_64", "x86_32", "scc" ]
+                 architectures = [ "x86_64", "x86_32" ]
                 }
 ]
index 6cbabfd..2afb8ff 100644 (file)
@@ -47,7 +47,7 @@ in
                               "bip_load.c", "handlers.c"],
                   addIncludes = includes,
                   omitCFlags = unflags,
-                  architectures = [ "x86_64", "x86_32", "scc" ]
+                  architectures = [ "x86_64", "x86_32" ]
                 },
     build library { target = "dummies",
                     cFiles = [ "lib1.c", "lib2.c", "lib3.c", "lib4.c",
@@ -57,6 +57,6 @@ in
                                "whereami_default.c", "dummy_bigrat.c" ],
                   addIncludes = includes,
                   omitCFlags = unflags,
-                  architectures = [ "x86_64", "x86_32", "scc" ]
+                  architectures = [ "x86_64", "x86_32" ]
                   }
   ]
index 22b262a..2bd06d4 100644 (file)
@@ -24,7 +24,7 @@
                                 "-Wmissing-declarations",
                                 "-Wmissing-field-initializers",
                                 "-Wredundant-decls", "-std=c99" ],
-                  architectures = [ "x86_64", "x86_32", "scc" ]
+                  architectures = [ "x86_64", "x86_32" ]
                     }
 ]
 
index 79baab6..17beed4 100644 (file)
 --
 --------------------------------------------------------------------------
 
-[  build application { target = "skb",
-                       flounderBindings = [ "octopus" ],
-                       flounderDefs = [ "monitor", "monitor_blocking", "octopus" ],
-                       flounderExtraDefs = [ ("monitor_blocking", ["rpcclient"]) ],
-                       mackerelDevices = [ "acpi_ec", "lpc_ioapic" ],                      
-                       cFiles = [ "main.c", "octopus_stubs.c" ],
-                       addLibraries = [ "octopus_server", "octopus_parser", "pcre" ],
-                       architectures = [ "armv5", "armv7","armv7-m", "xscale", "scc", "k1om" ]
+[  build application {
+        target = "skb",
+        flounderBindings = [ "octopus" ],
+        flounderDefs = [ "monitor", "monitor_blocking", "octopus" ],
+        flounderExtraDefs = [ ("monitor_blocking", ["rpcclient"]) ],
+        mackerelDevices = [ "acpi_ec", "lpc_ioapic" ],                      
+        cFiles = [ "main.c", "octopus_stubs.c" ],
+        addLibraries = [ "octopus_server", "octopus_parser", "pcre" ],
+        architectures = [ "armv5", "armv7","armv7-m", "xscale", "k1om" ]
    }
 ]
index 36db632..06dc7d2 100644 (file)
@@ -17,7 +17,7 @@
 [ build application { target = "net-test",
                       cFiles = [ "net-test.c" ],
                       addLibraries = libDeps [ "vfs", "posixcompat", "lwip" ],
-                      architectures = [ "x86_64", "scc" ]
+                      architectures = [ "x86_64" ]
                    -- omitCFlags = [ "-Wredundant-decls" ]
                     }
 ]