Further debugging shows that the domain is changed to domain 0 during the check of whether the cmd of do_altp2m_op is HVMOP_altp2m_vcpu_enable_notify, located at here . As domain 0 is a pv guest, it causes the is_hvm_domain check failed, and thus the execution never goes to HVMOP_altp2m_vcpu_enable_notify , which in the end cause xc_altp2m_set_vcpu_enable_notify fail. Why would the logic of do_altp2m_op change the domain to dom0 when the cmd is do_altp2m_op is HVMOP_altp2m_vcpu_enable_notify? Thanks for the suggestion, after adding printk to all the routines >> of xc_altp2m_set_vcpu_enable_notify, it turns out that the problem is >> because the check of is_hvm_domain() >> >> failed in function do_altp2m_op() >> . >> However, I've already configure the VM to build as a HVM by adding option >> "builder=hvm" in the config file, but for unknown reason the .printk of >> domain->type is guest_type_pv. I've tried both windows and linux as the >> guest VM, both failed for the same reason. Any ideas? >> >