#include <palacios/vmm.h>
#include <palacios/vm_guest.h>
+static int handle_cpufreq_hcall(struct guest_info * info, uint_t hcall_id, void * priv_data) {
+ struct vm_time * time_state = &(info->time_state);
+
+ info->vm_regs.rbx = time_state->cpu_freq;
+
+ PrintDebug("Guest request cpu frequency: return %ld\n", (long)info->vm_regs.rbx);
+
+ return 0;
+}
+
+
+
void v3_init_time(struct guest_info * info) {
struct vm_time * time_state = &(info->time_state);
INIT_LIST_HEAD(&(time_state->timers));
time_state->num_timers = 0;
+
+ v3_register_hypercall(info->vm_info, TIME_CPUFREQ_HCALL, handle_cpufreq_hcall, NULL);
}
-void v3_update_time(struct guest_info * info, ullong_t cycles) {
+void v3_update_time(struct guest_info * info, uint64_t cycles) {
struct vm_timer * tmp_timer;
-
+
+ // cycles *= 8;
+
+// cycles /= 150;
+
info->time_state.guest_tsc += cycles;
list_for_each_entry(tmp_timer, &(info->time_state.timers), timer_link) {
- tmp_timer->ops->update_time(cycles, info->time_state.cpu_freq, tmp_timer->private_data);
+ tmp_timer->ops->update_time(info, cycles, info->time_state.cpu_freq, tmp_timer->private_data);
}
//info->time_state.pending_cycles = 0;
}
+
+void v3_advance_time(struct guest_info * core) {
+ struct vm_timer * tmp_timer;
+
+
+ list_for_each_entry(tmp_timer, &(core->time_state.timers), timer_link) {
+ tmp_timer->ops->advance_timer(core, tmp_timer->private_data);
+ }
+
+
+
+}