Merge remote-tracking branch 'origin/master' into shoal
authorReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 5 Dec 2014 08:54:20 +0000 (09:54 +0100)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Fri, 5 Dec 2014 08:54:20 +0000 (09:54 +0100)
Conflicts:
kernel/arch/k1om/vmkit.c
kernel/arch/x86_64/syscall.c
usr/kaluga/start_cpu.c

1  2 
hake/symbolic_targets.mk
kernel/arch/x86_64/syscall.c
lib/vfs/vfs_fat.c
usr/drivers/cpuboot/common.c

diff --combined hake/symbolic_targets.mk
@@@ -27,7 -27,7 +27,7 @@@ ARM_OBJCOPY?=arm-linux-gnueabi-objcop
  K1OM_OBJCOPY?=k1om-mpss-linux-objcopy
  
  # upload Xeon Phi images to nfs share (leave blank to cancel)
 -BARRELFISH_NFS_DIR ?="emmentaler.ethz.ch:/local/nfs/barrelfish/xeon_phi"
 +BARRELFISH_NFS_DIR ?="emmentaler.ethz.ch:/mnt/local/nfs/barrelfish/xeon_phi"
  
  # All binaries of the RCCE LU benchmark
  BIN_RCCE_LU= \
@@@ -72,6 -72,7 +72,6 @@@ TESTS_x86_64= 
        sbin/thcminitest \
        sbin/tweedtest \
        sbin/thctest \
 -      sbin/cxxtest \
        sbin/testdesc \
        sbin/testdesc-child \
        sbin/multihoptest \
        sbin/net-test \
        sbin/xcorecap \
        sbin/xcorecapserv \
 +      sbin/bomp_sync \
 +      sbin/bomp_cpu_bound \
 +      sbin/bomp_cpu_bound_progress \
 +      sbin/bomp_sync_progress \
 +      sbin/bomp_test \
 +      sbin/bulk_shm \
 +      sbin/mem_affinity \
 +      sbin/phoenix_kmeans \
 +      sbin/spin \
 +      sbin/tests/dma_test \
 +      sbin/tests/cxxtest \
 +      sbin/tests/xphi_nameservice_test \
        sbin/tlstest \
        sbin/timer_test \
        sbin/net_openport_test \
        sbin/perfmontest \
  
 +TESTS_k1om= \
 +      sbin/tests/xeon_phi_inter \
 +      sbin/tests/xeon_phi_test \
 +      sbin/tests/dma_test \
 +      sbin/tests/xphi_nameservice_test
  
  # All benchmark domains
  BENCH_COMMON= \
@@@ -143,55 -127,18 +143,55 @@@ BENCH_x86_64= 
        $(BIN_RCCE_LU) \
        sbin/tsc_bench \
        sbin/netthroughput \
        sbin/bulk_transfer_passthrough \
        sbin/bulkbench_micro_echo \
        sbin/bulkbench_micro_throughput \
 -      sbin/bulkbench_micro_rtt
 +      sbin/bulkbench_micro_rtt \
 +      sbin/benchmarks/xphi_ump_bench \
 +      sbin/rcce_pingpong \
 +      sbin/elb_app \
 +      sbin/elb_app_tcp \
 +      sbin/benchmarks/dma_bench \
 +      sbin/benchmarks/bomp_mm \
 +      sbin/benchmarks/xomp_spawn \
 +      sbin/benchmarks/xomp_share \
 +      sbin/benchmarks/xomp_work       
  
  BENCH_k1om=\
 -      $(BENCH_x86)
 -
 -
 +      $(BENCH_x86) \
 +      sbin/benchmarks/dma_bench \
 +      sbin/benchmarks/xphi_ump_bench \
 +      sbin/benchmarks/xphi_xump_bench \
 +      sbin/benchmarks/bomp_mm \
 +      sbin/benchmarks/xomp_spawn \
 +      sbin/benchmarks/xomp_share \
 +      sbin/benchmarks/xomp_work
 +
 +# adding submodules to targets
 +
 +$(info Additional submodules:)
 +ifneq ("$(wildcard $(SRCDIR)lib/shoal/Hakefile)","")
 +$(info + shoal:      [YES])
 +SHOAL= \
 +      sbin/tests/shl_simple
 +      
 +ifneq ("$(wildcard $(SRCDIR)usr/green-marl/Hakefile)","")
 +$(info + green-marl: [YES])
  GREEN_MARL= \
 -      sbin/gm_tc \
 +      sbin/gm_tc
 +      
 +else # no green-marl module
 +$(info + green-marl: [NO])
 +GREEN_MARL=
 +endif
 +
 +else # no additional modules
 +$(info + green-marl: [NO])
 +$(info + shoal:      [NO])
 +GREEN_MARL=
 +SHOAL=
 +endif
 +   
  
  # Default list of modules to build/install for all enabled architectures
  MODULES_COMMON= \
