Xen Ring Buffers
[akaros.git] / lib / syscall.c
index 7b9e415..0c18445 100644 (file)
@@ -34,21 +34,23 @@ syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5
        return ret;
 }
 
-static inline error_t async_syscall(syscall_t *syscall)
+static inline error_t async_syscall(syscall_req_t *syscall)
 {
-       // testing just two syscalls at a time, and just put it at the beginning of
-       // the shared data page.  This is EXTREMELY GHETTO....
-       if ( ((syscall_t*)procdata)->args[0] ) // something there, presumably the first syscall
-               memcpy(((void*)procdata) + sizeof(syscall_t), syscall, sizeof(syscall_t));
-       else // nothing there, this is the first one
-               memcpy(procdata, syscall, sizeof(syscall_t));
+       static uint8_t next = 0; // should make sure this never goes too high
+       syscall_req_t* req = RING_GET_REQUEST(&sysfrontring, next++);   
+       memcpy(req, syscall, sizeof(syscall_req_t));
+       syscall_req_t* req = RING_GET_REQUEST(&sysfrontring, next++);   
+       memcpy(req, syscall, sizeof(syscall_req_t));
+       // need to actually update our sysfrontring.req_prod_pvt
+       sysfrontring.req_prod_pvt++;
+       RING_PUSH_REQUESTS(&sysfrontring);
        return 0;
 }
 
 void sys_cputs_async(const char *s, size_t len)
 {
        // could just hardcode 4 0's, will eventually wrap this marshaller anyway
-       syscall_t syscall = {SYS_cputs, 0, {(uint32_t)s, len, [2 ... (NUM_SYS_ARGS-1)] 0} };
+       syscall_req_t syscall = {SYS_cputs, 0, {(uint32_t)s, len, [2 ... (NUM_SYS_ARGS-1)] 0} };
        async_syscall(&syscall);
 }