Removed RCK_EMU and updated SCC tech note.
authorSimon Peter <speter@inf.ethz.ch>
Thu, 10 May 2012 14:14:57 +0000 (16:14 +0200)
committerSimon Peter <speter@inf.ethz.ch>
Thu, 10 May 2012 14:14:57 +0000 (16:14 +0200)
18 files changed:
doc/005-scc/SCC.tex
hake/Config.hs.template
include/arch/x86/barrelfish_kpi/asm_inlines_arch.h
kernel/arch/scc/rck.c
kernel/arch/x86/apic.c
kernel/arch/x86_32/init.c
lib/barrelfish/bulk_transfer.c
lib/barrelfish/ump_chan.c
lib/lwip/src/barrelfish/mem_barrelfish.c
lib/net_device_manager/soft_filt_cl_impl.c
lib/procon/procon.c
lib/rcce/bcast.c
usr/bench/bench.c
usr/monitor/arch/scc/boot.c
usr/monitor/arch/scc/inter.c
usr/monitor/boot.c
usr/monitor/main.c
usr/monitor/ram_alloc.c

index e0d9d11..c4825a9 100644 (file)
@@ -1,5 +1,5 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Copyright (c) 2011, ETH Zurich.
+% Copyright (c) 2011, 2012, ETH Zurich.
 % All rights reserved.
 %
 % This file is distributed under the terms in the attached LICENSE file.
@@ -33,6 +33,8 @@
 \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.}
 \end{versionhistory}
 
 % \intro{Abstract}             % Insert abstract here
@@ -86,6 +88,9 @@ understand the SCC-specific functionality in Barrelfish.
   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
@@ -119,56 +124,15 @@ 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, and
-kernel-mode support for multiplexing access to message passing buffers
-(MPBs) and configuration registers.
-
-\section{Console driver}
-
-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.
+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.
 
-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.
+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}
 
@@ -190,12 +154,16 @@ produce a bootable binary image file:
   (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 following SCC tools are invoked in order on the host PC to
-bootstrap the first SCC 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
@@ -208,14 +176,14 @@ 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 file. It is configured to create a
-copy of the 32.obj image into each core's private RAM at identical
-locations. Also, 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.
+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.
@@ -235,35 +203,50 @@ 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
-megabyte of the bootee. The last 4K page of that region is then mapped
-into the booter kernel's remappable region.
-
-This page contains the boot configuration, which is modified to tell
-the bootee that it is an application kernel and the address of the
-inter-monitor CC-UMP message passing region in shared RAM, 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.
+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.
+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 (+1)\\
+Area & start & end\\
 \hline
-Private DDR3 RAM & 0 & 0x14000000 \\
-Shared DDR3 RAM & 0x80000000 &0x84000000 \\
-On-tile MPBs & 0xc0000000 & 0xd8000000 \\
-Local on-tile MPB & 0xd8000000 & 0xd9000000 \\
-Configuration registers & 0xe0000000 & 0xf8000000 \\
-Local configuration regs & 0xf8000000 & 0xf9000000 \\
+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}
 
@@ -299,14 +282,11 @@ addresses.
 A memory allocation server (\texttt{mem\_serv}) is spawned for every
 on-line core in the system.
 
-Available shared RAM (of 64MB) is reduced to 48MB and partitioned into
-48 regions of 1MB each. The remaining shared RAM of 16MB 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 those of sizes that are not a power of two. If the
-available space of 64MB would have been evenly partitioned, it would
-have resulted in a size of 1398101 bytes for each region, not a power
-of two and not naturally aligned.
+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
@@ -549,28 +529,6 @@ 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.
 
-\section{MPB emulator}
-
-As part of development, an MPB emulator for x86-32 was created.
-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.
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Hardware measurements}\label{chap:bench}
 
@@ -1399,6 +1357,83 @@ 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}
 
index f392eb8..165474f 100644 (file)
@@ -1,5 +1,5 @@
 --------------------------------------------------------------------------
--- Copyright (c) 2007-2010, ETH Zurich.
+-- Copyright (c) 2007-2010, 2012, ETH Zurich.
 -- All rights reserved.
 --
 -- This file is distributed under the terms in the attached LICENSE file.