@@@ -217,6 -164,11 +217,6 @@@ MODULES_x86_64= 
        sbin/arrakismon \
        sbin/bench \
        sbin/bfscope \
 -      sbin/bomp_sync \
 -      sbin/bomp_cpu_bound \
 -      sbin/bomp_cpu_bound_progress \
 -      sbin/bomp_sync_progress \
 -      sbin/bomp_test \
        sbin/boot_perfmon \
        sbin/datagatherer \
        sbin/ahcid \
        sbin/hpet \
        sbin/lpc_kbd \
        sbin/lpc_timer \
 -      sbin/mem_affinity \
        sbin/mem_serv_dist \
 -      sbin/elb_app \
 -      sbin/elb_app_tcp \
        sbin/lo_queue \
        sbin/pci \
        sbin/acpi \
        sbin/kaluga \
 -      sbin/phoenix_kmeans \
 -      sbin/rcce_pingpong \
        sbin/serial \
        sbin/angler \
        sbin/sshd \
        sbin/vmkitmon \
        sbin/webserver \
        sbin/routing_setup \
 -      $(BIN_CONSENSUS) \
        sbin/bcached \
 -      sbin/spin \
        sbin/xeon_phi_mgr \
        sbin/xeon_phi \
        sbin/dma_mgr \
        sbin/ioat_dma \
        sbin/virtio_blk_host \
        sbin/virtio_blk \
 -      sbin/xeon_phi_inter \
 -      sbin/xeon_phi_test \
 -      sbin/dma_test \
        sbin/block_server \
        sbin/block_server_client \
        sbin/bs_user \
        sbin/bulk_shm \
 -      sbin/corectrl \
 -
 +      $(GREEN_MARL) \
 +      $(SHOAL) \
 +      sbin/corectrl 
  
  MODULES_k1om= \
 -    sbin/weever \
 +      sbin/weever \
        sbin/cpu \
        sbin/xeon_phi \
 +      sbin/corectrl \
        xeon_phi_multiboot \
 -      $(GREEN_MARL)
 +      $(GREEN_MARL) \
 +      $(SHOAL) 
  
  # the following are broken in the newidc system
  MODULES_x86_64_broken= \
