Added external user binary support (usrbin/)
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 25 Nov 2009 00:17:22 +0000 (16:17 -0800)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Wed, 25 Nov 2009 00:17:22 +0000 (16:17 -0800)
Also some misc SPARC changes and minor harts change

30 files changed:
kern/include/experiment.h [new file with mode: 0644]
kern/include/kfs.h
kern/src/Makefrag
kern/src/env.c
kern/src/init.c
kern/src/kfs.c
kern/src/manager.c
user/apps/Makefrag
user/apps/parlib/Makefrag
user/apps/parlib/pthread/Makefrag
user/parlib/inc/hart.h
user/parlib/newlib/lib/sparc/libc.a
user/parlib/newlib/lib/sparc/libg.a
user/parlib/newlib/lib/sparc/libm.a
user/parlib/src/Makefrag
user/parlib/src/hart.c
user/parlib/src/sparc/Makefrag
user/parlib/src/sparc/divsqrt.c [new file with mode: 0644]
usrbin/sparc/blackscholes [new file with mode: 0755]
usrbin/sparc/bodytrack [new file with mode: 0755]
usrbin/sparc/bodytrackslow [new file with mode: 0755]
usrbin/sparc/condtest [new file with mode: 0755]
usrbin/sparc/cpptest [new file with mode: 0755]
usrbin/sparc/fluidanimate [new file with mode: 0755]
usrbin/sparc/memlatency [new file with mode: 0755]
usrbin/sparc/streamcluster [new file with mode: 0755]
usrbin/sparc/swaptions [new file with mode: 0755]
usrbin/sparc/synthetic_procobv_cacheobv_offbwobv [new file with mode: 0755]
usrbin/sparc/synthetic_procplus_cacheplus_offbwplus [new file with mode: 0755]
usrbin/sparc/x264 [new file with mode: 0755]

diff --git a/kern/include/experiment.h b/kern/include/experiment.h
new file mode 100644 (file)
index 0000000..5772941
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef ROS_INC_EXPERIMENT_H
+#define ROS_INC_EXPERIMENT_H
+#define EXPERIMENT_NUM 11
+#define APP1_THREADS 5
+#define APP2_THREADS 5
+#define APP1_COLORS 50
+#define APP2_COLORS 50
+#endif
index f863577..566eb19 100644 (file)
@@ -24,7 +24,7 @@ struct kfs_entry {
        size_t size;
 };
 
-#define MAX_KFS_FILES 20
+#define MAX_KFS_FILES 64
 extern struct kfs_entry (RO kfs)[MAX_KFS_FILES];
 
 ssize_t kfs_lookup_path(char*NTS path);
index e06d96c..45c9878 100644 (file)
@@ -63,10 +63,23 @@ KERN_APPFILES := \
                  $(USER_APPS_PARLIB_DIR)/channel_test_server \
                  $(USER_APPS_PARLIB_DIR)/hello \
                  $(USER_APPS_PARLIB_DIR)/manycore_test \
-                 $(USER_APPS_PARLIB_DIR)/matrix  \
-                 $(USER_APPS_PARLIB_DIR)/fptest
+                 $(USER_APPS_PARLIB_DIR)/matrix
 #                 $(USER_APPS_PARLIB_DIR)/open_read
 
+ifeq ($(TARGET_ARCH),sparc)
+KERN_APPFILES += \
+                 $(USER_APPS_USR_DIR)/blackscholes \
+                 $(USER_APPS_USR_DIR)/streamcluster \
+                 $(USER_APPS_USR_DIR)/swaptions \
+                 $(USER_APPS_USR_DIR)/bodytrack \
+                 $(USER_APPS_USR_DIR)/fluidanimate \
+                 $(USER_APPS_USR_DIR)/x264 \
+                 $(USER_APPS_USR_DIR)/cpptest \
+                 $(USER_APPS_USR_DIR)/condtest \
+                 $(USER_APPS_USR_DIR)/synthetic_procobv_cacheobv_offbwobv \
+                 $(USER_APPS_USR_DIR)/synthetic_procplus_cacheplus_offbwplus 
+endif
+
 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
                   -T $(KERN_ARCH_SRC_DIR)/kernel.ld
 
