summaryrefslogtreecommitdiffstats
path: root/sys/i386/xen
diff options
context:
space:
mode:
authorcperciva <cperciva@FreeBSD.org>2010-11-25 15:05:21 +0000
committercperciva <cperciva@FreeBSD.org>2010-11-25 15:05:21 +0000
commit008430e205fc0486471636b7b05c15ea15b18947 (patch)
tree66c1c0e02501ae9e643ab0f9f229ca1f15c2fc1c /sys/i386/xen
parent5f2060fdd76d0040e0acfcba8e0d18f5f2bc0859 (diff)
downloadFreeBSD-src-008430e205fc0486471636b7b05c15ea15b18947.zip
FreeBSD-src-008430e205fc0486471636b7b05c15ea15b18947.tar.gz
Rename HYPERVISOR_multicall (which performs the multicall hypercall) to
_HYPERVISOR_multicall, and create a new HYPERVISOR_multicall function which invokes _HYPERVISOR_multicall and checks that the individual hypercalls all succeeded.
Diffstat (limited to 'sys/i386/xen')
-rw-r--r--sys/i386/xen/xen_machdep.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c
index 2d46f6e..a9180fc 100644
--- a/sys/i386/xen/xen_machdep.c
+++ b/sys/i386/xen/xen_machdep.c
@@ -1177,6 +1177,27 @@ trap_info_t trap_table[] = {
{ 0, 0, 0, 0 }
};
+/* Perform a multicall and check that individual calls succeeded. */
+int
+HYPERVISOR_multicall(struct multicall_entry * call_list, int nr_calls)
+{
+ int ret = 0;
+ int i;
+
+ /* Perform the multicall. */
+ PANIC_IF(_HYPERVISOR_multicall(call_list, nr_calls));
+
+ /* Check the results of individual hypercalls. */
+ for (i = 0; i < nr_calls; i++)
+ if (unlikely(call_list[i].result < 0))
+ ret++;
+ if (unlikely(ret > 0))
+ panic("%d multicall(s) failed: cpu %d\n",
+ ret, smp_processor_id());
+
+ /* If we didn't panic already, everything succeeded. */
+ return (0);
+}
/********** CODE WORTH KEEPING ABOVE HERE *****************/
OpenPOWER on IntegriCloud