Finally got KFS stuff sorted out on the new setup
[akaros.git] / kern / src / kfs.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  */
6
7 #ifdef __SHARC__
8 #pragma nosharc
9 #endif
10
11 #ifdef __DEPUTY__
12 #pragma nodeputy
13 #endif
14
15 #include <kfs.h>
16 #include <string.h>
17 #include <assert.h>
18 #include <error.h>
19
20 #define DECL_PROG(x) \
21     extern uint8_t (COUNT(sizeof(size_t)) _binary_obj_tests_##x##_size)[],\
22         (COUNT(_binary_obj_user_apps_##x##_size)_binary_obj_tests_##x##_start)[];
23
24 #define KFS_ENTRY(x) {#x, _binary_obj_tests_##x##_start, (size_t) _binary_obj_tests_##x##_size},
25
26 /*
27  * Hardcode the files included in the KFS.  This needs to be in sync with the
28  * userapps in kern/src/Makefrag.
29  * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
30  */
31 #ifdef __CONFIG_KFS__
32 DECL_PROG(tlstest);
33 DECL_PROG(proctests);
34 DECL_PROG(fp_test);
35 DECL_PROG(null);
36 DECL_PROG(spawn);
37 DECL_PROG(mproctests);
38 DECL_PROG(draw_nanwan);
39 DECL_PROG(hello);
40 DECL_PROG(mhello);
41 DECL_PROG(manycore_test);
42 #endif
43
44 struct kfs_entry kfs[MAX_KFS_FILES] = {
45 #ifdef __CONFIG_KFS__
46         KFS_ENTRY(tlstest)
47         KFS_ENTRY(proctests)
48         KFS_ENTRY(fp_test)
49         KFS_ENTRY(null)
50         KFS_ENTRY(spawn)
51         KFS_ENTRY(mproctests)
52         KFS_ENTRY(draw_nanwan)
53         KFS_ENTRY(hello)
54         KFS_ENTRY(mhello)
55         KFS_ENTRY(manycore_test)
56 #endif
57 };
58
59 ssize_t kfs_lookup_path(char* path)
60 {
61         for (int i = 0; i < MAX_KFS_FILES; i++)
62                 // need to think about how to copy-in something of unknown length
63                 if (!strncmp(kfs[i].name, path, strlen(path)))
64                         return i;
65         return -EINVAL;
66 }
67
68 /*
69  * Creates a process from the file pointed to by the KFS inode (index)
70  * This should take a real inode or something to point to the real location,
71  * and proc_create shouldn't assume everything is contiguous
72  */
73 struct proc *kfs_proc_create(int kfs_inode)
74 {
75         if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
76                 panic("Invalid kfs_inode.  Check you error codes!");
77         return proc_create(kfs[kfs_inode].start, kfs[kfs_inode].size);
78 }
79