From: Patrick G. Bridges Date: Tue, 22 May 2012 19:52:40 +0000 (-0600) Subject: Added hypercall to read host TSC X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=22d574d818e8cdcf63a054915e4cbaec07a2b533;p=palacios.releases.git Added hypercall to read host TSC --- diff --git a/palacios/include/palacios/vmm_hypercall.h b/palacios/include/palacios/vmm_hypercall.h index 4304790..575a9bb 100644 --- a/palacios/include/palacios/vmm_hypercall.h +++ b/palacios/include/palacios/vmm_hypercall.h @@ -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; diff --git a/palacios/src/palacios/vmm_time.c b/palacios/src/palacios/vmm_time.c index 5b3bfe7..7cf7853 100644 --- a/palacios/src/palacios/vmm_time.c +++ b/palacios/src/palacios/vmm_time.c @@ -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"));