__checkReturn XEN_API NTSTATUS HvmGetParam( IN ULONG Parameter, OUT PULONG_PTR Value ) { struct xen_hvm_param op; LONG_PTR rc; NTSTATUS status; op.domid = DOMID_SELF; op.index = Parameter; op.value = 0xFEEDFACE; rc = HvmOp(HVMOP_get_param, &op); if (rc < 0) { ERRNO_TO_STATUS(-rc, status); goto fail1; } ASSERT(op.value != 0xFEEDFACE); *Value = (ULONG_PTR)op.value; return STATUS_SUCCESS; fail1: Error("fail1 (%08x)\n", status); return status; }
__checkReturn XEN_API NTSTATUS SchedShutdown( ULONG Reason ) { struct sched_shutdown op; LONG_PTR rc; NTSTATUS status; op.reason = Reason; rc = SchedOp(SCHEDOP_shutdown, &op); if (rc < 0) { ERRNO_TO_STATUS(-rc, status); goto fail1; } return STATUS_SUCCESS; fail1: Error("fail1 (%08x)\n", status); return status; }
__checkReturn XEN_API NTSTATUS HvmSetParam( IN ULONG Parameter, IN ULONG_PTR Value ) { struct xen_hvm_param op; LONG_PTR rc; NTSTATUS status; op.domid = DOMID_SELF; op.index = Parameter; op.value = Value; rc = HvmOp(HVMOP_set_param, &op); if (rc < 0) { ERRNO_TO_STATUS(-rc, status); goto fail1; } return STATUS_SUCCESS; fail1: Error("fail1 (%08x)\n", status); return status; }
__checkReturn XEN_API NTSTATUS HvmPagetableDying( IN PHYSICAL_ADDRESS Address ) { struct xen_hvm_pagetable_dying op; LONG_PTR rc; NTSTATUS status; op.domid = DOMID_SELF; op.gpa = Address.QuadPart; rc = HvmOp(HVMOP_pagetable_dying, &op); if (rc < 0) { ERRNO_TO_STATUS(-rc, status); goto fail1; } return STATUS_SUCCESS; fail1: return status; }
__checkReturn XEN_API NTSTATUS HvmGetTime( OUT PLARGE_INTEGER Now ) { struct xen_hvm_get_time op; LONG_PTR rc; NTSTATUS status; rc = HvmOp(HVMOP_get_time, &op); if (rc < 0) { ERRNO_TO_STATUS(-rc, status); goto fail1; } Now->QuadPart = op.now; return STATUS_SUCCESS; fail1: Error("fail1 (%08x)\n", status); return status; }
NTSTATUS HvmGetParameter( IN ULONG Param, OUT PULONGLONG Value ) { struct xen_hvm_param op; LONG_PTR rc; NTSTATUS status; op.domid = DOMID_SELF; op.index = Param; op.value = 0xf001dead; rc = HvmOp(HVMOP_get_param, &op); if (rc < 0) goto fail1; /* Horrible hack to cope with the transition from return parameters through the hypercall return value to returning them through an in-memory structure. */ if (op.value != 0xf001dead) *Value = (ULONG_PTR)op.value; else *Value = (ULONG_PTR)rc; return STATUS_SUCCESS; fail1: ERRNO_TO_STATUS(-rc, status); LogError("fail1 (%08x)\n", status); return status; }
static FORCEINLINE NTSTATUS MemoryOp( IN ULONG Command, IN PVOID Argument ) { LONG_PTR ret; NTSTATUS Status; ret = Hypercall2(LONG_PTR, memory_op, Command, Argument); if (ret < 0) { ERRNO_TO_STATUS(-ret, Status); goto fail; } return STATUS_SUCCESS; fail: return Status; }