exit_code = guest_ctrl->exit_code;
- // PrintDebug("SVM Exit: %s (rip=%p)\n", vmexit_code_to_str(exit_code), (void *)info->rip);
+ // PrintDebug("SVM Exit: %s (rip=%p) (info1=%p)\n", vmexit_code_to_str(exit_code),
+ // (void *)(addr_t)info->rip, (void *)(addr_t)guest_ctrl->exit_info1);
if ((info->intr_state.irq_pending == 1) && (guest_ctrl->guest_ctrl.V_IRQ == 0)) {
}
- // Update the low level state
+
if (v3_excp_pending(info)) {
uint_t excp = v3_get_excp_number(info);
+
+
static struct vm_device * configure_generic(struct guest_info * info, struct v3_vm_config * config_ptr) {
PrintDebug("Creating Generic Device\n");
struct vm_device * generic = v3_create_generic();
#include <palacios/vmm.h>
#include <palacios/vm_guest.h>
+#include <palacios/vmm_ctrl_regs.h>
#ifndef DEBUG_INTERRUPTS
#undef PrintDebug
int v3_intr_pending(struct guest_info * info) {
struct v3_intr_state * intr_state = &(info->intr_state);
struct intr_controller * ctrl = NULL;
+ struct rflags * flags = (struct rflags *)&(info->ctrl_regs.rflags);
// PrintDebug("[intr_pending]\n");
+
+ // Check if the guest has interrupts enabled
+ if (flags->intr == 0) {
+ return 0;
+ }
list_for_each_entry(ctrl, &(intr_state->controller_list), ctrl_node) {
if (ctrl->ctrl_ops->intr_pending(ctrl->priv_data) == 1) {