index b23e8f4..b5cb0f0 100644 (file)
@@ -95,9 +95,9 @@ env_init(void)
        schedule_init();
        // core 0 is not idle, all others are (for now)
        spin_lock(&idle_lock);
-       num_idlecores = num_cpus - 1;
+       num_idlecores = num_cpus; // hack to use all cores
        for (i = 0; i < num_idlecores; i++)
-               idlecoremap[i] = i + 1;
+               idlecoremap[i] = i; // hack to use all cores
        spin_unlock(&idle_lock);
        atomic_init(&num_envs, 0);
        TAILQ_INIT(&proc_freelist);
@@ -238,7 +238,7 @@ proc_init_procinfo(struct proc* p)
        p->env_procinfo->id = (p->env_id & 0x3FF);
 
        // TODO: maybe do something smarter here
-       p->env_procinfo->max_harts = MAX(1,num_cpus-1);
+       p->env_procinfo->max_harts = MAX(1,num_cpus); // hack to use all cores
 }
 
 // Sets up argc/argv in procinfo.  Returns number of
index 8ceff5c..2cd78d0 100644 (file)
@@ -103,6 +103,9 @@ void _panic(const char *file, int line, const char *fmt,...)
        cprintf("\n");
        va_end(ap);
 
+       #ifndef __i386__
+               reboot();
+       #endif
 dead:
        /* break into the kernel monitor, if we're core 0 */
        if (core_id()) {
index e12eeb1..b167f00 100644 (file)
@@ -43,7 +43,19 @@ DECL_PROG(parlib_matrix);
 DECL_PROG(parlib_manycore_test);
 DECL_PROG(parlib_pthread_pthread_test);
 DECL_PROG(parlib_pthread_blackscholes);
-DECL_PROG(parlib_fptest);
+
+#ifndef __i386__
+DECL_PROG(usr_blackscholes);
+DECL_PROG(usr_streamcluster);
+DECL_PROG(usr_swaptions);
+DECL_PROG(usr_bodytrack);
+DECL_PROG(usr_fluidanimate);
+DECL_PROG(usr_x264);
+DECL_PROG(usr_synthetic_procobv_cacheobv_offbwobv);
+DECL_PROG(usr_synthetic_procplus_cacheplus_offbwplus);
+DECL_PROG(usr_cpptest);
+DECL_PROG(usr_condtest);
+#endif
 
 struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(roslib_proctests)
@@ -61,7 +73,18 @@ struct kfs_entry kfs[MAX_KFS_FILES] = {
        KFS_ENTRY(parlib_manycore_test)
        KFS_ENTRY(parlib_pthread_pthread_test)
        KFS_ENTRY(parlib_pthread_blackscholes)
-       KFS_ENTRY(parlib_fptest)
+#ifndef __i386__
+       KFS_ENTRY(usr_blackscholes)
+       KFS_ENTRY(usr_streamcluster)
+       KFS_ENTRY(usr_swaptions)
+       KFS_ENTRY(usr_bodytrack)
+       KFS_ENTRY(usr_fluidanimate)
+       KFS_ENTRY(usr_x264)
+       KFS_ENTRY(usr_synthetic_procobv_cacheobv_offbwobv)
+       KFS_ENTRY(usr_synthetic_procplus_cacheplus_offbwplus)
+       KFS_ENTRY(usr_cpptest)
+       KFS_ENTRY(usr_condtest)
+#endif
 };
 
 ssize_t kfs_lookup_path(char* path)
index 735dd66..3e4e582 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <ros/common.h>
 #include <smp.h>
+#include <arch/init.h>
 
 #include <assert.h>
 #include <manager.h>
@@ -21,6 +22,8 @@
 #include <kfs.h>
 #include <stdio.h>
 #include <timing.h>
+#include <colored_caches.h>
+#include <string.h>
 
 /*
  * Currently, if you leave this function by way of proc_run (process_workqueue
@@ -196,6 +199,8 @@ void manager_klueska()
        panic("DON'T PANIC");
 }
 
+#ifdef __sparc_v8__
+
 static char*
 itoa(int num, char* buf0, size_t base)
 {
@@ -227,50 +232,124 @@ itoa(int num, char* buf0, size_t base)
        return buf0;
 }
 
+void gsf_set_frame_cycles(int cycles)
+{
+       store_alternate(26*4,2,cycles);
+}
+
+void gsf_set_partition_credits(int partition, int credits)
+{
+       store_alternate((32+partition)*4,2,credits);
+}
+
+void gsf_set_core_partition(int core, int partition)
+{
+       store_alternate((64+core)*4,2,partition);
+}
+
+#endif
+
 void manager_waterman()
 {
-       static struct proc *envs[256];
-       static uint8_t progress = 0;
-       char buf0[32],buf1[32];
-
-       #define RUN_APP(name,nargs,args...) \
-               do { \
-                       envs[progress-1] = kfs_proc_create(kfs_lookup_path(name)); \
-                       proc_set_state(envs[progress-1], PROC_RUNNABLE_S); \
-                       if(nargs) proc_init_argc_argv(envs[progress-1],nargs,##args); \
-                       proc_run(envs[progress-1]); \
-               } while(0)
-       
-
-       switch(progress++)
+#ifdef __sparc_v8__
+
+        static uint8_t progress = 0;
+       if(progress > 0)
+               goto run_some_apps;     
+
+       #define MAX_APPS 2
+       struct app
        {
-               case 0:
-                       RUN_APP("parlib_draw_nanwan_standalone",0);
-                       break;
-               case 1:
-                       RUN_APP("parlib_manycore_test",0);
-                       break;
-               case 2:
-                       RUN_APP("parlib_draw_nanwan_standalone",0);
-                       break;
-               case 3:
-                       RUN_APP("parlib_pthread_pthread_test",0);
-                       break;
-               case 4:
-                       RUN_APP("parlib_pthread_blackscholes",3,"blackscholes",itoa(num_cpus>1?num_cpus-1:1,buf0,10),itoa(256,buf1,10));
-                       break;
+               int threads;
+               int colors;
+               int credits;
+               int argc;
+               char** argv;
+       };
 
-               //case 5:
-               //      //while(*(volatile uint32_t*)&envs[4]->state != ENV_FREE);
-               //      //reboot();
-               //      break;
+       static struct app apps[MAX_APPS];
+       static int napps = 0;
 
-               case 5:
-                       RUN_APP("parlib_matrix",0);
-                       break;
+       // arg format:
+       // #apps [#threads #colors #credits name args] - [#threads ...] - ...
+       assert(argc > 0);
+       napps = atoi(argv[0]);
+       assert(napps <= MAX_APPS);
+       argc--; argv++;
+       for(int a = 0; a < napps; a++)
+       {
+               assert(argc >= 4);
+               apps[a].threads = atoi(argv[0]);
+               apps[a].colors = atoi(argv[1]);
+               apps[a].credits = atoi(argv[2]);
+               argc -= 3; argv += 3;
+
+               apps[a].argc = 0;
+               apps[a].argv = argv;
+               while(argc)
+               {
+                       argc--;
+                       if(strcmp(*argv++,"-") != 0)
+                               apps[a].argc++;
+                       else
+                               break;
+               }
+
+               printk("app %d: %d threads, %d colors, %d credits\ncommand line: ",a,apps[a].threads,apps[a].colors,apps[a].credits);
+               for(int i = 0; i < apps[a].argc; i++)
+                       printk("%s ",apps[a].argv[i]);
+               printk("\n");
        }
 
-       schedule();
+       // DRAM can process requests every 40 cycles.
+       // In a 480-cycle window, this gives us 12 total credits.
+       gsf_set_frame_cycles(482);
+       for(int a = 0, cores_used = 0; a < napps; a++)
+       {
+               gsf_set_partition_credits(a,apps[a].credits);
+               for(int i = 0; i < apps[a].threads; i++, cores_used++)
+                       gsf_set_core_partition(num_cpus-cores_used-1,a);
+       }
 
-       panic("DON'T PANIC");
+run_some_apps:
+       ;
+
+       static struct proc *envs[MAX_APPS];
+       int apps_running = napps;
+       int envs_free[MAX_APPS] = {0};
+       if(progress == napps)
+       {
+               while(apps_running)
+               {
+                       for(int i = 0; i < napps; i++)
+                       {
+                               if(*(volatile uint32_t*)&envs[i]->state == ENV_FREE && !envs_free[i])
+                               {
+                                       envs_free[i] = 1;
+                                       apps_running--;
+                                       printk("Finished application %d at cycle %lld\n", i, read_tsc()); 
+                               }
+                       }
+               }
+               reboot();
+       }
+       else
+       {
+               envs[progress] = kfs_proc_create(kfs_lookup_path(apps[progress].argv[0]));
+
+               envs[progress]->cache_colors_map = cache_colors_map_alloc();
+               for(int i = 0; i < apps[progress].colors; i++)
+                       assert(cache_color_alloc(llc_cache, envs[progress]->cache_colors_map) == ESUCCESS);
+
+               proc_set_state(envs[progress], PROC_RUNNABLE_S);
+
+               if(apps[progress].argc)
+                       proc_init_argc_argv(envs[progress],apps[progress].argc,(const char**)apps[progress].argv);
+
+               proc_run(envs[progress++]);
+
+               schedule();
+       }
+#endif
+       panic("professional bomb technician at work.  if you see me running, try to keep up!");
 }
index a3aa56a..13c5c44 100644 (file)
@@ -1,5 +1,11 @@
 USER_APPS_DIR = $(USER_DIR)/apps\r
 \r
+USER_APPS_USR_DIR := $(USER_APPS_DIR)/usr\r
+\r
+$(OBJDIR)/$(USER_APPS_USR_DIR)/%: usrbin/$(TARGET_ARCH)/%\r
+       @mkdir -p $(OBJDIR)/$(USER_APPS_USR_DIR)\r
+       @cp $< $@\r
+\r
 include $(USER_APPS_DIR)/roslib/Makefrag\r
 include $(USER_APPS_DIR)/parlib/Makefrag\r
 \r
index 2866ced..eab3480 100644 (file)
@@ -30,6 +30,7 @@ USER_APPS_PARLIB_LDOBJS    := $(OBJDIR)/$(USER_PARLIB_ARCH_SRC_DIR)/entry.o \
 
 USER_APPS_PARLIB_LDDEPENDS := $(USER_APPS_PARLIB_LDOBJS) \
                               $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a \
+                              $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib-pthread.a \
                               $(OBJDIR)/$(USER_PARLIB_DIR)/libivyparlib.a \
                               $(OBJDIR)/$(USER_APPS_PARLIB_DIR)/%.o
 
index 0e1f9aa..4a3bf35 100644 (file)
@@ -1,7 +1,7 @@
 USER_APPS_PARLIB_PTHREAD_DIR := $(USER_APPS_PARLIB_DIR)/pthread
 
 USER_APPS_PARLIB_PTHREAD_LDLIBS := $(USER_APPS_PARLIB_LDLIBS) -lpthread
-                             
+
 USER_APPS_PARLIB_PTHREAD_LDDEPENDS := $(OBJDIR)/$(USER_APPS_PARLIB_PTHREAD_DIR)/%.o \
                                       $(USER_APPS_PARLIB_LDOBJS) \
                                       $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a \
index 22c74ae..553e562 100644 (file)
@@ -53,7 +53,9 @@ void hart_lock_init(hart_lock_t* lock);
 void hart_lock_unlock(hart_lock_t* lock);
 void hart_lock_lock(hart_lock_t* l);
 
+// "int" rather than size_t because of a newlib compiling issue
 int hart_self();
+
 error_t hart_request(size_t k);
 void hart_yield();
 size_t hart_max_harts();
index 6c54239..03ba5ce 100644 (file)
Binary files a/user/parlib/newlib/lib/sparc/libc.a and b/user/parlib/newlib/lib/sparc/libc.a differ
index 6c54239..03ba5ce 100644 (file)
Binary files a/user/parlib/newlib/lib/sparc/libg.a and b/user/parlib/newlib/lib/sparc/libg.a differ
index 1b9642d..289ecfb 100644 (file)
Binary files a/user/parlib/newlib/lib/sparc/libm.a and b/user/parlib/newlib/lib/sparc/libm.a differ
index b521785..9021a1a 100644 (file)
@@ -57,6 +57,20 @@ $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a: $(USER_PARLIB_SRC_OBJFILES)
        @mkdir -p $(@D)
        $(V)$(AR) r $@ $(USER_PARLIB_SRC_OBJFILES) 2>/dev/null
 
+$(OBJDIR)/$(USER_PARLIB_DIR)/libparlib-pthread.a: $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libc.a $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libg.a $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libm.a $(OBJDIR)/$(USER_PARLIB_DIR)/libparlib.a $(OBJDIR)/$(USER_PARLIB_DIR)/libpthread.a
+       @mkdir -p $(OBJDIR)/$(USER_PARLIB_DIR)/tmp
+       @rm -f $(OBJDIR)/$(USER_PARLIB_DIR)/*.o
+       @cp $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libc.a $(OBJDIR)/$(USER_PARLIB_DIR)/tmp
+       @cp $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libg.a $(OBJDIR)/$(USER_PARLIB_DIR)/tmp
+       @cp $(USER_PARLIB_DIR)/newlib/lib/$(TARGET_ARCH)/libm.a $(OBJDIR)/$(USER_PARLIB_DIR)/tmp
+       @cd $(OBJDIR)/$(USER_PARLIB_DIR)/tmp; $(AR) x libc.a
+       @cd $(OBJDIR)/$(USER_PARLIB_DIR)/tmp; $(AR) x libg.a
+       @cd $(OBJDIR)/$(USER_PARLIB_DIR)/tmp; $(AR) x libm.a
+       @cd $(OBJDIR)/$(USER_PARLIB_DIR)/tmp; $(AR) x $(GCC_LIB)
+       @echo + ar [PARLIB] $@
+       @mkdir -p $(@D)
+       $(V)$(AR) r $@ $(USER_PARLIB_PTHREAD_OBJFILES) $(USER_PARLIB_SRC_OBJFILES) $(OBJDIR)/$(USER_PARLIB_DIR)/tmp/*.o 2>/dev/null
+
 $(OBJDIR)/$(USER_PARLIB_DIR)/libpthread.a: $(USER_PARLIB_PTHREAD_OBJFILES)
        @echo + ar [PARLIB] $@
        @mkdir -p $(@D)
index 881dbc3..9afb5c7 100644 (file)
@@ -198,7 +198,7 @@ void hart_barrier_wait(hart_barrier_t* b, size_t pid)
        localflags->parity = 1-localflags->parity;
 }
 
-size_t
+int
 hart_self()
 {
        // defined in ros/arch/hart.h
index 0ad7a11..05a8fa3 100644 (file)
@@ -13,4 +13,5 @@ USER_PARLIB_ARCH_SRCFILES := $(USER_PARLIB_ARCH_SRC_DIR)/syscall.c \
                              $(USER_PARLIB_ARCH_SRC_DIR)/entry.S \
                              $(USER_PARLIB_ARCH_SRC_DIR)/crtbegin.S \
                              $(USER_PARLIB_ARCH_SRC_DIR)/crtend.S \
+                             $(USER_PARLIB_ARCH_SRC_DIR)/divsqrt.c \
                              $(USER_PARLIB_ARCH_SRC_DIR)/newlib_backend.c
diff --git a/user/parlib/src/sparc/divsqrt.c b/user/parlib/src/sparc/divsqrt.c
new file mode 100644 (file)
index 0000000..5cd4515
--- /dev/null
@@ -0,0 +1,65 @@
+#include <math.h>
+
+static inline double i2d(unsigned long long i)
+{
+  double d;
+  asm volatile("std %2,[%1]; ldd [%1],%0" : "=f"(d) : "r"(&d),"r"(i));
+  return d;
+}
+
+static inline unsigned long long d2i(double d)
+{
+  unsigned long long i;
+  asm volatile("std %2,[%1]; ldd [%1],%0" : "=r"(i) : "r"(&i),"f"(d));
+  return i;
+}
+
+double do_recip(double b)
+{
+  unsigned long long i = d2i(b);
+  unsigned long long i2 = ((2046-((i>>52)&~0x800)) | (i>>52)&0x800) << 52;
+  unsigned long long i3 = (i >> 50) & 3;
+  static const double divlut[4] = {1.0,0.8,0.666,0.571};
+  double x = i2d(i2)*divlut[i3];
+
+  x = x*(2.0-b*x);
+  x = x*(2.0-b*x);
+  x = x*(2.0-b*x);
+  x = x*(2.0-b*x);
+  x = x*(2.0-b*x);
+
+  return x;
+}
+
+double do_rsqrt(double b)
+{
+  unsigned long long i = d2i(b);
+  unsigned long long i2 = ((3069-((i>>52)&~0x800))>>1 | (i>>52)&0x800) << 52;
+  unsigned long long i3 = (i >> 50) & 7;
+  double x = i2d(i2);
+
+  static const double sqrtlut[8] = {1.4142,1.264,1.155,1.069, 1.0,0.894,0.816,0.756};
+  x *= sqrtlut[i3];
+
+  x = 0.5*x*(3.0-b*x*x);
+  x = 0.5*x*(3.0-b*x*x);
+  x = 0.5*x*(3.0-b*x*x);
+  x = 0.5*x*(3.0-b*x*x);
+  x = 0.5*x*(3.0-b*x*x);
+
+  return x;
+}
+
+double do_fdiv(double x, double y)
+{
+  if((d2i(y) & 0x7FF0000000000000ULL) == 0)
+    return x/y;
+  return x*do_recip(y);
+}
+
+double do_fsqrt(double x)
+{
+  if(d2i(x) & 0x8000000000000000ULL)
+    return sqrt(x);
+  return x*do_rsqrt(x);
+}
diff --git a/usrbin/sparc/blackscholes b/usrbin/sparc/blackscholes
new file mode 100755 (executable)
index 0000000..b3a5237
Binary files /dev/null and b/usrbin/sparc/blackscholes differ
diff --git a/usrbin/sparc/bodytrack b/usrbin/sparc/bodytrack
new file mode 100755 (executable)
index 0000000..4daf3fd
Binary files /dev/null and b/usrbin/sparc/bodytrack differ
diff --git a/usrbin/sparc/bodytrackslow b/usrbin/sparc/bodytrackslow
new file mode 100755 (executable)
index 0000000..512a5a8
Binary files /dev/null and b/usrbin/sparc/bodytrackslow differ
diff --git a/usrbin/sparc/condtest b/usrbin/sparc/condtest
new file mode 100755 (executable)
index 0000000..7fcf2b6
Binary files /dev/null and b/usrbin/sparc/condtest differ
diff --git a/usrbin/sparc/cpptest b/usrbin/sparc/cpptest
new file mode 100755 (executable)
index 0000000..535777c
Binary files /dev/null and b/usrbin/sparc/cpptest differ
diff --git a/usrbin/sparc/fluidanimate b/usrbin/sparc/fluidanimate
new file mode 100755 (executable)
index 0000000..ab9b1f6
Binary files /dev/null and b/usrbin/sparc/fluidanimate differ
diff --git a/usrbin/sparc/memlatency b/usrbin/sparc/memlatency
new file mode 100755 (executable)
index 0000000..d265603
Binary files /dev/null and b/usrbin/sparc/memlatency differ
diff --git a/usrbin/sparc/streamcluster b/usrbin/sparc/streamcluster
new file mode 100755 (executable)
index 0000000..9d3759f
Binary files /dev/null and b/usrbin/sparc/streamcluster differ
diff --git a/usrbin/sparc/swaptions b/usrbin/sparc/swaptions
new file mode 100755 (executable)
index 0000000..8df9956
Binary files /dev/null and b/usrbin/sparc/swaptions differ
diff --git a/usrbin/sparc/synthetic_procobv_cacheobv_offbwobv b/usrbin/sparc/synthetic_procobv_cacheobv_offbwobv
new file mode 100755 (executable)
index 0000000..80e568d
Binary files /dev/null and b/usrbin/sparc/synthetic_procobv_cacheobv_offbwobv differ
diff --git a/usrbin/sparc/synthetic_procplus_cacheplus_offbwplus b/usrbin/sparc/synthetic_procplus_cacheplus_offbwplus
new file mode 100755 (executable)
index 0000000..123354a
Binary files /dev/null and b/usrbin/sparc/synthetic_procplus_cacheplus_offbwplus differ
diff --git a/usrbin/sparc/x264 b/usrbin/sparc/x264
new file mode 100755 (executable)
index 0000000..7b533cf
Binary files /dev/null and b/usrbin/sparc/x264 differ