@@@ -405,6 -364,17 +405,17 @@@ install: $(MODULES
  
  .PHONY : install
  
+ install_headers: 
+       echo "Installing header files..." ; \
+       for a in ${HAKE_ARCHS}; do \
+         mkdir -p "$$a" ; \
+         cp -rv "${SRCDIR}/include" "$$a/" ; \
+       done; \
+       echo "done." ; \
+ .PHONY : install_headers
  sim: simulate
  .PHONY : sim
  
@@@ -419,7 -389,7 +430,7 @@@ MENU_LST=-kernel $(shell sed -rne 's,^k
        -append '$(shell sed -rne 's,^kernel[ \t]*[^ ]*[ \t]*(.*),\1,p' menu.lst)' \
        -initrd '$(shell sed -rne 's,^module(nounzip)?[ \t]*/(.*),\2,p' menu.lst | awk '{ if(NR == 1) printf($$0); else printf("," $$0) } END { printf("\n") }')'
  
 -ifeq ($(ARCH),x86_64)
 +ifeq ($(filter $(x86_64),$(ARCH)),) 
      QEMU_CMD=qemu-system-x86_64 -smp 2 -m 1024 -net nic,model=e1000 -net user $(AHCI) -nographic $(MENU_LST)
        GDB=x86_64-pc-linux-gdb
        CLEAN_HD=qemu-img create $(DISK) 10M
  #include <paging_kernel_arch.h>
  #include <paging_generic.h>
  #include <exec.h>
 +#include <fpu.h>
  #include <arch/x86/x86.h>
  #include <arch/x86/apic.h>
  #include <arch/x86/global.h>
  #include <arch/x86/perfmon.h>
 -#include <vmkit.h>
 -#include <barrelfish_kpi/sys_debug.h>
 -#include <barrelfish_kpi/lmp.h>
 -#include <barrelfish_kpi/dispatcher_shared_target.h>
  #include <arch/x86/debugregs.h>
 -#include <trace/trace.h>
  #include <arch/x86/syscall.h>
  #include <arch/x86/timing.h>
 -#include <fpu.h>
  #include <arch/x86/ipi_notify.h>
 +#include <barrelfish_kpi/sys_debug.h>
 +#include <barrelfish_kpi/lmp.h>
 +#include <barrelfish_kpi/dispatcher_shared_target.h>
 +#include <trace/trace.h>
 +#ifndef __k1om__
 +#include <vmkit.h>
- #include <amd_vmcb_dev.h>
+ #include <dev/amd_vmcb_dev.h>
 +#endif
  
  #define MIN(a,b)        ((a) < (b) ? (a) : (b))
  
@@@ -84,7 -82,7 +84,7 @@@ static struct sysret handle_retype_comm
      uint64_t source_cptr     = args[0];
      uint64_t type            = args[1];
      uint64_t objbits         = args[2];
 -    uint64_t  dest_cnode_cptr = args[3];
 +    uint64_t dest_cnode_cptr = args[3];
      uint64_t dest_slot       = args[4];
      uint64_t dest_vbits      = args[5];
  
@@@ -160,7 -158,7 +160,7 @@@ static struct sysret handle_map(struct 
  
      TRACE(KERNEL, SC_MAP, 0);
      struct sysret sr = sys_map(ptable, slot, source_cptr, source_vbits, flags, offset,
 -                   pte_count);
 +                                 pte_count);
      TRACE(KERNEL, SC_MAP, 1);
      return sr;
  }
@@@ -182,7 -180,7 +182,7 @@@ static struct sysret handle_delete_comm
                                     bool from_monitor)
  {
      capaddr_t cptr = args[0];
 -    int bits     = args[1];
 +    int bits       = args[1];
  
      TRACE(KERNEL, SC_DELETE, 0);
      struct sysret sr = sys_delete(root, cptr, bits, from_monitor);
@@@ -203,7 -201,7 +203,7 @@@ static struct sysret handle_revoke_comm
                                            bool from_monitor)
  {
      capaddr_t cptr = args[0];
 -    int bits     = args[1];
 +    int bits       = args[1];
  
      TRACE(KERNEL, SC_REVOKE, 0);
      struct sysret sr = sys_revoke(root, cptr, bits, from_monitor);
@@@ -344,8 -342,7 +344,8 @@@ static struct sysret monitor_identify_c
                                                   uintptr_t *args)
  {
      capaddr_t cptr = args[0];
 -    uint8_t bits = args[1];
 +    uint8_t bits   = args[1];
 +    
      struct capability *retbuf = (void *)args[2];
  
      return sys_monitor_identify_cap(root, cptr, bits, retbuf);
@@@ -414,8 -411,8 +414,8 @@@ static struct sysret monitor_create_cap
  
      /* Create the cap in the destination */
      capaddr_t cnode_cptr = args[pos];
 -    int cnode_vbits    = args[pos + 1];
 -    size_t slot        = args[pos + 2];
 +    int cnode_vbits      = args[pos + 1];
 +    size_t slot          = args[pos + 2];
  
      return SYSRET(caps_create_from_existing(&dcb_current->cspace.cap,
                                              cnode_cptr, cnode_vbits,
@@@ -426,7 -423,7 +426,7 @@@ static struct sysret monitor_nullify_ca
                                           int cmd, uintptr_t *args)
  {
      capaddr_t cptr = args[0];
 -    uint8_t bits = args[1];
 +    uint8_t bits   = args[1];
  
      return sys_monitor_nullify_cap(cptr, bits);
  }
@@@ -466,6 -463,7 +466,6 @@@ static struct sysret monitor_handle_syn
      return sys_monitor_handle_sync_timer(synctime);
  }
  
 -
  static struct sysret handle_frame_identify(struct capability *to,
                                             int cmd, uintptr_t *args)
  {
@@@ -507,7 -505,6 +507,7 @@@ static struct sysret handle_io(struct c
      return sys_io(to, cmd, port, data);
  }
  
 +#ifndef __k1om__
  static struct sysret
  handle_dispatcher_setup_guest (struct capability *to, int cmd, uintptr_t *args)
  {
  
      return SYSRET(SYS_ERR_OK);
  }
 +#endif
  
  static struct sysret monitor_handle_domain_id(struct capability *monitor_cap,
                                                int cmd, uintptr_t *args)
@@@ -861,9 -857,7 +861,9 @@@ static invocation_handler_t invocations
      [ObjType_Dispatcher] = {
          [DispatcherCmd_Setup] = handle_dispatcher_setup,
          [DispatcherCmd_Properties] = handle_dispatcher_properties,
 +#ifndef __k1om__
          [DispatcherCmd_SetupGuest] = handle_dispatcher_setup_guest,
 +#endif
          [DispatcherCmd_DumpPTables]  = dispatcher_dump_ptables,
      },
      [ObjType_KernelControlBlock] = {
@@@ -1044,13 -1038,13 +1044,13 @@@ struct sysret sys_syscall(uint64_t sysc
                  panic("Dispatcher needs to be enabled for this invocation");
                }
  
 -                // save calling dispatcher's registers, so that when the dispatcher
 -                // next runs, it has a valid state in the relevant save area.
 -                // Save RIP, RFLAGS, RSP and set RAX (return value) for later resume
 -                save_area->rax = retval.error; // XXX: x86 1st return register
 -                save_area->rip = rip;
 -                save_area->eflags = rflags;
 -                save_area->rsp = user_stack_save;
 +              // save calling dispatcher's registers, so that when the dispatcher
 +              // next runs, it has a valid state in the relevant save area.
 +              // Save RIP, RFLAGS, RSP and set RAX (return value) for later resume
 +              save_area->rax = retval.error; // XXX: x86 1st return register
 +              save_area->rip = rip;
 +              save_area->eflags = rflags;
 +              save_area->rsp = user_stack_save;
  
                if(!dcb_current->is_vm_guest) {
                  /* save and zero FS/GS selectors (they're unmodified by the syscall path) */
                         [zero] "r" (0)
                         );
                } else {
 +#ifndef __k1om__
                  lpaddr_t lpaddr = gen_phys_to_local_phys(dcb_current->guest_desc.vmcb.cap.u.frame.base);
                  amd_vmcb_t vmcb;
                  amd_vmcb_initialize(&vmcb, (void *)local_phys_to_mem(lpaddr));
                  save_area->fs = amd_vmcb_fs_selector_rd(&vmcb);
                  save_area->gs = amd_vmcb_gs_selector_rd(&vmcb);
 +#else
 +          panic("VM Guests not supported on Xeon Phi");
 +#endif
                }
  
                  dispatch(to->u.endpoint.listener);
diff --combined lib/vfs/vfs_fat.c
@@@ -569,13 -569,9 +569,9 @@@ find_path(struct fat_mount *mount, cons
          dirsearch_initialize(&search, parent);
  
          char dosfn[12];
-         /*
-          * compiler reported out of bounds error with that one +1
-          * -- RA
-          */
-         uint16_t lfn_data[LFN_CHAR_COUNT+1];
+         uint16_t lfn_data[LFN_CHAR_COUNT];
          bool has_lfn;
-         char buf[LFN_CHAR_COUNT];
+         char buf[LFN_CHAR_COUNT + 1];
  
          do {
  
              }
  
              if (has_lfn) {
+                 // In theory, FAT long file names allow a maximum of 255
+                 // UTF-16 characters, but as Barrelfish does not have a clear
+                 // notion of any UTF encoding, we do not support opening files
+                 // with file names that are not pure ASCII.
+                 // Additionally, when reading directory entries we replace any
+                 // non-ASCII characters in file names with question marks (cf.
+                 // dir_read_next()).
                  size_t len;
                  for (len = 0; len < LFN_CHAR_COUNT; len++) {
                      if (!lfn_data[len] || lfn_data[len] > ASCII_MAX) {
                          break;
                      }
                  }
-                 if (lfn_data[len] > ASCII_MAX) {
+                 // have non-ASCII char in LFN, ignore file when looking up
+                 // path for opening.
+                 if (len < LFN_CHAR_COUNT && lfn_data[len] > ASCII_MAX) {
                      continue;
                  }
+                 // here: LFN is pure ASCII, and thus we can cast the
+                 // UTF-16-encoded UTF characters to ASCII chars without having
+                 // to worry about them not fitting. We also properly
+                 // zero-terminate the new ASCII LFN.
+                 assert(len <= LFN_CHAR_COUNT);
                  for (size_t i = 0; i < len; ++i) {
                      buf[i] = (char)lfn_data[i];
                  }
@@@ -957,6 -967,12 +967,12 @@@ dir_read_next(void *st, vfs_handle_t dh
      fat_direntry_initialize(&dirent, (char*)dirent_data);
  
      if (has_lfn) {
+         // In theory, FAT long file names allow a maximum of 255 UTF-16
+         // characters, but as Barrelfish does not have a clear notion of any
+         // UTF encoding, we replace non-ASCII characters with question marks
+         // when reading directory entries for a directory listing.
+         // Additionally we do not support opening files with names that
+         // contain non-ASCII characters (cf. find_path()).
          size_t len;
          for (len = 0; len < LFN_CHAR_COUNT; len++) {
              if (!lfn_data[len]) {
@@@ -1032,7 -1048,7 +1048,7 @@@ ahci_init_cb(void *st, errval_t err, st
  {
      TRACE_ENTER;
      struct fat_mount *mount = st;
 -    
 +
      if (err_is_fail(err)) {
          mount->bind_err = err;
          return;
@@@ -1049,7 -1065,7 +1065,7 @@@ ahci_close_cb(void *arg
  
  #elif defined(__pandaboard__)
  
 -static void 
 +static void
  bind_cb(void *st, errval_t err, struct ata_rw28_binding *b)
  {
      printf("%s:%d\n", __FUNCTION__, __LINE__);
      }
  
      struct fat_mount *mount = (struct fat_mount*) st;
 -    
 +
      err = ata_rw28_rpc_client_init(&mount->ata_rw28_rpc, b);
      if (err_is_fail(err)) {
          USER_PANIC_ERR(err, "RPC initialization failed");
@@@ -14,8 -14,6 +14,8 @@@
  #include "coreboot.h"
  
  extern bool done;
 +extern coreid_t core_count;
 +extern coreid_t core_max;
  extern struct capref kcb;
  
  char* get_binary_path(char* fmt, char* binary_name)
@@@ -46,15 -44,12 +46,15 @@@ void boot_core_reply(struct monitor_bin
          USER_PANIC_ERR(msgerr, "msgerr in boot_core_reply, exiting\n");
      }
      DEBUG("%s:%d: got boot_core_reply.\n", __FILE__, __LINE__);
 -    done = true;
 +    core_count++;
 +    if (core_count == core_max) {
 +        done = true;
 +    }
  }
  
  static errval_t add_kcb_record(uint32_t kcb_id, coreid_t core_id, char* kcb_key)
  {
 -    errval_t err = oct_set("kcb.%d { kcb_id: %d, barrelfish_id: %"PRIuCOREID", cap_key: '%s' }", 
 +    errval_t err = oct_set("kcb.%d { kcb_id: %d, barrelfish_id: %"PRIuCOREID", cap_key: '%s' }",
                              kcb_id, kcb_id, core_id, kcb_key);
      if (err_is_fail(err)) {
          DEBUG_ERR(err, "oct_set");
@@@ -123,7 -118,7 +123,7 @@@ errval_t create_or_get_kcb_cap(coreid_
              DEBUG_ERR(err, "can not save the capability.");
              return err;
          }
 -        
 +
          err = add_kcb_record(coreid, coreid, kcb_key);
          if (err_is_fail(err)) {
              DEBUG_ERR(err, "add_kcb_record failed.");
@@@ -189,12 -184,25 +189,25 @@@ errval_t frame_alloc_identify(struct ca
      return err;
  }
  
+ static errval_t cache_module(const char *module_name, struct capref binary_image_cap) 
+ {
+     return oct_put_capability(module_name, binary_image_cap);
+ }
+ static errval_t lookup_module_cache(const char *module_name, struct capref *binary_image_cap) 
+ {
+     return oct_get_capability(module_name, binary_image_cap);
+ }
  errval_t lookup_module(const char *module_name, lvaddr_t *binary_virt,
                         genpaddr_t *binary_phys, size_t *binary_size)
  {
      vfs_handle_t handle;
      struct vfs_fileinfo info;
-     DEBUG("Trying to find binary %s\n", module_name);
+     struct capref binary_image_cap;    
+     struct frame_identity id;
+     DEBUG("Trying to find binary %s in file system\n", module_name);
      errval_t err = vfs_open(module_name, &handle);
      if (err_is_fail(err)) {
          DEBUG_ERR(err, "vfs_open could not open module?");
      }
      *binary_size = info.size;
  
-     struct capref binary_image_cap;
-     struct frame_identity id;
-     err = frame_alloc_identify(&binary_image_cap, info.size, NULL, &id);
-     if (err_is_fail(err)) {
-         DEBUG_ERR(err, "Could not allocate space for binary");
-         return err;
+     DEBUG("Trying to find module in cache\n");
+     err = lookup_module_cache(module_name, &binary_image_cap);
+     if (err_is_ok(err)) {
+         err = invoke_frame_identify(binary_image_cap, &id);
+         *binary_phys = id.base;
+         DEBUG("%s:%d: id.base=0x%"PRIxGENPADDR"\n", __FILE__, __LINE__, id.base);
+         err = vspace_map_one_frame((void **)binary_virt, info.size, binary_image_cap,
+                                     NULL, NULL);
+         if (err_is_fail(err)) {
+             DEBUG_ERR(err, "Could identify frame from cap storage");
+             return err;
+         }
      }
-     *binary_phys = id.base;
-     DEBUG("%s:%d: id.base=0x%"PRIxGENPADDR"\n", __FILE__, __LINE__, id.base);
+     else {
+         err = frame_alloc_identify(&binary_image_cap, info.size, NULL, &id);
+         if (err_is_fail(err)) {
+             DEBUG_ERR(err, "Could not allocate space for binary");
+             return err;
+         }
+         *binary_phys = id.base;
+         DEBUG("%s:%d: id.base=0x%"PRIxGENPADDR"\n", __FILE__, __LINE__, id.base);
+         err = vspace_map_one_frame((void **)binary_virt, info.size, binary_image_cap,
+                                    NULL, NULL);
+         if (err_is_fail(err)) {
+             DEBUG_ERR(err, "Could not map frame");
+             return err;
+         }
  
-     err = vspace_map_one_frame((void **)binary_virt, info.size, binary_image_cap,
-                                NULL, NULL);
-     if (err_is_fail(err)) {
-         DEBUG_ERR(err, "Could not map frame");
-         return err;
-     }
+         size_t bytes_read = 0;
+         err = vfs_read(handle, (void *)*binary_virt, info.size, &bytes_read);
+         if (err_is_fail(err)) {
+             DEBUG_ERR(err, "Can not read binary from vfs");
+             return err;
+         }
+         assert(bytes_read ==
+                info.size); // TODO(gz): If this fails, need to loop vfs_read
  
-     size_t bytes_read = 0;
-     err = vfs_read(handle, (void *)*binary_virt, info.size, &bytes_read);
-     if (err_is_fail(err)) {
-         DEBUG_ERR(err, "Can not read binary from vfs");
-         return err;
+         err = cache_module(module_name, binary_image_cap);
+         if (err_is_fail(err)) {
+             DEBUG_ERR(err, "Can not read binary from vfs");
+             return err;
+         }
      }
-     assert(bytes_read ==
-            info.size); // TODO(gz): If this fails, need to loop vfs_read
  
      return SYS_ERR_OK;
  }