Guts the old KFS!
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 23 Jul 2010 18:59:21 +0000 (11:59 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:49 +0000 (17:35 -0700)
Note that sys_proc_create() hasn't been changed to make processes the
appropriate way, and that a couple of the managers don't work properly,
since they were based on KFS and/or try to load binaries that don't
exist.

kern/include/kfs.h
kern/include/monitor.h
kern/src/Makefrag
kern/src/kfs.c
kern/src/manager.c
kern/src/monitor.c
kern/src/syscall.c

index 40be441..8321c19 100644 (file)
@@ -4,18 +4,14 @@
  *
  * KFS (Kernel File System)
  *
- * This gives runtime access to the binary blobs (usually userspace programs)
- * linked at the end of the kernel.  Extremely rudimentary.
- * Also allows for process creation from file (can consider moving this).
- *
- * Add the files you want in KFS in kfs.c. */
+ * This is a cheap FS that is based off of a CPIO archive appended to the end of
+ * the kernel binary image. */
 
 #ifndef ROS_KERN_KFS_H
 #define ROS_KERN_KFS_H
 
 #include <ros/common.h>
 #include <vfs.h>
-#include <process.h>
 
 /* Every FS must extern it's type, and be included in vfs_init() */
 extern struct fs_type kfs_fs_type;
@@ -28,18 +24,4 @@ struct kfs_i_info {
        size_t                                  init_size;              /* file size on the backing store */
 };
 
-/* Old KFS below here */
-struct kfs_entry {
-       char (NT name)[256];
-       uint8_t *COUNT(size) start;
-       size_t size;
-};
-
-#define MAX_KFS_FILES 64
-extern struct kfs_entry (RO kfs)[MAX_KFS_FILES];
-
-ssize_t kfs_lookup_path(char*NTS path);
-struct proc *kfs_proc_create(int kfs_inode);
-void kfs_cat(int kfs_inode);
-
 #endif /* !ROS_KERN_KFS_H */
index a0b925e..f355ea5 100644 (file)
@@ -21,7 +21,6 @@ int mon_cpuinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_nanwan(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_bin_ls(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_bin_run(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
-int mon_kfs_cat(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_manager(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_procinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_exit(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
index 204f137..d3feaa5 100644 (file)
@@ -47,31 +47,6 @@ KERN_SRCFILES := $(KERN_ARCH_SRCFILES) \
 # Only build files if they exist.
 KERN_SRCFILES := $(wildcard $(KERN_SRCFILES))
 
-KERN_APPFILES := \
-
-
-ifneq ($(findstring CONFIG_KFS,$(KERN_CFLAGS)),)
-all: tests
-$(OBJDIR)/$(KERN_DIR)/kernel: tests
-
-KERN_APPFILES += \
-                 $(TESTS_DIR)/tlstest \
-                 $(TESTS_DIR)/fp_test \
-                 $(TESTS_DIR)/mproctests \
-                 $(TESTS_DIR)/hello \
-                 $(TESTS_DIR)/mhello \
-                 $(TESTS_DIR)/pthread_test \
-                 $(TESTS_DIR)/pthread_barrier_test \
-                 $(TESTS_DIR)/idle \
-                 $(TESTS_DIR)/tsc_spitter \
-                 $(TESTS_DIR)/msr_get_cores \
-                 $(TESTS_DIR)/msr_get_singlecore \
-                 $(TESTS_DIR)/msr_dumb_while \
-                 $(TESTS_DIR)/msr_nice_while \
-                 $(TESTS_DIR)/msr_single_while \
-                 $(TESTS_DIR)/msr_cycling_vcores
-endif
-
 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
                   -T $(KERN_ARCH_SRC_DIR)/kernel.ld
 
@@ -82,9 +57,7 @@ KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.S, \
                              $(OBJDIR)/$(KERN_DIR)/%.o, \
                              $(KERN_OBJFILES))
 
-KERN_APPFILES  := $(patsubst %, $(OBJDIR)/%, $(KERN_APPFILES))
-
-KERN_LDDEPENDS := $(KERN_OBJFILES) $(KERN_APPFILES) $(ARCH_DIR)/$(TARGET_ARCH)/kernel.ld \
+KERN_LDDEPENDS := $(KERN_OBJFILES) $(ARCH_DIR)/$(TARGET_ARCH)/kernel.ld \
                   $(OBJDIR)/$(KERN_DIR)/libivykern.a $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO)
 
 KERN_LDLIBS    := -livykern
@@ -115,15 +88,10 @@ $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S
        @mkdir -p $(@D)
        $(V)$(CC) $(KERN_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
 
-UDEBUG := $(findstring -g,$(USER_CFLAGS))
 $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
        @echo + ld [KERN] $@
-       @if [ "$(UDEBUG)" != "-g" ] && [ "$(KERN_APPFILES)" != "" ]; then \
-               $(STRIP) -s $(KERN_APPFILES) ; \
-       fi
        $(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(KERN_LDLIBS) \
-                       $(KERN_GCC_LIB) -b binary $(KERN_APPFILES) \
-                       $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO)
+                       $(KERN_GCC_LIB) -b binary $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO)
        $(V)$(OBJDUMP) -S $@ > $@.asm
        $(V)$(NM) -n $@ > $@.sym
 
index 9776421..35b847e 100644 (file)
@@ -754,89 +754,6 @@ struct file_operations kfs_f_op = {
 
 /* KFS Specific Internal Functions */
 
-/* For obj files compiled with the kernel */
-#define DECL_PROG(x) \
-    extern uint8_t (COUNT(sizeof(size_t)) _binary_obj_tests_##x##_size)[],\
-        (COUNT(_binary_obj_user_apps_##x##_size)_binary_obj_tests_##x##_start)[];
-
-#define KFS_PENTRY(x) {#x, _binary_obj_tests_##x##_start, (size_t) _binary_obj_tests_##x##_size},
-
-/*
- * Hardcode the files included in the KFS.  PROGs need to be in sync with the
- * userapps in kern/src/Makefrag.  Files need to be in kern/kfs/
- * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
- * Note that files with a . in their name will have an _ instead.
- */
-#ifdef __CONFIG_KFS__
-DECL_PROG(tlstest);
-DECL_PROG(fp_test);
-DECL_PROG(mproctests);
-DECL_PROG(hello);
-DECL_PROG(mhello);
-DECL_PROG(pthread_test);
-DECL_PROG(pthread_barrier_test);
-DECL_PROG(idle);
-DECL_PROG(tsc_spitter);
-DECL_PROG(msr_get_cores);
-DECL_PROG(msr_get_singlecore);
-DECL_PROG(msr_dumb_while);
-DECL_PROG(msr_nice_while);
-DECL_PROG(msr_single_while);
-DECL_PROG(msr_cycling_vcores);
-#endif
-
-struct kfs_entry kfs[MAX_KFS_FILES] = {
-#ifdef __CONFIG_KFS__
-       KFS_PENTRY(tlstest)
-       KFS_PENTRY(fp_test)
-       KFS_PENTRY(mproctests)
-       KFS_PENTRY(hello)
-       KFS_PENTRY(mhello)
-       KFS_PENTRY(pthread_test)
-       KFS_PENTRY(pthread_barrier_test)
-       KFS_PENTRY(idle)
-       KFS_PENTRY(tsc_spitter)
-       KFS_PENTRY(msr_get_cores)
-       KFS_PENTRY(msr_get_singlecore)
-       KFS_PENTRY(msr_dumb_while)
-       KFS_PENTRY(msr_nice_while)
-       KFS_PENTRY(msr_single_while)
-       KFS_PENTRY(msr_cycling_vcores)
-#endif
-};
-
-ssize_t kfs_lookup_path(char* path)
-{
-       for (int i = 0; i < MAX_KFS_FILES; i++)
-               // need to think about how to copy-in something of unknown length
-               if (!strncmp(kfs[i].name, path, strlen(path)))
-                       return i;
-       return -EINVAL;
-}
-
-/*
- * Creates a process from the file pointed to by the KFS inode (index)
- * This should take a real inode or something to point to the real location,
- * and proc_create shouldn't assume everything is contiguous
- */
-struct proc *kfs_proc_create(int kfs_inode)
-{
-       if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
-               panic("Invalid kfs_inode.  Check you error codes!");
-       return proc_create(kfs[kfs_inode].start, kfs[kfs_inode].size);
-}
-
-/* Dumps the contents of the KFS file to the console.  Not meant to be taken
- * too seriously - just dumps each char. */
-void kfs_cat(int kfs_inode)
-{
-       if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
-               panic("Invalid kfs_inode.  Check you error codes!");
-       uint8_t *end = kfs[kfs_inode].start + kfs[kfs_inode].size;
-       for (uint8_t *ptr = kfs[kfs_inode].start; ptr < end; ptr++)
-               cputchar(*ptr);
-}
-
 /* Need to pass path separately, since we'll recurse on it.  TODO: this recurses,
  * and takes up a lot of stack space (~270 bytes).  Core 0's KSTACK is 8 pages,
  * which can handle about 120 levels deep...  Other cores are not so fortunate.
index 2cfeea5..ac88dd9 100644 (file)
@@ -104,7 +104,7 @@ void manager_brho(void)
                        /* 124 is half of the available boxboro colors (with the kernel
                         * getting 8) */
                        //quick_proc_color_run("msr_dumb_while", p, 124);
-                       quick_proc_run("mhello", p);
+                       //quick_proc_run("mhello", p);
                        #if 0
                        // this is how you can transition to a parallel process manually
                        // make sure you don't proc run first
@@ -183,7 +183,8 @@ void manager_klueska()
 
        if (progress == 0) {
                progress++;
-               envs[0] = kfs_proc_create(kfs_lookup_path("fillmeup"));
+               panic("what do you want to do?");
+               //envs[0] = kfs_proc_create(kfs_lookup_path("fillmeup"));
                __proc_set_state(envs[0], PROC_RUNNABLE_S);
                proc_run(envs[0]);
        }
@@ -231,7 +232,8 @@ void manager_pearce()
 
        if (progress == 0) {
                progress++;
-               envs[0] = kfs_proc_create(kfs_lookup_path("parlib_httpserver_integrated"));
+               panic("what do you want to do?");
+               //envs[0] = kfs_proc_create(kfs_lookup_path("parlib_httpserver_integrated"));
                //envs[0] = kfs_proc_create(kfs_lookup_path("parlib_lock_test"));
                __proc_set_state(envs[0], PROC_RUNNABLE_S);
                proc_run(envs[0]);
index 28898fc..aafe6de 100644 (file)
@@ -51,7 +51,6 @@ static command_t (RO commands)[] = {
        { "nanwan", "Meet Nanwan!!", mon_nanwan},
        { "bin_ls", "List files in /bin", mon_bin_ls},
        { "bin_run", "Create and run a program from /bin", mon_bin_run},
-       { "kfs_cat", "Dumps text from a file from KFS", mon_kfs_cat},
        { "manager", "Run the manager", mon_manager},
        { "procinfo", "Show information about processes", mon_procinfo},
        { "exit", "Leave the monitor", mon_exit},
@@ -263,7 +262,7 @@ int mon_bin_ls(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
                printk("No /bin directory!\n");
                return 1;
        }
-       printk("Files in KFS /bin:\n-------------------------------\n");
+       printk("Files in /bin:\n-------------------------------\n");
        do {
                retval = bin_dir->f_op->readdir(bin_dir, &dir); 
                printk("%s\n", dir.d_name);
@@ -313,21 +312,6 @@ int mon_bin_run(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
        return 0;
 }
 
-int mon_kfs_cat(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
-{
-       if (argc != 2) {
-               printk("Usage: kfs_cat FILENAME\n");
-               return 1;
-       }
-       int kfs_inode = kfs_lookup_path(argv[1]);
-       if (kfs_inode < 0) {
-               printk("Bad filename!\n");
-               return 1;
-       }
-       kfs_cat(kfs_inode);
-       return 0;
-}
-
 int mon_procinfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf)
 {
        if (argc < 2) {
index 36a8a09..47a898c 100644 (file)
@@ -218,12 +218,15 @@ static int sys_proc_create(struct proc *p, const char *DANGEROUS path)
         * would be required.
         */
        int ret = user_mem_strlcpy(p,tpath, path, MAX_PATH_LEN, PTE_USER_RO);
+       return 0;
+#if 0
        int kfs_inode = kfs_lookup_path(tpath);
        if (kfs_inode < 0)
                return -EINVAL;
        struct proc *new_p = kfs_proc_create(kfs_inode);
        pid = new_p->pid;
        proc_decref(new_p, 1); // let go of the reference created in proc_create()
+#endif
        return pid;
 }