HYPERCALL(sysctl),
HYPERCALL(domctl),
HYPERCALL(tmem_op),
+ HYPERCALL(platform_op),
+ HYPERCALL(mmuext_op),
+ HYPERCALL(xenpmu_op),
[ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
};
HYPERCALL(sysctl),
HYPERCALL(domctl),
HYPERCALL(tmem_op),
- [ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
-};
-
-static hvm_hypercall_t *const pvh_hypercall64_table[NR_hypercalls] = {
- HYPERCALL(platform_op),
- HYPERCALL(memory_op),
- HYPERCALL(xen_version),
- HYPERCALL(console_io),
- [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
- HYPERCALL(vcpu_op),
- HYPERCALL(mmuext_op),
- HYPERCALL(xsm_op),
- HYPERCALL(sched_op),
- HYPERCALL(event_channel_op),
- [ __HYPERVISOR_physdev_op ] = (hvm_hypercall_t *)hvm_physdev_op,
- HYPERCALL(hvm_op),
- HYPERCALL(sysctl),
- HYPERCALL(domctl),
- HYPERCALL(xenpmu_op),
- [ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
-};
-
-extern int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(void) cmp_uops,
- unsigned int count,
- XEN_GUEST_HANDLE_PARAM(uint) pdone,
- unsigned int foreigndom);
-static hvm_hypercall_t *const pvh_hypercall32_table[NR_hypercalls] = {
- HYPERCALL(platform_op),
- COMPAT_CALL(memory_op),
- HYPERCALL(xen_version),
- HYPERCALL(console_io),
- [ __HYPERVISOR_grant_table_op ] =
- (hvm_hypercall_t *)hvm_grant_table_op_compat32,
- COMPAT_CALL(vcpu_op),
+ COMPAT_CALL(platform_op),
COMPAT_CALL(mmuext_op),
- HYPERCALL(xsm_op),
- COMPAT_CALL(sched_op),
- HYPERCALL(event_channel_op),
- [ __HYPERVISOR_physdev_op ] = (hvm_hypercall_t *)hvm_physdev_op_compat32,
- HYPERCALL(hvm_op),
- HYPERCALL(sysctl),
- HYPERCALL(domctl),
HYPERCALL(xenpmu_op),
[ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
};
if ( (eax & 0x80000000) && is_viridian_domain(currd) )
return viridian_hypercall(regs);
- if ( (eax >= NR_hypercalls) ||
- !(is_pvh_domain(currd) ? pvh_hypercall32_table[eax]
- : hvm_hypercall32_table[eax]) )
+ if ( (eax >= NR_hypercalls) || !hvm_hypercall32_table[eax] )
{
regs->eax = -ENOSYS;
return HVM_HCALL_completed;
#endif
curr->arch.hvm_vcpu.hcall_64bit = 1;
- regs->rax = (is_pvh_domain(currd)
- ? pvh_hypercall64_table
- : hvm_hypercall64_table)[eax](rdi, rsi, rdx, r10, r8, r9);
+ regs->rax = hvm_hypercall64_table[eax](rdi, rsi, rdx, r10, r8, r9);
+
curr->arch.hvm_vcpu.hcall_64bit = 0;
#ifndef NDEBUG
}
#endif
- regs->_eax = (is_pvh_vcpu(curr)
- ? pvh_hypercall32_table
- : hvm_hypercall32_table)[eax](ebx, ecx, edx,
- esi, edi, ebp);
+ regs->_eax = hvm_hypercall32_table[eax](ebx, ecx, edx, esi, edi, ebp);
#ifndef NDEBUG
if ( !curr->arch.hvm_vcpu.hcall_preempted )
if ( (pg_owner = get_pg_owner(foreigndom)) == NULL )
return -ESRCH;
+ if ( !is_pv_domain(pg_owner) )
+ {
+ put_pg_owner(pg_owner);
+ return -EINVAL;
+ }
+
rc = xsm_mmuext_op(XSM_TARGET, d, pg_owner);
if ( rc )
{
break;
}
+ if ( has_hvm_container_domain(d) )
+ {
+ switch ( op.cmd )
+ {
+ case MMUEXT_PIN_L1_TABLE:
+ case MMUEXT_PIN_L2_TABLE:
+ case MMUEXT_PIN_L3_TABLE:
+ case MMUEXT_PIN_L4_TABLE:
+ case MMUEXT_UNPIN_TABLE:
+ break;
+ default:
+ MEM_LOG("Invalid extended pt command %#x", op.cmd);
+ rc = -EOPNOTSUPP;
+ goto done;
+ }
+ }
+
okay = 1;
switch ( op.cmd )
break;
}
+ done:
if ( unlikely(!okay) && !rc )
rc = -EINVAL;
if ( unlikely(rc) )
DEFINE_XEN_GUEST_HANDLE(mmuext_op_compat_t);
-int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(mmuext_op_compat_t) cmp_uops,
+int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(void) arg,
unsigned int count,
XEN_GUEST_HANDLE_PARAM(uint) pdone,
unsigned int foreigndom)
{
unsigned int i, preempt_mask;
int rc = 0;
+ XEN_GUEST_HANDLE_PARAM(mmuext_op_compat_t) cmp_uops =
+ guest_handle_cast(arg, mmuext_op_compat_t);
XEN_GUEST_HANDLE_PARAM(mmuext_op_t) nat_ops;
if ( unlikely(count == MMU_UPDATE_PREEMPTED) &&