KFS cat / generic files
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 12 Feb 2010 22:08:36 +0000 (14:08 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:39 +0000 (17:35 -0700)
Basic support for KFS to have files other than compiled binaries -
mostly just for intermediate testing of the VFS (which isn't in this
branch).

kern/include/kfs.h
kern/include/monitor.h
kern/kfs/hello.txt [new file with mode: 0644]
kern/kfs/kfs_test.txt [new file with mode: 0644]
kern/src/Makefrag
kern/src/kfs.c
kern/src/monitor.c

index 566eb19..6da1a51 100644 (file)
@@ -29,5 +29,6 @@ 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 f8f4b2f..734fc15 100644 (file)
@@ -21,6 +21,7 @@ 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_kfs_ls(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 int mon_kfs_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);
diff --git a/kern/kfs/hello.txt b/kern/kfs/hello.txt
new file mode 100644 (file)
index 0000000..55fc2e3
--- /dev/null
@@ -0,0 +1 @@
+Hello moon, you cool son of a bitch.
diff --git a/kern/kfs/kfs_test.txt b/kern/kfs/kfs_test.txt
new file mode 100644 (file)
index 0000000..980900d
--- /dev/null
@@ -0,0 +1,2 @@
+Goodbye, creole world!
+Okay, maybe not goodbye.
index 3cc8c90..36c3da5 100644 (file)
@@ -77,6 +77,8 @@ KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.S, \
 
 KERN_APPFILES  := $(patsubst %, $(OBJDIR)/%, $(KERN_APPFILES))
 
+KERN_APPFILES  += $(KERN_DIR)/kfs/*
+
 KERN_LDDEPENDS := $(KERN_OBJFILES) $(KERN_APPFILES) $(ARCH_DIR)/$(TARGET_ARCH)/kernel.ld \
                   $(OBJDIR)/$(KERN_DIR)/libivykern.a
 
index e98ab6f..3ed134b 100644 (file)
 
 #include <kfs.h>
 #include <string.h>
+#include <stdio.h>
 #include <assert.h>
 #include <error.h>
 
+/* 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_ENTRY(x) {#x, _binary_obj_tests_##x##_start, (size_t) _binary_obj_tests_##x##_size},
+#define KFS_PENTRY(x) {#x, _binary_obj_tests_##x##_start, (size_t) _binary_obj_tests_##x##_size},
+
+/* For generic files in kern/kfs */
+#define DECL_FILE(x) \
+    extern uint8_t (COUNT(sizeof(size_t)) _binary_kern_kfs_##x##_size)[],\
+        (COUNT(_binary_kern_kfs_##x##_size)_binary_kern_kfs_##x##_start)[];
+
+#define KFS_FENTRY(x) {#x, _binary_kern_kfs_##x##_start, (size_t) _binary_kern_kfs_##x##_size},
 
 /*
- * Hardcode the files included in the KFS.  This needs to be in sync with the
- * userapps in kern/src/Makefrag.
+ * 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);
@@ -39,20 +49,24 @@ DECL_PROG(draw_nanwan);
 DECL_PROG(hello);
 DECL_PROG(mhello);
 DECL_PROG(manycore_test);
+DECL_FILE(kfs_test_txt);
+DECL_FILE(hello_txt);
 #endif
 
 struct kfs_entry kfs[MAX_KFS_FILES] = {
 #ifdef __CONFIG_KFS__
-       KFS_ENTRY(tlstest)
-       KFS_ENTRY(proctests)
-       KFS_ENTRY(fp_test)
-       KFS_ENTRY(null)
-       KFS_ENTRY(spawn)
-       KFS_ENTRY(mproctests)
-       KFS_ENTRY(draw_nanwan)
-       KFS_ENTRY(hello)
-       KFS_ENTRY(mhello)
-       KFS_ENTRY(manycore_test)
+       KFS_PENTRY(tlstest)
+       KFS_PENTRY(proctests)
+       KFS_PENTRY(fp_test)
+       KFS_PENTRY(null)
+       KFS_PENTRY(spawn)
+       KFS_PENTRY(mproctests)
+       KFS_PENTRY(draw_nanwan)
+       KFS_PENTRY(hello)
+       KFS_PENTRY(mhello)
+       KFS_PENTRY(manycore_test)
+       KFS_FENTRY(kfs_test_txt)
+       KFS_FENTRY(hello_txt)
 #endif
 };
 
@@ -77,3 +91,13 @@ struct proc *kfs_proc_create(int kfs_inode)
        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);
+}
index 267abb0..f1a41ee 100644 (file)
@@ -46,6 +46,7 @@ static command_t (RO commands)[] = {
        { "nanwan", "Meet Nanwan!!", mon_nanwan},
        { "kfs_ls", "List files in KFS", mon_kfs_ls},
        { "kfs_run", "Create and run a program from KFS", mon_kfs_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},
@@ -275,6 +276,21 @@ int mon_kfs_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) {