2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <palacios/vmm_time.h>
21 #include <palacios/vmm.h>
22 #include <palacios/vm_guest.h>
24 static int handle_cpufreq_hcall(struct guest_info * info, uint_t hcall_id, void * priv_data) {
25 struct vm_time * time_state = &(info->time_state);
27 info->vm_regs.rbx = time_state->cpu_freq;
29 PrintDebug("Guest request cpu frequency: return %ld\n", (long)info->vm_regs.rbx);
36 void v3_init_time(struct guest_info * info) {
37 struct vm_time * time_state = &(info->time_state);
39 time_state->cpu_freq = V3_CPU_KHZ();
41 time_state->guest_tsc = 0;
42 time_state->cached_host_tsc = 0;
43 // time_state->pending_cycles = 0;
45 INIT_LIST_HEAD(&(time_state->timers));
46 time_state->num_timers = 0;
48 v3_register_hypercall(info->vm_info, TIME_CPUFREQ_HCALL, handle_cpufreq_hcall, NULL);
52 int v3_add_timer(struct guest_info * info, struct vm_timer_ops * ops, void * private_data) {
53 struct vm_timer * timer = NULL;
54 timer = (struct vm_timer *)V3_Malloc(sizeof(struct vm_timer));
55 V3_ASSERT(timer != NULL);
58 timer->private_data = private_data;
60 list_add(&(timer->timer_link), &(info->time_state.timers));
61 info->time_state.num_timers++;
67 int v3_remove_timer(struct guest_info * info, struct vm_timer * timer) {
68 list_del(&(timer->timer_link));
69 info->time_state.num_timers--;
77 void v3_update_time(struct guest_info * info, uint64_t cycles) {
78 struct vm_timer * tmp_timer;
84 info->time_state.guest_tsc += cycles;
86 list_for_each_entry(tmp_timer, &(info->time_state.timers), timer_link) {
87 tmp_timer->ops->update_time(info, cycles, info->time_state.cpu_freq, tmp_timer->private_data);
92 //info->time_state.pending_cycles = 0;
95 void v3_advance_time(struct guest_info * core) {
96 struct vm_timer * tmp_timer;
99 list_for_each_entry(tmp_timer, &(core->time_state.timers), timer_link) {
100 tmp_timer->ops->advance_timer(core, tmp_timer->private_data);