@@ -194,9 +194,6 @@ pse_paging = False
 nxe_paging :: Bool
 nxe_paging = False
 
-rck_emu :: Bool
-rck_emu = False
-
 oneshot_timer :: Bool
 oneshot_timer = False
 
@@ -241,7 +238,6 @@ defines = [ Str ("-D" ++ d) | d <- [
              if pae_paging then "CONFIG_PAE" else "",
              if pse_paging then "CONFIG_PSE" else "",
              if nxe_paging then "CONFIG_NXE" else "",
-             if rck_emu then "RCK_EMU" else "",
              if libc == "oldc" then "CONFIG_OLDC" else "CONFIG_NEWLIB",
              if oneshot_timer then "CONFIG_ONESHOT_TIMER" else "",
              if use_kaluga_dvm then "USE_KALUGA_DVM" else ""
index d77048e..9607f1b 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
+ * Copyright (c) 2007, 2008, 2009, 2010, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -89,9 +89,7 @@ static inline void cache_flush_range(void *base, size_t len)
 #ifdef __scc__
 static inline void cl1flushmb(void)
 {
-#ifndef RCK_EMU
     __asm volatile ( ".byte 0x0f; .byte 0x0a;\n" ); // CL1FLUSHMB
-#endif
 }
 #endif
 
index 12b9c5f..d7739a9 100644 (file)
 #define RCK_CFG_REGS_OWN        0xf8000000
 
 /// Physical base address for message passing buffers (MPBs) in the default PTE map
-#ifndef RCK_EMU
-#       define RCK_MPB_BASE             0xc0000000
-#else
-#       define RCK_MPB_BASE             0x7a00000
-#endif
+#define RCK_MPB_BASE             0xc0000000
 
 /// Physical base address for own MPB
 #define RCK_MPB_OWN             0xd8000000
 
 /// Address range mapped by one LUT entry
-#ifndef RCK_EMU
-#       define LUT_SIZE                 0x1000000
-#else
-#       define LUT_SIZE                 (4 * BASE_PAGE_SIZE)
-#endif
+#define LUT_SIZE                 0x1000000
 
 // Max number of notification IDs that fit into message passing buffers
 #define MAX_CHANIDS             65280
@@ -107,16 +99,11 @@ static lvaddr_t mpb[NUM_RCK_TILES];
 /// User-space endpoints awaiting notifications
 static struct cte endpoints[MAX_CHANIDS];
 
-#ifdef RCK_EMU
-static spinlock_t locks[NUM_RCK_TILES * 2];
-#endif
-
 /**
  * Acquire test&set lock.
  */
 static void __attribute__ ((noinline)) acquire_lock(uint8_t dest)
 {
-#ifndef RCK_EMU
     int tile = dest / 2, core = dest % 2;
     /* rck_tas_t tas; */
 
@@ -131,10 +118,6 @@ static void __attribute__ ((noinline)) acquire_lock(uint8_t dest)
     do {
         tas = rck_tas_rd_raw(&rck[tile], core);
     } while(tas == 0);
-#else
-    // Memory lock
-    acquire_spinlock(&locks[dest]);
-#endif
 }
 
 /**
@@ -142,7 +125,6 @@ static void __attribute__ ((noinline)) acquire_lock(uint8_t dest)
  */
 static inline void release_lock(uint8_t dest)
 {
-#ifndef RCK_EMU
     int tile = dest / 2, core = dest % 2;
     /* rck_tas_t tas; */
 
@@ -152,29 +134,17 @@ static inline void release_lock(uint8_t dest)
 
     uint32_t tas = 0;
     rck_tas_wr_raw(&rck[tile], core, tas);
-#else
-    // Memory lock
-    release_spinlock(&locks[dest]);
-#endif
 }
 
-#ifdef RCK_EMU
-static char cfgregs[2 * BASE_PAGE_SIZE];
-#endif
-
 /**
  * Initialize RCK driver by mapping in config registers and MPBs.
  */
 void rck_init(void)
 {
     for(int i = 0; i < NUM_RCK_TILES; i++) {
-#ifndef RCK_EMU
         void *rck_base =
             (void *)paging_map_device(RCK_CFG_REGS_BASE + LUT_SIZE * i,
                                       2 * BASE_PAGE_SIZE);
-#else
-        void *rck_base = &cfgregs;
-#endif
         assert(rck_base != NULL);
         rck_initialize(&rck[i], rck_base);
 
@@ -264,7 +234,6 @@ void rck_init(void)
  */
 uint8_t rck_get_coreid(void)
 {
-#ifndef RCK_EMU
     /* rck_tileid_t tileid = rck_tileid_rd(&rck_own); */
     uint32_t core = rck_tileid_rd_raw(&rck_own);
 
@@ -282,9 +251,6 @@ uint8_t rck_get_coreid(void)
 
     /* return (NUM_CORES*NUM_COLS*tileid.y)+(NUM_CORES*tileid.x)+tileid.coreid; */
     return (NUM_CORES*NUM_COLS*y)+(NUM_CORES*x)+core;
-#else
-    return apic_get_id();
-#endif
 }
 
 extern struct dcb *run_next;
@@ -368,7 +334,6 @@ void rck_send_notification(uint8_t dest, uintptr_t chanid)
 
 #ifndef NO_INTERRUPT
     // Send the interrupt if not already pending
-#       ifndef RCK_EMU
     /* rck_glcfg_t glcfg = rck_glcfg_rd(&rck[tile], core); */
     /* if(!glcfg.intr) { */
     /*     glcfg.intr = 1; */
@@ -379,9 +344,6 @@ void rck_send_notification(uint8_t dest, uintptr_t chanid)
         glcfg |= 1 << 1;
         rck_glcfg_wr_raw(&rck[tile], core, glcfg);
     }
-#       else
-    apic_send_std_ipi(dest, 0, APIC_SCC_INTER_CORE_VECTOR);
-#       endif
 #endif
 
     release_lock(dest);
index e6137dc..b3f087f 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, 2010, 2011, ETH Zurich.
+ * Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -114,7 +114,7 @@ void apic_init(void)
         local_phys_to_mem((lpaddr_t)&x86_64_init_ap_wait - ((lpaddr_t)&x86_64_start_ap) +
                           X86_64_REAL_MODE_LINEAR_OFFSET);
 #elif defined (__i386__)
-#       if !defined(__scc__) || defined(RCK_EMU)
+#       if !defined(__scc__)
     volatile uint32_t *ap_wait = (volatile uint32_t *)
         local_phys_to_mem((lpaddr_t)&x86_32_init_ap_wait - ((lpaddr_t)&x86_32_start_ap) +
                           X86_32_REAL_MODE_LINEAR_OFFSET);
@@ -123,7 +123,7 @@ void apic_init(void)
 #error "Architecture not supported"
 #endif
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#if !defined(__scc__)
     ia32_apic_base_t apic_base_msr = ia32_apic_base_rd(NULL);
     lpaddr_t apic_phys = ((lpaddr_t)apic_base_msr) & APIC_BASE_ADDRESS_MASK;
     lvaddr_t apic_base = paging_map_device(apic_phys, APIC_PAGE_SIZE);
@@ -140,7 +140,7 @@ void apic_init(void)
           apic_phys, apic_base);
     xapic_initialize(&apic, (void *)apic_base);
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#if !defined(__scc__)
     apic_id = apic_get_id();
     debug(SUBSYS_APIC, "APIC ID=%hhu\n", apic_id);
     if (ia32_apic_base_bsp_extract(apic_base_msr)) {
@@ -188,7 +188,7 @@ void apic_init(void)
        xapic_lvt_thermal_wr(&apic, t);
     }
 
-#if defined(__scc__) && !defined(RCK_EMU)
+#if defined(__scc__)
     //LINT0: inter-core interrupt
     //generate fixed int
     {
@@ -251,7 +251,7 @@ void apic_init(void)
     }
 #endif
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#if !defined(__scc__)
     // enable the thing, if it wasn't already!
     if (!(ia32_apic_base_global_extract(apic_base_msr))) {
         ia32_apic_base_global_insert(apic_base_msr, 1);
index 30c1f22..5fec5a1 100644 (file)
@@ -561,14 +561,11 @@ static void  __attribute__ ((noreturn, noinline)) text_init(void)
     apic_init();
 
 #ifdef __scc__
-#ifndef RCK_EMU
     enable_message_passing();
-#endif
 
     // Initialize Rockcreek driver
     rck_init();
 
-
     // XXX: Set core ID and fake APIC ID to be the tile's core ID
     my_core_id = apic_id = rck_get_coreid();
     printf("My APIC ID: %d\n", apic_id);
@@ -577,11 +574,7 @@ static void  __attribute__ ((noreturn, noinline)) text_init(void)
     // do not remove/change this printf: needed by regression harness
 #ifndef __scc__
     printf("Barrelfish CPU driver starting on x86_32 core %u\n", apic_id);
-#else
-    printf("Barrelfish CPU driver starting on scc core %u\n", apic_id);
-#endif
 
-#if !defined(__scc__) || defined(RCK_EMU)
     if(apic_is_bsp()) {
         // Initialize classic (8259A) PIC
         pic_init();
@@ -589,6 +582,8 @@ static void  __attribute__ ((noreturn, noinline)) text_init(void)
 
     // Initialize real-time clock
     rtc_init();
+#else
+    printf("Barrelfish CPU driver starting on scc core %u\n", apic_id);
 #endif
 
     // Initialize local APIC timer
index 540b80f..9650f7d 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2009, 2010, 2011, ETH Zurich.
+ * Copyright (c) 2009, 2010, 2011, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -107,7 +107,7 @@ errval_t bulk_create(size_t size, size_t block_size, struct capref *shared_mem,
 {
     // Create a Frame Capability 
     size_t allocated_size;
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     if (LMP_only) {
         ram_set_affinity(0x0, PRIVATE_MEM_MAX);
     } else {
@@ -123,7 +123,7 @@ errval_t bulk_create(size_t size, size_t block_size, struct capref *shared_mem,
 #endif
 
     errval_t r = frame_alloc(shared_mem, size, &allocated_size);
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     ram_set_affinity(0, 0);
 #endif
     if (err_is_fail(r)) {
index de57fad..64505c3 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2009, 2010, ETH Zurich.
+ * Copyright (c) 2009, 2010, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -241,7 +241,7 @@ errval_t ump_chan_bind(struct ump_chan *uc, struct ump_bind_continuation cont,
 
     // compute size of frame needed and allocate it
     size_t framesize = inchanlen + outchanlen;
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     ram_set_affinity(SHARED_MEM_MIN + (PERCORE_MEM_SIZE * disp_get_core_id()),
                      SHARED_MEM_MIN + (PERCORE_MEM_SIZE * (disp_get_core_id() + 1)));
 #endif
@@ -249,7 +249,7 @@ errval_t ump_chan_bind(struct ump_chan *uc, struct ump_bind_continuation cont,
     if (err_is_fail(err)) {
         return err_push(err, LIB_ERR_FRAME_ALLOC);
     }
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     ram_set_affinity(0, 0);
 #endif
 
index 1c1be25..e7e504c 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich
+ * Copyright (c) 2007, 2008, 2009, 2010, 2012, ETH Zurich
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -128,11 +128,11 @@ uint8_t *mem_barrelfish_alloc(uint8_t binding_index, uint32_t size)
     LWIPBF_DEBUG("allocating %" PRIx32 " bytes of memory.\n", size);
 
     struct bulk_transfer bt_packet;
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     err = bulk_create(size, PBUF_PKT_SIZE, &(buf->cap), &bt_packet, true);
 #else
     err = bulk_create(size, PBUF_PKT_SIZE, &(buf->cap), &bt_packet, false);
-#endif                          // defined(__scc__) && !defined(RCK_EMU)
+#endif
     if (err_is_fail(err)) {
         DEBUG_ERR(err, "bulk_create failed.");
         return NULL;
index 6c6cb0c..650a836 100644 (file)
@@ -331,11 +331,11 @@ static void share_common_memory_with_filter_manager(void)
 
     NDM_DEBUG("SCMWFM: allocating %lu bytes of memory.\n", size);
 
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     err = bulk_create(total_size, size, &frame, &bt_filter_tx, true);
 #else
     err = bulk_create(total_size, size, &frame, &bt_filter_tx, false);
-#endif  // defined(__scc__) && !defined(RCK_EMU)
+#endif
 
     assert(err_is_ok(err));
 
index c67df28..09dafeb 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 /*
- * Copyright (c) 2007-11 ETH Zurich.
+ * Copyright (c) 2007-12 ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -280,11 +280,11 @@ struct shared_pool_private *sp_create_shared_pool(uint64_t slot_no,
     // been modified to suit the shared buffer allocation
     // FIXME: code repetation with mem_barrelfish_alloc_and_register
     struct bulk_transfer bt_sp;
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     err = bulk_create(mem_size, sizeof(union slot), &(spp->cap), &bt_sp, true);
 #else
     err = bulk_create(mem_size, sizeof(union slot), &(spp->cap), &bt_sp, false);
-#endif // defined(__scc__) && !defined(RCK_EMU)
+#endif
     if (err_is_fail(err)) {
         DEBUG_ERR(err, "bulk_create failed.");
         return NULL;
index a99af04..338be52 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2009, 2010, ETH Zurich.
+ * Copyright (c) 2009, 2010, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -55,13 +55,13 @@ static void client_connected(void *st, errval_t err, struct rcce_binding *b)
     // Create a Frame Capability 
     size_t allocated_size;
     struct capref shared_mem;
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     ram_set_affinity(SHARED_MEM_MIN + (PERCORE_MEM_SIZE * disp_get_core_id()),
                      SHARED_MEM_MIN + (PERCORE_MEM_SIZE * (disp_get_core_id() + 1)));
 #endif
     errval_t r = frame_alloc(&shared_mem, BULK_SIZE * 2, &allocated_size);
     assert(err_is_ok(r));
-#if defined(__scc__) && !defined(RCK_EMU)
+#ifdef __scc__
     ram_set_affinity(0, 0);
 #endif
 
index 88aa245..3a67836 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
+ * Copyright (c) 2007, 2008, 2009, 2010, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -227,15 +227,11 @@ static void clr_shared_benchmark(void)
     for(int mc = 0; mc < 4; mc++) {
         struct capref frame;
         size_t framesize = BASE_PAGE_SIZE;
-#ifndef RCK_EMU
     ram_set_affinity(SHARED_MEM_MIN + mc * LUT_SIZE,
                      SHARED_MEM_MIN + (mc + 1) * LUT_SIZE);
-#endif
     errval_t err = frame_alloc(&frame, framesize, &framesize);
     assert(err_is_ok(err));
-#ifndef RCK_EMU
     ram_set_affinity(0, 0);
-#endif
 
     // map it in
     void *buf;
index 27decbf..2977d51 100644 (file)
@@ -131,14 +131,10 @@ errval_t boot_arch_app_core(int argc, char *argv[],
     errval_t err;
     int argn = 1;
 
-#ifndef RCK_EMU
     assert(argc == 5);
 
     // First argument contains the bootinfo location
     bi = (struct bootinfo*)strtol(argv[argn++], NULL, 10);
-#else
-    assert(argc == 4);
-#endif
 
     // core_id of the core that booted this core
     coreid_t core_id = strtol(argv[argn++], NULL, 10);
@@ -152,7 +148,6 @@ errval_t boot_arch_app_core(int argc, char *argv[],
     assert(strncmp("frame", argv[argn], strlen("frame")) == 0);
     uint64_t chanbase = strtoul(strchr(argv[argn++], '=') + 1, NULL, 10);
 
-#ifndef RCK_EMU
     err = monitor_client_setup_mem_serv();
     assert(err_is_ok(err));
 
@@ -166,11 +161,9 @@ errval_t boot_arch_app_core(int argc, char *argv[],
     if (err_is_fail(err)) {
         return err_push(err, LIB_ERR_RAM_ALLOC_SET);
     }
-#endif
 
     printf("frame base at 0x%llx -- 0x%llx\n", chanbase, chanbase + BASE_PAGE_SIZE);
 
-#ifndef RCK_EMU
     assert(MON_URPC_CHANNEL_LEN * 2 < BASE_PAGE_SIZE);
     ram_set_affinity(chanbase, chanbase + BASE_PAGE_SIZE);
     struct capref frame;
@@ -180,12 +173,6 @@ errval_t boot_arch_app_core(int argc, char *argv[],
         return err; // FIXME: cleanup
     }
     ram_set_affinity(0, 0);     // Reset affinity
-#else
-    struct capref frame = {
-        .cnode = cnode_task,
-        .slot  = TASKCN_SLOT_MON_URPC,
-    };
-#endif
 
     struct frame_identity frameid = { .base = 0, .bits = 0 };
     err = invoke_frame_identify(frame, &frameid);
index 14f8585..d08f2f0 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2009, 2010, 2011, ETH Zurich.
+ * Copyright (c) 2009, 2010, 2011, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -283,19 +283,15 @@ static void new_monitor_notify(struct intermon_binding *b,
     errval_t err;
 
     /* Setup the connection */
-#if !defined(RCK_EMU)
     ram_set_affinity(SHARED_MEM_MIN + (PERCORE_MEM_SIZE * my_core_id),
                      SHARED_MEM_MIN + (PERCORE_MEM_SIZE * (my_core_id + 1)));
-#endif
     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
     }
-#if !defined(RCK_EMU)
     ram_set_affinity(0, 0);     // Reset affinity
-#endif
 
     void *buf;
     err = vspace_map_one_frame_attr(&buf, MON_URPC_SIZE, frame, VREGION_FLAGS_READ_WRITE_NOCACHE, NULL, NULL);
index 3c9b31e..9c85ae7 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2010, ETH Zurich.
+ * Copyright (c) 2010, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -118,7 +118,7 @@ void boot_initialize_request(struct monitor_binding *st)
 
     printf("all %d monitors up\n", num_monitors);
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#ifndef __scc__
     if(num_monitors > 1) {
         printf("monitor: synchronizing clocks\n");
         err = timing_sync_timer();
index f997e2d..7922c41 100644 (file)
@@ -120,7 +120,7 @@ static errval_t boot_app_core(int argc, char *argv[])
     struct intermon_binding *intermon_binding;
     errval_t err;
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#ifndef __scc__
     /* Create the self endpoint as the kernel doesn't do it */
     err = cap_retype(cap_selfep, cap_dispatcher, ObjType_EndPoint, 0);
     if (err_is_fail(err)) {
@@ -138,7 +138,7 @@ static errval_t boot_app_core(int argc, char *argv[])
     intermon_init(intermon_binding, parent_core_id);
 
     /* Request memserv and nameserv iref */
-#if !defined(__scc__) || defined(RCK_EMU)
+#ifndef __scc__
     err = request_mem_serv_iref(intermon_binding);
     assert(err_is_ok(err));
 #endif
@@ -155,7 +155,7 @@ static errval_t boot_app_core(int argc, char *argv[])
     assert(err_is_ok(err));
 #endif // BARRELFISH_MULTIHOP_CHAN_H
 
-#if !defined(__scc__) || defined(RCK_EMU)
+#ifndef __scc__
     /* initialize self ram alloc */
     err = mon_ram_alloc_init(parent_core_id, intermon_binding);
     if (err_is_fail(err)) {
index 65ae0ce..5b2f80b 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (c) 2007, 2008, 2010, 2011, ETH Zurich.
+ * Copyright (c) 2007, 2008, 2010, 2011, 2012, ETH Zurich.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
@@ -148,8 +148,8 @@ static void bind_cont(void *st, errval_t err, struct monitor_mem_binding *b)
 
 errval_t mon_ram_alloc_init(coreid_t core_id, struct intermon_binding *b)
 {
-#if defined(__scc__) && !defined(RCK_EMU)
-    assert(!"Should not be calling this from real SCC");
+#ifdef __scc__
+    assert(!"Should not be calling this on SCC platform");
 #endif
 
     errval_t err;