Merge branch 'net-dev'. See body of commit for details.
[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 #include <kfs.h>
12 #include <string.h>
13 #include <assert.h>
14 #include <ros/error.h>
15
16 #define DECL_PROG(x) \
17     extern uint8_t (COUNT(sizeof(size_t)) _binary_obj_user_apps_##x##_size)[],\
18         (COUNT(_binary_obj_user_apps_##x##_size)_binary_obj_user_apps_##x##_start)[];
19
20 #define KFS_ENTRY(x) {#x, _binary_obj_user_apps_##x##_start, (size_t) _binary_obj_user_apps_##x##_size},
21
22 /*
23  * Hardcode the files included in the KFS.  This needs to be in sync with the
24  * userapps in kern/src/Makefrag.
25  * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
26  */
27 DECL_PROG(roslib_proctests);
28 DECL_PROG(roslib_fptest);
29 DECL_PROG(roslib_null);
30 DECL_PROG(roslib_spawn);
31 DECL_PROG(roslib_hello);
32 DECL_PROG(roslib_mhello);
33 DECL_PROG(roslib_measurements);
34 DECL_PROG(parlib_draw_nanwan_standalone);
35 DECL_PROG(parlib_channel_test_client);
36 DECL_PROG(parlib_channel_test_server);
37 DECL_PROG(parlib_hello);
38 DECL_PROG(parlib_matrix);
39
40 struct kfs_entry kfs[MAX_KFS_FILES] = {
41         KFS_ENTRY(roslib_proctests)
42         KFS_ENTRY(roslib_fptest)
43         KFS_ENTRY(roslib_null)
44         KFS_ENTRY(roslib_spawn)
45         KFS_ENTRY(roslib_hello)
46         KFS_ENTRY(roslib_mhello)
47         KFS_ENTRY(roslib_measurements)
48         KFS_ENTRY(parlib_draw_nanwan_standalone)
49         KFS_ENTRY(parlib_channel_test_client)
50         KFS_ENTRY(parlib_channel_test_server)
51         KFS_ENTRY(parlib_hello)
52         KFS_ENTRY(parlib_matrix)
53 };
54
55 ssize_t kfs_lookup_path(char* path)
56 {
57         for (int i = 0; i < MAX_KFS_FILES; i++)
58                 // need to think about how to copy-in something of unknown length
59                 if (!strncmp(kfs[i].name, path, strlen(path)))
60                         return i;
61         return -EINVAL;
62 }
63
64 /*
65  * Creates a process from the file pointed to by the KFS inode (index)
66  * This should take a real inode or something to point to the real location,
67  * and env_create shouldn't assume everything is contiguous
68  */
69 struct proc *kfs_proc_create(int kfs_inode)
70 {
71         if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
72                 panic("Invalid kfs_inode.  Check you error codes!");
73         return env_create(kfs[kfs_inode].start, kfs[kfs_inode].size);
74 }