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.


Added hypercall to read host TSC
Patrick G. Bridges [Tue, 22 May 2012 19:52:40 +0000 (13:52 -0600)]
palacios/include/palacios/vmm_hypercall.h
palacios/src/palacios/vmm_time.c

index 4304790..575a9bb 100644 (file)
@@ -51,7 +51,8 @@ typedef enum {
     BALLOON_START_HCALL =  0xba00,         // RAX: size
     BALLOON_QUERY_HCALL =  0xba01,         // RCX: req_pgs(out), RDX: alloc_pgs(out)
     OS_DEBUG_HCALL =       0xc0c0,          // RBX: msg_gpa, RCX: msg_len, RDX: buf_is_va (flag)
-    TIME_CPUFREQ_HCALL   =  0xd000       //RCX: cpu freq (out)
+    TIME_CPUFREQ_HCALL  =  0xd000,       //RBX: cpu freq (out)
+    TIME_RDHTSC_HCALL   =  0xd001,       //RBX: cpu freq (out)
 } hcall_id_t;
 
 
index 5b3bfe7..7cf7853 100644 (file)
@@ -84,6 +84,16 @@ static int handle_cpufreq_hcall(struct guest_info * info, uint_t hcall_id, void
     return 0;
 }
 
+static int handle_rdhtsc_hcall(struct guest_info * info, uint_t hcall_id, void * priv_data) {
+    struct vm_core_time * time_state = &(info->time_state);
+
+    info->vm_regs.rbx = v3_get_host_time(time_state);
+
+    // PrintDebug("Guest request host TSC: return %ld\n", (long)info->vm_regs.rbx);
+    
+    return 0;
+}
+
 
 
 int v3_start_time(struct guest_info * info) {
@@ -393,6 +403,9 @@ int v3_init_time_vm(struct v3_vm_info * vm) {
     PrintDebug("Registering TIME_CPUFREQ hypercall.\n");
     ret = v3_register_hypercall(vm, TIME_CPUFREQ_HCALL, 
                                handle_cpufreq_hcall, NULL);
+    PrintDebug("Registering TIME_RDHTSC hypercall.\n");
+    ret = v3_register_hypercall(vm, TIME_RDHTSC_HCALL, 
+                               handle_rdhtsc_hcall, NULL);
 
     handle_time_configuration(vm, v3_cfg_subtree(cfg_tree, "time"));