OSDI Microbenchmarks
[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 <stdio.h>
18 #include <assert.h>
19 #include <error.h>
20
21 /* For obj files compiled with the kernel */
22 #define DECL_PROG(x) \
23     extern uint8_t (COUNT(sizeof(size_t)) _binary_obj_tests_##x##_size)[],\
24         (COUNT(_binary_obj_user_apps_##x##_size)_binary_obj_tests_##x##_start)[];
25
26 #define KFS_PENTRY(x) {#x, _binary_obj_tests_##x##_start, (size_t) _binary_obj_tests_##x##_size},
27
28 /* For generic files in kern/kfs */
29 #define DECL_FILE(x) \
30     extern uint8_t (COUNT(sizeof(size_t)) _binary_kern_kfs_##x##_size)[],\
31         (COUNT(_binary_kern_kfs_##x##_size)_binary_kern_kfs_##x##_start)[];
32
33 #define KFS_FENTRY(x) {#x, _binary_kern_kfs_##x##_start, (size_t) _binary_kern_kfs_##x##_size},
34
35 /*
36  * Hardcode the files included in the KFS.  PROGs need to be in sync with the
37  * userapps in kern/src/Makefrag.  Files need to be in kern/kfs/
38  * Make sure to declare it, and add an entry.  Keep MAX_KFS_FILES big enough too
39  * Note that files with a . in their name will have an _ instead.
40  */
41 #ifdef __CONFIG_KFS__
42 DECL_PROG(tlstest);
43 DECL_PROG(fp_test);
44 DECL_PROG(mproctests);
45 DECL_PROG(hello);
46 DECL_PROG(mhello);
47 DECL_PROG(pthread_test);
48 DECL_PROG(pthread_barrier_test);
49 DECL_PROG(idle);
50 DECL_PROG(fillmeup);
51 DECL_PROG(tsc_spitter);
52 DECL_PROG(msr_get_cores);
53 DECL_PROG(msr_get_singlecore);
54 DECL_PROG(msr_dumb_while);
55 DECL_PROG(msr_nice_while);
56 DECL_PROG(msr_single_while);
57 DECL_PROG(msr_cycling_vcores);
58 DECL_FILE(kfs_test_txt);
59 DECL_FILE(hello_txt);
60 #endif
61
62 struct kfs_entry kfs[MAX_KFS_FILES] = {
63 #ifdef __CONFIG_KFS__
64         KFS_PENTRY(tlstest)
65         KFS_PENTRY(fp_test)
66         KFS_PENTRY(mproctests)
67         KFS_PENTRY(hello)
68         KFS_PENTRY(mhello)
69         KFS_PENTRY(pthread_test)
70         KFS_PENTRY(pthread_barrier_test)
71         KFS_PENTRY(idle)
72         KFS_PENTRY(fillmeup)
73         KFS_PENTRY(tsc_spitter)
74         KFS_PENTRY(msr_get_cores)
75         KFS_PENTRY(msr_get_singlecore)
76         KFS_PENTRY(msr_dumb_while)
77         KFS_PENTRY(msr_nice_while)
78         KFS_PENTRY(msr_single_while)
79         KFS_PENTRY(msr_cycling_vcores)
80         KFS_FENTRY(kfs_test_txt)
81         KFS_FENTRY(hello_txt)
82 #endif
83 };
84
85 ssize_t kfs_lookup_path(char* path)
86 {
87         for (int i = 0; i < MAX_KFS_FILES; i++)
88                 // need to think about how to copy-in something of unknown length
89                 if (!strncmp(kfs[i].name, path, strlen(path)))
90                         return i;
91         return -EINVAL;
92 }
93
94 /*
95  * Creates a process from the file pointed to by the KFS inode (index)
96  * This should take a real inode or something to point to the real location,
97  * and proc_create shouldn't assume everything is contiguous
98  */
99 struct proc *kfs_proc_create(int kfs_inode)
100 {
101         if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
102                 panic("Invalid kfs_inode.  Check you error codes!");
103         return proc_create(kfs[kfs_inode].start, kfs[kfs_inode].size);
104 }
105
106 /* Dumps the contents of the KFS file to the console.  Not meant to be taken
107  * too seriously - just dumps each char. */
108 void kfs_cat(int kfs_inode)
109 {
110         if (kfs_inode < 0 || kfs_inode >= MAX_KFS_FILES)
111                 panic("Invalid kfs_inode.  Check you error codes!");
112         uint8_t *end = kfs[kfs_inode].start + kfs[kfs_inode].size;
113         for (uint8_t *ptr = kfs[kfs_inode].start; ptr < end; ptr++)
114                 cputchar(*ptr);
115 }