Added ability to load an arbitrary binary from an ethernet server and launch it
[akaros.git] / user / parlib / src / syscall.c
index cad283c..e0f6c5b 100644 (file)
@@ -7,38 +7,36 @@
 #include <parlib.h>
 
 // TODO: modify to take only four parameters
-static uint32_t
-syscall_sysenter(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
+static intreg_t syscall_sysenter(uint16_t num, intreg_t a1,
+                                 intreg_t a2, intreg_t a3,
+                                 intreg_t a4, intreg_t a5)
 {
-       uint32_t ret;
-    asm volatile(
-            //"pushl %%ecx\n\t"
-            //"pushl %%edx\n\t"
-            "pushl %%ebp\n\t"
-                       "pushl %%esi\n\t"
-            "movl %%esp, %%ebp\n\t"
-            "leal after_sysenter, %%esi\n\t"
-            "sysenter\n\t"
-            "after_sysenter:\n\t"
-                       "popl %%esi\n\t"
-            "popl %%ebp\n\t"
-            //"popl %%edx\n\t"
-            //"popl %%ecx"
-            :"=a" (ret)
-            : "a" (num),
-                "d" (a1),
-                "c" (a2),
-                "b" (a3),
-                "D" (a4)
-        : "cc", "memory", "%esp");
+       intreg_t ret;
+       asm volatile(
+           "pushl %%ebp\n\t"
+           "pushl %%esi\n\t"
+           "movl %%esp, %%ebp\n\t"
+           "leal after_sysenter, %%esi\n\t"
+           "sysenter\n\t"
+           "after_sysenter:\n\t"
+           "\tpopl %%esi\n"
+           "\tpopl %%ebp\n"
+           :"=a" (ret)
+           : "a" (num),
+             "d" (a1),
+             "c" (a2),
+             "b" (a3),
+             "D" (a4)
+           : "cc", "memory", "%esp");
        return ret;
 }
 
-static inline uint32_t syscall_trap(int num, uint32_t a1, uint32_t a2, 
-                                    uint32_t a3, uint32_t a4, uint32_t a5)
+static intreg_t syscall_trap(uint16_t num, intreg_t a1,
+                             intreg_t a2, intreg_t a3,
+                             intreg_t a4, intreg_t a5)
 {
-       uint32_t ret;
-
+       intreg_t ret;
+       
        // Generic system call: pass system call number in AX,
        // up to five parameters in DX, CX, BX, DI, SI.
        // Interrupt kernel with T_SYSCALL.
@@ -65,8 +63,9 @@ static inline uint32_t syscall_trap(int num, uint32_t a1, uint32_t a2,
        return ret;
 }
 
-static inline uint32_t syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3,
-                               uint32_t a4, uint32_t a5)
+static intreg_t syscall(uint16_t num, intreg_t a1,
+                        intreg_t a2, intreg_t a3,
+                        intreg_t a4, intreg_t a5)
 {
        #ifndef SYSCALL_TRAP
                return syscall_sysenter(num, a1, a2, a3, a4, a5);
@@ -86,24 +85,47 @@ envid_t sys_getenvid(void)
         return syscall(SYS_getenvid, 0, 0, 0, 0, 0);
 }
 
-uint32_t sys_getcpuid(void)
+envid_t sys_getcpuid(void)
 {
         return syscall(SYS_getcpuid, 0, 0, 0, 0, 0);
 }
 
-error_t sys_cputs(const char *s, size_t len)
+ssize_t sys_cputs(const uint8_t *s, size_t len)
+{
+    return syscall(SYS_cputs, (intreg_t) s,  len, 0, 0, 0);
+}
+
+uint16_t sys_cgetc(void)
 {
-    return syscall(SYS_cputs, (uint32_t) s,  len, 0, 0, 0);
+    return syscall(SYS_cgetc, 0, 0, 0, 0, 0);
 }
 
 //Write a buffer over the serial port
-error_t sys_serial_write(void* buf, uint16_t len) 
+ssize_t sys_serial_write(void* buf, size_t len) 
 {
-       return syscall(SYS_serial_write, (uint32_t)buf, len, 0, 0, 0);
+       return syscall(SYS_serial_write, (intreg_t)buf, len, 0, 0, 0);
 }
 
 //Read a buffer over the serial port
-uint16_t sys_serial_read(void* buf, uint16_t len) 
+ssize_t sys_serial_read(void* buf, size_t len) 
+{
+       return syscall(SYS_serial_read, (intreg_t)buf, len, 0, 0, 0);
+}
+
+//Run a binary loaded at the specificed address with the specified arguments
+ssize_t sys_run_binary(void* binary_buf, void* arg, size_t len) 
+{
+       return syscall(SYS_run_binary, (intreg_t)binary_buf, (intreg_t)arg, len, 0, 0);
+}
+
+//Write a buffer over ethernet
+ssize_t sys_eth_write(void* buf, size_t len) 
+{
+       return syscall(SYS_eth_write, (intreg_t)buf, len, 0, 0, 0);
+}
+
+//Read a buffer via ethernet
+ssize_t sys_eth_read(void* buf, size_t len) 
 {
-       return syscall(SYS_serial_read, (uint32_t)buf, len, 0, 0, 0);
+       return syscall(SYS_eth_read, (intreg_t)buf, len, 0, 0, 0);
 }