Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


HVM capability enhancement: asynchronous upcalls to ROS userspace
[palacios.git] / guest / linux / hvm-ros / v3_hvm_ros_user.c
index 74e6a5a..c703ec1 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <sys/mman.h>
 
 #include "v3_hvm_ros_user.h"
 
@@ -239,6 +240,32 @@ static void wait_for_completion()
   }
 }
 
+
+int v3_hvm_ros_install_hrt_image(void *image, uint64_t size)
+{
+    unsigned long long rc, num, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0;
+    unsigned long long i;
+    volatile long long sum=0;
+
+    num = 0xf00d;
+    a1 = 0x8; // install image
+    a2 = (unsigned long long) image;
+    a3 = size;
+
+    // touch the whoel image to make it has ptes
+    for (i=0;i<size;i++) { 
+       sum+=((char*)image)[i];
+    }
+
+    HCALL(rc,num,a1,a2,a3,a4,a5,a6,a7,a8);
+
+    if (rc) { 
+       return -1;
+    } else {
+       return 0;
+    }
+}
+
 int v3_hvm_ros_reset(reset_type what)
 {
     unsigned long long num, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0;
@@ -454,3 +481,87 @@ int v3_hvm_ros_invoke_hrt_sync(void *buf, int ros)
     return 0;
 }
 
+extern void *__v3_hvm_ros_signal_handler_stub;
+
+void (*__v3_hvm_ros_signal_handler)(uint64_t) = 0;
+static void *__v3_hvm_ros_signal_handler_stack = 0;
+static uint64_t __v3_hvm_ros_signal_handler_stack_size=0;
+
+int v3_hvm_ros_register_signal(void (*h)(uint64_t), void *stack, uint64_t stack_size )
+{
+    unsigned long long rc, num, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0;
+
+    if (mlock(stack,stack_size)) { 
+       INFO("Can't pin stack - proceeding\n");
+    }
+
+    // clear it and touch it
+    memset(stack,0,stack_size);
+
+    __v3_hvm_ros_signal_handler_stack = stack;
+    __v3_hvm_ros_signal_handler_stack_size = stack_size;
+    __v3_hvm_ros_signal_handler = h;
+
+    // Attempt to install
+    
+    num = 0xf00d;
+    a1 = 0x40;
+    a2 = (unsigned long long) &__v3_hvm_ros_signal_handler_stub;
+    a3 = (unsigned long long) stack + stack_size - 8; // put us at the top of the stack
+
+    HCALL(rc,num,a1,a2,a3,a4,a5,a6,a7,a8);
+    if (rc) {
+       INFO("Failed to install HVM signal handler\n");
+       return -1;
+    } 
+
+    return 0;
+}
+
+int v3_hvm_ros_unregister_signal()
+{
+    unsigned long long rc, num, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0;
+
+    // an unregister boils down to setting handler to null
+    num = 0xf00d;
+    a1 = 0x40;
+    a2 = (unsigned long long) 0;
+    a3 = (unsigned long long) 0; 
+
+    HCALL(rc,num,a1,a2,a3,a4,a5,a6,a7,a8);
+
+    if (rc) {
+       INFO("Failed to uninstall HVM signal handler\n");
+    } 
+
+    // and now do user space cleanup
+
+    __v3_hvm_ros_signal_handler = 0;
+
+    if (__v3_hvm_ros_signal_handler_stack) { 
+       munlock(__v3_hvm_ros_signal_handler_stack,__v3_hvm_ros_signal_handler_stack_size);
+       __v3_hvm_ros_signal_handler_stack = 0;
+       __v3_hvm_ros_signal_handler_stack_size = 0;
+    }
+    
+    if (rc) { 
+       return -1;
+    } else {
+       return 0;
+    }
+}
+
+
+int  v3_hvm_hrt_signal_ros(uint64_t code)
+{
+    unsigned long long rc, num, a1=0, a2=0, a3=0, a4=0, a5=0, a6=0, a7=0, a8=0;
+
+    num = 0xf00d;
+    a1 = 0x41;
+    a2 = (unsigned long long) code;
+
+    HCALL(rc,num,a1,a2,a3,a4,a5,a6,a7,a8);
+
+    return rc ? -1 : rc;
+
+}