remove some unnecessary printing in the arsc server.
[akaros.git] / kern / src / arsc.c
1 /* See COPYRIGHT for copyright information. */
2
3 #ifdef __SHARC__
4 #pragma nosharc
5 #endif
6
7
8 #include <ros/common.h>
9 #include <ros/ring_syscall.h>
10 #include <arch/types.h>
11 #include <arch/arch.h>
12 #include <arch/mmu.h>
13 #include <error.h>
14
15 #include <syscall.h>
16 #include <kmalloc.h>
17 #include <pmap.h>
18 #include <stdio.h>
19 #include <hashtable.h>
20 #include <arsc_server.h>
21
22
23
24 struct proc_list arsc_proc_list = TAILQ_HEAD_INITIALIZER(arsc_proc_list);
25 spinlock_t arsc_proc_lock = SPINLOCK_INITIALIZER;
26
27 intreg_t syscall_async(struct proc *p, syscall_req_t *call)
28 {
29         return syscall(p, call->num, call->args[0], call->args[1],
30                        call->args[2], call->args[3], call->args[4]);
31 }
32
33 intreg_t sys_init_arsc(struct proc* p)
34 {
35         spin_lock_irqsave(&arsc_proc_lock);
36         TAILQ_INSERT_TAIL(&arsc_proc_list, p, proc_arsc_link);
37         spin_unlock_irqsave(&arsc_proc_lock);
38         return ESUCCESS;
39 }
40
41
42 void arsc_server(trapframe_t *tf)
43 {
44         struct proc *p = NULL;
45         TAILQ_INIT(&arsc_proc_list);
46         while (true)
47         {
48                 while (TAILQ_EMPTY(&arsc_proc_list))
49                         cpu_relax();
50
51                 TAILQ_FOREACH(p, &arsc_proc_list, proc_link)
52                 {
53                         // TODO: we may need an atomic swap to inc ref count
54                         if (p->state != PROC_DYING)
55                                 process_generic_syscalls (p, MAX_ASRC_BATCH); 
56                 }
57         }
58 }
59
60 static intreg_t process_generic_syscalls(struct proc *p, size_t max)
61 {
62         size_t count = 0;
63         syscall_back_ring_t* sysbr = &p->syscallbackring;
64         // looking at a process not initialized to perform arsc. 
65         if (sysbr == NULL) 
66                 return count;
67
68         /* make sure the proc is still alive, and keep it from dying from under us
69          * incref will return ESUCCESS on success.  This might need some thought
70          * regarding when the incref should have happened (like by whoever passed us
71          * the *p). */
72         // TODO: ought to be unnecessary, if you called this right, kept here for
73         // now in case anyone actually uses the ARSCs.
74         kref_get(&p->kref, 1);
75
76         // max is the most we'll process.  max = 0 means do as many as possible
77         // TODO: check for initialization of the ring. 
78         while (RING_HAS_UNCONSUMED_REQUESTS(sysbr) && ((!max)||(count < max)) ) {
79                 if (!count) {
80                         // ASSUME: one queue per process
81                         // only switch cr3 for the very first request for this queue
82                         // need to switch to the right context, so we can handle the user pointer
83                         // that points to a data payload of the syscall
84                         lcr3(p->env_cr3);
85                 }
86                 count++;
87                 //printk("DEBUG PRE: sring->req_prod: %d, sring->rsp_prod: %d\n",
88                 //         sysbr->sring->req_prod, sysbr->sring->rsp_prod);
89                 // might want to think about 0-ing this out, if we aren't
90                 // going to explicitly fill in all fields
91                 syscall_rsp_t rsp;
92                 // this assumes we get our answer immediately for the syscall.
93                 syscall_req_t* req = RING_GET_REQUEST(sysbr, ++(sysbr->req_cons));
94                 // print req
95                 printd("req no %d, req arg %c\n", req->num, *((char*)req->args[0]));
96                 rsp.retval = syscall_async(p, req);
97                 // write response into the slot it came from
98                 memcpy(req, &rsp, sizeof(syscall_rsp_t));
99                 // update our counter for what we've produced (assumes we went in order!)
100                 (sysbr->rsp_prod_pvt)++;
101                 RING_PUSH_RESPONSES(sysbr);
102                 //printk("DEBUG POST: sring->req_prod: %d, sring->rsp_prod: %d\n",
103                 //         sysbr->sring->req_prod, sysbr->sring->rsp_prod);
104         }
105         // load sane page tables (and don't rely on decref to do it for you).
106         lcr3(boot_cr3);
107         kref_put(&p->kref);
108         return (intreg_t)count;
109 }
110