Added an asynchronous sys_null_async() call and wrappers
[akaros.git] / lib / syscall.c
index 3b5548e..7f1faf8 100644 (file)
@@ -16,7 +16,7 @@ syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5
        // The "volatile" tells the assembler not to optimize
        // this instruction away just because we don't use the
        // return value.
-       // 
+       //
        // The last clause tells the assembler that this can
        // potentially change the condition codes and arbitrary
        // memory locations.
@@ -31,7 +31,7 @@ syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5
                  "D" (a4),
                  "S" (a5)
                : "cc", "memory");
-       
+
        return ret;
 }
 
@@ -65,13 +65,27 @@ error_t waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp)
                cpu_relax();
        memcpy(rsp, RING_GET_RESPONSE(desc->sysfr, desc->idx), sizeof(*rsp));
        desc->sysfr->rsp_cons++;
+    // run a cleanup function for this desc, if available
+    if (desc->cleanup)
+       desc->cleanup(desc->data);
        return 0;
 }
 
-void sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc)
+void sys_null_async(syscall_desc_t* desc)
+{
+       syscall_req_t syscall = {SYS_null, 0, {[0 ... (NUM_SYS_ARGS-1)] 0}};
+       desc->cleanup = NULL;
+       desc->data = NULL;
+       async_syscall(&syscall, desc);
+}
+
+void sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
+                     void (*cleanup_handler)(void*), void* cleanup_data)
 {
        // could just hardcode 4 0's, will eventually wrap this marshaller anyway
        syscall_req_t syscall = {SYS_cputs, 0, {(uint32_t)s, len, [2 ... (NUM_SYS_ARGS-1)] 0} };
+       desc->cleanup = cleanup_handler;
+       desc->data = cleanup_data;
        async_syscall(&syscall, desc);
 }