xref: /illumos-gate/usr/src/uts/common/xen/os/hypercall.c (revision 86ef0a63e1cfa5dc98606efef379365acca98063)
1551bc2a6Smrj /*
2551bc2a6Smrj  * CDDL HEADER START
3551bc2a6Smrj  *
4551bc2a6Smrj  * The contents of this file are subject to the terms of the
5551bc2a6Smrj  * Common Development and Distribution License (the "License").
6551bc2a6Smrj  * You may not use this file except in compliance with the License.
7551bc2a6Smrj  *
8551bc2a6Smrj  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9551bc2a6Smrj  * or http://www.opensolaris.org/os/licensing.
10551bc2a6Smrj  * See the License for the specific language governing permissions
11551bc2a6Smrj  * and limitations under the License.
12551bc2a6Smrj  *
13551bc2a6Smrj  * When distributing Covered Code, include this CDDL HEADER in each
14551bc2a6Smrj  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15551bc2a6Smrj  * If applicable, add the following below this CDDL HEADER, with the
16551bc2a6Smrj  * fields enclosed by brackets "[]" replaced with your own identifying
17551bc2a6Smrj  * information: Portions Copyright [yyyy] [name of copyright owner]
18551bc2a6Smrj  *
19551bc2a6Smrj  * CDDL HEADER END
20551bc2a6Smrj  */
21551bc2a6Smrj 
22551bc2a6Smrj /*
23349b53ddSStuart Maybee  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24551bc2a6Smrj  * Use is subject to license terms.
25551bc2a6Smrj  */
26551bc2a6Smrj 
27551bc2a6Smrj /*
28551bc2a6Smrj  * Provides basic C wrappers around hypervisor invocation.
29551bc2a6Smrj  *
30551bc2a6Smrj  * i386: eax = vector: ebx, ecx, edx, esi, edi = args 1-5
31551bc2a6Smrj  *	 eax = return value
32551bc2a6Smrj  *	 (argument registers may be clobbered on return)
33551bc2a6Smrj  *
34551bc2a6Smrj  * amd64:rax = vector: rdi, rsi, rdx, r10, r8, r9 = args 1-6
35551bc2a6Smrj  *	 rax = return value
36551bc2a6Smrj  *	 (arguments registers not clobbered on return; rcx, r11 are)
37551bc2a6Smrj  */
38551bc2a6Smrj 
39551bc2a6Smrj #include <sys/types.h>
403c4c5929SGordon Ross #include <sys/errno.h>
41349b53ddSStuart Maybee #ifndef __xpv
42551bc2a6Smrj #include <sys/xpv_support.h>
43349b53ddSStuart Maybee #else
44349b53ddSStuart Maybee #include <sys/xpv_user.h>
45551bc2a6Smrj #endif
46551bc2a6Smrj 
47551bc2a6Smrj #include <sys/hypervisor.h>
48551bc2a6Smrj #include <xen/public/sched.h>
49551bc2a6Smrj #include <sys/debug.h>
50551bc2a6Smrj #include <sys/archsystm.h>
51551bc2a6Smrj 
52551bc2a6Smrj long
HYPERVISOR_set_trap_table(trap_info_t * table)53551bc2a6Smrj HYPERVISOR_set_trap_table(trap_info_t *table)
54551bc2a6Smrj {
55551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_set_trap_table, (ulong_t)table));
56551bc2a6Smrj }
57551bc2a6Smrj 
58551bc2a6Smrj int
HYPERVISOR_mmu_update(mmu_update_t * req,int count,int * success_count,domid_t domain_id)59551bc2a6Smrj HYPERVISOR_mmu_update(mmu_update_t *req, int count, int *success_count,
60551bc2a6Smrj     domid_t domain_id)
61551bc2a6Smrj {
62551bc2a6Smrj 	return (__hypercall4_int(__HYPERVISOR_mmu_update,
63551bc2a6Smrj 	    (ulong_t)req, (long)count, (ulong_t)success_count,
64551bc2a6Smrj 	    (ulong_t)domain_id));
65551bc2a6Smrj }
66551bc2a6Smrj 
67551bc2a6Smrj long
HYPERVISOR_set_gdt(ulong_t * frame_list,int entries)68551bc2a6Smrj HYPERVISOR_set_gdt(ulong_t *frame_list, int entries)
69551bc2a6Smrj {
70551bc2a6Smrj 	return (__hypercall2(
71551bc2a6Smrj 	    __HYPERVISOR_set_gdt, (ulong_t)frame_list, (long)entries));
72551bc2a6Smrj }
73551bc2a6Smrj 
74551bc2a6Smrj /*
75551bc2a6Smrj  * XXPV Seems like "sp" would be a better name for both amd64 and i386?
76551bc2a6Smrj  * For now stay consistent with xen project source.
77551bc2a6Smrj  */
78551bc2a6Smrj long
HYPERVISOR_stack_switch(ulong_t ss,ulong_t esp)79551bc2a6Smrj HYPERVISOR_stack_switch(ulong_t ss, ulong_t esp)
80551bc2a6Smrj {
81551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_stack_switch, ss, esp));
82551bc2a6Smrj }
83551bc2a6Smrj 
84551bc2a6Smrj #if defined(__amd64)
85551bc2a6Smrj 
86551bc2a6Smrj long
HYPERVISOR_set_callbacks(ulong_t event_address,ulong_t failsafe_address,ulong_t syscall_address)87551bc2a6Smrj HYPERVISOR_set_callbacks(ulong_t event_address, ulong_t failsafe_address,
88551bc2a6Smrj     ulong_t syscall_address)
89551bc2a6Smrj {
90551bc2a6Smrj 	return (__hypercall3(__HYPERVISOR_set_callbacks,
91551bc2a6Smrj 	    event_address, failsafe_address, syscall_address));
92551bc2a6Smrj }
93551bc2a6Smrj 
94551bc2a6Smrj #endif	/* __amd64 */
95551bc2a6Smrj 
96551bc2a6Smrj long
HYPERVISOR_fpu_taskswitch(int set)97551bc2a6Smrj HYPERVISOR_fpu_taskswitch(int set)
98551bc2a6Smrj {
99551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_fpu_taskswitch, (long)set));
100551bc2a6Smrj }
101551bc2a6Smrj 
102551bc2a6Smrj /* *** __HYPERVISOR_sched_op_compat *** OBSOLETED */
103551bc2a6Smrj 
104551bc2a6Smrj long
HYPERVISOR_platform_op(xen_platform_op_t * platform_op)105551bc2a6Smrj HYPERVISOR_platform_op(xen_platform_op_t *platform_op)
106551bc2a6Smrj {
107551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_platform_op, (ulong_t)platform_op));
108551bc2a6Smrj }
109551bc2a6Smrj 
110551bc2a6Smrj /* *** __HYPERVISOR_set_debugreg *** NOT IMPLEMENTED */
111551bc2a6Smrj 
112551bc2a6Smrj /* *** __HYPERVISOR_get_debugreg *** NOT IMPLEMENTED */
113551bc2a6Smrj 
114551bc2a6Smrj long
HYPERVISOR_update_descriptor(maddr_t ma,uint64_t desc)115551bc2a6Smrj HYPERVISOR_update_descriptor(maddr_t ma, uint64_t desc)
116551bc2a6Smrj {
117551bc2a6Smrj #if defined(__amd64)
118551bc2a6Smrj 
119551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_update_descriptor, ma, desc));
120551bc2a6Smrj 
121551bc2a6Smrj #endif
122551bc2a6Smrj }
123551bc2a6Smrj 
124551bc2a6Smrj long
HYPERVISOR_memory_op(int cmd,void * arg)125551bc2a6Smrj HYPERVISOR_memory_op(int cmd, void *arg)
126551bc2a6Smrj {
127551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_memory_op, (long)cmd,
128551bc2a6Smrj 	    (ulong_t)arg));
129551bc2a6Smrj }
130551bc2a6Smrj 
131551bc2a6Smrj long
HYPERVISOR_multicall(void * call_list,uint_t nr_calls)132551bc2a6Smrj HYPERVISOR_multicall(void *call_list, uint_t nr_calls)
133551bc2a6Smrj {
134551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_multicall,
135551bc2a6Smrj 	    (ulong_t)call_list, (ulong_t)nr_calls));
136551bc2a6Smrj }
137551bc2a6Smrj 
138551bc2a6Smrj int
HYPERVISOR_update_va_mapping(ulong_t va,uint64_t new_pte,ulong_t flags)139551bc2a6Smrj HYPERVISOR_update_va_mapping(ulong_t va, uint64_t new_pte, ulong_t flags)
140551bc2a6Smrj {
141551bc2a6Smrj #if !defined(_BOOT)
142551bc2a6Smrj 	if (IN_XPV_PANIC())
143551bc2a6Smrj 		return (0);
144551bc2a6Smrj #endif
145551bc2a6Smrj #if defined(__amd64)
146551bc2a6Smrj 
147551bc2a6Smrj 	return (__hypercall3_int(__HYPERVISOR_update_va_mapping, va,
148551bc2a6Smrj 	    new_pte, flags));
149551bc2a6Smrj 
150*86ef0a63SRichard Lowe #endif	/* __amd64 */
151551bc2a6Smrj }
152551bc2a6Smrj 
153551bc2a6Smrj /*
154551bc2a6Smrj  * Note: this timeout must be the Xen system time not hrtime (see
155551bc2a6Smrj  * xpv_timestamp.c).
156551bc2a6Smrj  */
157551bc2a6Smrj long
HYPERVISOR_set_timer_op(uint64_t timeout)158551bc2a6Smrj HYPERVISOR_set_timer_op(uint64_t timeout)
159551bc2a6Smrj {
160551bc2a6Smrj #if defined(__amd64)
161551bc2a6Smrj 
162551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_set_timer_op, timeout));
163551bc2a6Smrj 
164*86ef0a63SRichard Lowe #endif	/* __amd64 */
165551bc2a6Smrj }
166551bc2a6Smrj 
167551bc2a6Smrj /* *** __HYPERVISOR_event_channel_op_compat *** OBSOLETED */
168551bc2a6Smrj 
169551bc2a6Smrj long
HYPERVISOR_xen_version(int cmd,void * arg)170551bc2a6Smrj HYPERVISOR_xen_version(int cmd, void *arg)
171551bc2a6Smrj {
172551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_xen_version, (long)cmd,
173551bc2a6Smrj 	    (ulong_t)arg));
174551bc2a6Smrj }
175551bc2a6Smrj 
176551bc2a6Smrj long
HYPERVISOR_console_io(int cmd,int count,char * str)177551bc2a6Smrj HYPERVISOR_console_io(int cmd, int count, char *str)
178551bc2a6Smrj {
179551bc2a6Smrj 	return (__hypercall3(__HYPERVISOR_console_io, (long)cmd, (long)count,
180551bc2a6Smrj 	    (ulong_t)str));
181551bc2a6Smrj }
182551bc2a6Smrj 
183551bc2a6Smrj /* *** __HYPERVISOR_physdev_op_compat *** OBSOLETED */
184551bc2a6Smrj 
1857eea693dSMark Johnson /*
1867eea693dSMark Johnson  * ****
1877eea693dSMark Johnson  * NOTE: this hypercall should not be called directly for a
1887eea693dSMark Johnson  * GNTTABOP_map_grant_ref. Instead xen_map_gref() should be called.
1897eea693dSMark Johnson  * ****
1907eea693dSMark Johnson  */
191551bc2a6Smrj long
HYPERVISOR_grant_table_op(uint_t cmd,void * uop,uint_t count)192551bc2a6Smrj HYPERVISOR_grant_table_op(uint_t cmd, void *uop, uint_t count)
193551bc2a6Smrj {
194551bc2a6Smrj 	int ret_val;
195551bc2a6Smrj 	ret_val = __hypercall3(__HYPERVISOR_grant_table_op,
196551bc2a6Smrj 	    (long)cmd, (ulong_t)uop, (ulong_t)count);
197551bc2a6Smrj 	return (ret_val);
198551bc2a6Smrj }
199551bc2a6Smrj 
200551bc2a6Smrj long
HYPERVISOR_vm_assist(uint_t cmd,uint_t type)201551bc2a6Smrj HYPERVISOR_vm_assist(uint_t cmd, uint_t type)
202551bc2a6Smrj {
203551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_vm_assist,
204551bc2a6Smrj 	    (ulong_t)cmd, (ulong_t)type));
205551bc2a6Smrj }
206551bc2a6Smrj 
207551bc2a6Smrj int
HYPERVISOR_update_va_mapping_otherdomain(ulong_t va,uint64_t new_pte,ulong_t flags,domid_t domain_id)208551bc2a6Smrj HYPERVISOR_update_va_mapping_otherdomain(ulong_t va,
209551bc2a6Smrj     uint64_t new_pte, ulong_t flags, domid_t domain_id)
210551bc2a6Smrj {
211551bc2a6Smrj #if defined(__amd64)
212551bc2a6Smrj 
213551bc2a6Smrj 	return (__hypercall4_int(__HYPERVISOR_update_va_mapping_otherdomain,
214551bc2a6Smrj 	    va, new_pte, flags, (ulong_t)domain_id));
215551bc2a6Smrj 
216*86ef0a63SRichard Lowe #endif	/* __amd64 */
217551bc2a6Smrj }
218551bc2a6Smrj 
219551bc2a6Smrj /*
220551bc2a6Smrj  * *** __HYPERVISOR_iret ***
221551bc2a6Smrj  *   see HYPERVISOR_IRET() macro in i86xpv/sys/machprivregs.h
222551bc2a6Smrj  */
223551bc2a6Smrj 
224551bc2a6Smrj long
HYPERVISOR_vcpu_op(int cmd,int vcpuid,void * extra_args)225551bc2a6Smrj HYPERVISOR_vcpu_op(int cmd, int vcpuid, void *extra_args)
226551bc2a6Smrj {
227551bc2a6Smrj 	return (__hypercall3(__HYPERVISOR_vcpu_op, (long)cmd, (long)vcpuid,
228551bc2a6Smrj 	    (ulong_t)extra_args));
229551bc2a6Smrj }
230551bc2a6Smrj 
231551bc2a6Smrj #if defined(__amd64)
232551bc2a6Smrj 
233551bc2a6Smrj long
HYPERVISOR_set_segment_base(int reg,ulong_t value)234551bc2a6Smrj HYPERVISOR_set_segment_base(int reg, ulong_t value)
235551bc2a6Smrj {
236551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_set_segment_base, (long)reg, value));
237551bc2a6Smrj }
238551bc2a6Smrj 
239551bc2a6Smrj #endif	/* __amd64 */
240551bc2a6Smrj 
241551bc2a6Smrj int
HYPERVISOR_mmuext_op(struct mmuext_op * req,int count,uint_t * success_count,domid_t domain_id)242551bc2a6Smrj HYPERVISOR_mmuext_op(struct mmuext_op *req, int count, uint_t *success_count,
243551bc2a6Smrj     domid_t domain_id)
244551bc2a6Smrj {
245551bc2a6Smrj 	return (__hypercall4_int(__HYPERVISOR_mmuext_op,
246551bc2a6Smrj 	    (ulong_t)req, (long)count, (ulong_t)success_count,
247551bc2a6Smrj 	    (ulong_t)domain_id));
248551bc2a6Smrj }
249551bc2a6Smrj 
250551bc2a6Smrj long
HYPERVISOR_nmi_op(int cmd,void * arg)251551bc2a6Smrj HYPERVISOR_nmi_op(int cmd, void *arg)
252551bc2a6Smrj {
253551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_nmi_op, (long)cmd, (ulong_t)arg));
254551bc2a6Smrj }
255551bc2a6Smrj 
256551bc2a6Smrj long
HYPERVISOR_sched_op(int cmd,void * arg)257551bc2a6Smrj HYPERVISOR_sched_op(int cmd, void *arg)
258551bc2a6Smrj {
259551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_sched_op,
260551bc2a6Smrj 	    (ulong_t)cmd, (ulong_t)arg));
261551bc2a6Smrj }
262551bc2a6Smrj 
263551bc2a6Smrj long
HYPERVISOR_callback_op(int cmd,void * arg)264551bc2a6Smrj HYPERVISOR_callback_op(int cmd, void *arg)
265551bc2a6Smrj {
266551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_callback_op,
267551bc2a6Smrj 	    (ulong_t)cmd, (ulong_t)arg));
268551bc2a6Smrj }
269551bc2a6Smrj 
270551bc2a6Smrj /* *** __HYPERVISOR_xenoprof_op *** NOT IMPLEMENTED */
271551bc2a6Smrj 
272551bc2a6Smrj long
HYPERVISOR_event_channel_op(int cmd,void * arg)273551bc2a6Smrj HYPERVISOR_event_channel_op(int cmd, void *arg)
274551bc2a6Smrj {
275551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_event_channel_op, (long)cmd,
276551bc2a6Smrj 	    (ulong_t)arg));
277551bc2a6Smrj }
278551bc2a6Smrj 
279551bc2a6Smrj long
HYPERVISOR_physdev_op(int cmd,void * arg)280551bc2a6Smrj HYPERVISOR_physdev_op(int cmd, void *arg)
281551bc2a6Smrj {
282551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_physdev_op, (long)cmd,
283551bc2a6Smrj 	    (ulong_t)arg));
284551bc2a6Smrj }
285551bc2a6Smrj 
286551bc2a6Smrj long
HYPERVISOR_hvm_op(int cmd,void * arg)287551bc2a6Smrj HYPERVISOR_hvm_op(int cmd, void *arg)
288551bc2a6Smrj {
289551bc2a6Smrj 	return (__hypercall2(__HYPERVISOR_hvm_op, (long)cmd, (ulong_t)arg));
290551bc2a6Smrj }
291551bc2a6Smrj 
292349b53ddSStuart Maybee #if defined(__xpv)
293349b53ddSStuart Maybee long
HYPERVISOR_xsm_op(struct xen_acmctl * arg)294349b53ddSStuart Maybee HYPERVISOR_xsm_op(struct xen_acmctl *arg)
295349b53ddSStuart Maybee {
296349b53ddSStuart Maybee 	return (__hypercall1(__HYPERVISOR_xsm_op, (ulong_t)arg));
297349b53ddSStuart Maybee }
298349b53ddSStuart Maybee 
299551bc2a6Smrj long
HYPERVISOR_sysctl(xen_sysctl_t * sysctl)300551bc2a6Smrj HYPERVISOR_sysctl(xen_sysctl_t *sysctl)
301551bc2a6Smrj {
302551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_sysctl, (ulong_t)sysctl));
303551bc2a6Smrj }
304551bc2a6Smrj 
305551bc2a6Smrj long
HYPERVISOR_domctl(xen_domctl_t * domctl)306551bc2a6Smrj HYPERVISOR_domctl(xen_domctl_t *domctl)
307551bc2a6Smrj {
308551bc2a6Smrj 	return (__hypercall1(__HYPERVISOR_domctl, (ulong_t)domctl));
309551bc2a6Smrj }
310349b53ddSStuart Maybee #endif /* __xpv */
311551bc2a6Smrj 
312551bc2a6Smrj /* *** __HYPERVISOR_kexec_op *** NOT IMPLEMENTED */
313551bc2a6Smrj 
314551bc2a6Smrj /*
315551bc2a6Smrj  *
316551bc2a6Smrj  * HYPERCALL HELPER ROUTINES
317551bc2a6Smrj  *    These don't have there own unique hypercalls.
318551bc2a6Smrj  *
319551bc2a6Smrj  */
320551bc2a6Smrj 
321551bc2a6Smrj long
HYPERVISOR_yield(void)322551bc2a6Smrj HYPERVISOR_yield(void)
323551bc2a6Smrj {
324551bc2a6Smrj 	return (HYPERVISOR_sched_op(SCHEDOP_yield, NULL));
325551bc2a6Smrj }
326551bc2a6Smrj 
327551bc2a6Smrj long
HYPERVISOR_block(void)328551bc2a6Smrj HYPERVISOR_block(void)
329551bc2a6Smrj {
330551bc2a6Smrj 	return (HYPERVISOR_sched_op(SCHEDOP_block, NULL));
331551bc2a6Smrj }
332551bc2a6Smrj 
333551bc2a6Smrj long
HYPERVISOR_shutdown(uint_t reason)334551bc2a6Smrj HYPERVISOR_shutdown(uint_t reason)
335551bc2a6Smrj {
336551bc2a6Smrj 	struct sched_shutdown sched_shutdown;
337551bc2a6Smrj 
338551bc2a6Smrj 	sched_shutdown.reason = reason;
339551bc2a6Smrj 
340551bc2a6Smrj 	return (HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown));
341551bc2a6Smrj }
342551bc2a6Smrj 
343551bc2a6Smrj /*
344551bc2a6Smrj  * Poll one or more event-channel ports, and return when pending.
345551bc2a6Smrj  * An optional timeout (in nanoseconds, absolute time since boot) may be
346551bc2a6Smrj  * specified. Note: this timeout must be the Xen system time not hrtime (see
347551bc2a6Smrj  * xpv_timestamp.c).
348551bc2a6Smrj  */
349551bc2a6Smrj long
HYPERVISOR_poll(evtchn_port_t * ports,uint_t nr_ports,uint64_t timeout)350551bc2a6Smrj HYPERVISOR_poll(evtchn_port_t *ports, uint_t nr_ports, uint64_t timeout)
351551bc2a6Smrj {
352551bc2a6Smrj 	struct sched_poll sched_poll;
353551bc2a6Smrj 
354551bc2a6Smrj 	/*LINTED: constant in conditional context*/
355551bc2a6Smrj 	set_xen_guest_handle(sched_poll.ports, ports);
356551bc2a6Smrj 	sched_poll.nr_ports = nr_ports;
357551bc2a6Smrj 	sched_poll.timeout = timeout;
358551bc2a6Smrj 
359551bc2a6Smrj 	return (HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll));
360551bc2a6Smrj }
361551bc2a6Smrj 
362551bc2a6Smrj long
HYPERVISOR_suspend(ulong_t start_info_mfn)363551bc2a6Smrj HYPERVISOR_suspend(ulong_t start_info_mfn)
364551bc2a6Smrj {
365551bc2a6Smrj 	struct sched_shutdown sched_shutdown;
366551bc2a6Smrj 
367551bc2a6Smrj 	sched_shutdown.reason = SHUTDOWN_suspend;
368551bc2a6Smrj 
369551bc2a6Smrj 	return (__hypercall3(__HYPERVISOR_sched_op, SCHEDOP_shutdown,
370551bc2a6Smrj 	    (ulong_t)&sched_shutdown, start_info_mfn));
371551bc2a6Smrj }
372e4b86885SCheng Sean Ye 
373e4b86885SCheng Sean Ye long
HYPERVISOR_mca(uint32_t cmd,xen_mc_t * xmcp)374ad09f8b8SMark Johnson HYPERVISOR_mca(uint32_t cmd, xen_mc_t *xmcp)
375e4b86885SCheng Sean Ye {
376e4b86885SCheng Sean Ye 	long rv;
377e4b86885SCheng Sean Ye 
378e4b86885SCheng Sean Ye 	switch (cmd) {
379349b53ddSStuart Maybee 	case XEN_MC_fetch:
380349b53ddSStuart Maybee 	case XEN_MC_physcpuinfo:
381349b53ddSStuart Maybee 	case XEN_MC_msrinject:
382349b53ddSStuart Maybee 	case XEN_MC_mceinject:
383e4b86885SCheng Sean Ye 		break;
384e4b86885SCheng Sean Ye 
385349b53ddSStuart Maybee 	case XEN_MC_notifydomain:
386e4b86885SCheng Sean Ye 		return (ENOTSUP);
387e4b86885SCheng Sean Ye 
388e4b86885SCheng Sean Ye 	default:
389e4b86885SCheng Sean Ye 		return (EINVAL);
390e4b86885SCheng Sean Ye 	}
391e4b86885SCheng Sean Ye 
392ad09f8b8SMark Johnson 	xmcp->interface_version = XEN_MCA_INTERFACE_VERSION;
393ad09f8b8SMark Johnson 	xmcp->cmd = cmd;
394e4b86885SCheng Sean Ye 
395ad09f8b8SMark Johnson 	rv = __hypercall1(__HYPERVISOR_mca, (ulong_t)xmcp);
396e4b86885SCheng Sean Ye 
397e4b86885SCheng Sean Ye 	return (rv);
398e4b86885SCheng Sean Ye }
399