WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] linux: check hypercall return status

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] linux: check hypercall return status
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Mon, 21 Jan 2008 15:14:09 +0000
Delivery-date: Mon, 21 Jan 2008 07:14:07 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Not doing so is almost always a mistake, potentially resulting in
debugging of problems being much more difficult.

As usual, written and tested on 2.6.24-rc8 and made apply to the 2.6.18
tree without further testing.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: head-2008-01-21/arch/i386/kernel/cpu/mtrr/main-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/cpu/mtrr/main-xen.c   2008-01-21 
13:10:43.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/cpu/mtrr/main-xen.c        2008-01-21 
13:31:43.000000000 +0100
@@ -18,7 +18,8 @@ void generic_get_mtrr(unsigned int reg, 
 
        op.cmd = XENPF_read_memtype;
        op.u.read_memtype.reg = reg;
-       (void)HYPERVISOR_platform_op(&op);
+       if (unlikely(HYPERVISOR_platform_op(&op)))
+               memset(&op.u.read_memtype, 0, sizeof(op.u.read_memtype));
 
        *size = op.u.read_memtype.nr_mfns;
        *base = op.u.read_memtype.mfn;
Index: head-2008-01-21/arch/i386/kernel/fixup.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/fixup.c       2007-06-12 
13:12:48.000000000 +0200
+++ head-2008-01-21/arch/i386/kernel/fixup.c    2008-01-21 13:31:43.000000000 
+0100
@@ -46,8 +46,8 @@ fastcall void do_fixup_4gb_segment(struc
        if (current->tgid == 1)
                return;
             
-       HYPERVISOR_vm_assist(
-               VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify);
+       VOID(HYPERVISOR_vm_assist(VMASST_CMD_disable,
+                                 VMASST_TYPE_4gb_segments_notify));
 
        if (test_and_set_bit(0, &printed))
                return;
@@ -81,8 +81,8 @@ fastcall void do_fixup_4gb_segment(struc
 
 static int __init fixup_init(void)
 {
-       HYPERVISOR_vm_assist(
-               VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
+       WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+                                    VMASST_TYPE_4gb_segments_notify));
        return 0;
 }
 __initcall(fixup_init);
Index: head-2008-01-21/arch/i386/kernel/io_apic-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/io_apic-xen.c 2008-01-21 
13:30:21.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/io_apic-xen.c      2008-01-21 
13:31:43.000000000 +0100
@@ -154,7 +154,7 @@ static inline void io_apic_write(unsigne
        apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
        apic_op.reg = reg;
        apic_op.value = value;
-       HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
+       WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
 }
 
 #define io_apic_read(a,r)    xen_io_apic_read(a,r)
@@ -2425,7 +2425,7 @@ static int __init io_apic_bug_finalize(v
                struct xen_platform_op op = { .cmd = XENPF_platform_quirk };
                op.u.platform_quirk.quirk_id = sis_apic_bug ?
                        QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
-               HYPERVISOR_platform_op(&op);
+               VOID(HYPERVISOR_platform_op(&op));
        }
        return 0;
 }
Index: head-2008-01-21/arch/x86_64/kernel/io_apic-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/io_apic-xen.c       2008-01-21 
13:30:21.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/io_apic-xen.c    2008-01-21 
13:31:43.000000000 +0100
@@ -161,7 +161,7 @@ static inline void io_apic_write(unsigne
        apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
        apic_op.reg = reg;
        apic_op.value = value;
-       HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
+       WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
 }
 
 #define io_apic_read(a,r)    xen_io_apic_read(a,r)
Index: head-2008-01-21/arch/i386/kernel/ioport-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/ioport-xen.c  2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/ioport-xen.c       2008-01-21 
13:31:43.000000000 +0100
@@ -81,7 +81,8 @@ asmlinkage long sys_ioperm(unsigned long
 
                set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
                set_iobitmap.nr_ports = IO_BITMAP_BITS;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+               WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+                                             &set_iobitmap));
        }
 
        set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
Index: head-2008-01-21/arch/x86_64/kernel/ioport-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/ioport-xen.c        2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/ioport-xen.c     2008-01-21 
13:31:43.000000000 +0100
@@ -60,7 +60,8 @@ asmlinkage long sys_ioperm(unsigned long
 
                set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
                set_iobitmap.nr_ports = IO_BITMAP_BITS;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+               WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+                                             &set_iobitmap));
        }
 
        set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
@@ -92,7 +93,7 @@ asmlinkage long sys_iopl(unsigned int ne
 
        /* Force the change at ring 0. */
        set_iopl.iopl = (new_iopl == 0) ? 1 : new_iopl;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+       WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
 
        return 0;
 }
Index: head-2008-01-21/arch/i386/kernel/process-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/process-xen.c 2008-01-21 
13:29:49.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/process-xen.c      2008-01-21 
13:31:43.000000000 +0100
@@ -139,8 +139,7 @@ static inline void play_dead(void)
        idle_task_exit();
        local_irq_disable();
        cpu_clear(smp_processor_id(), cpu_initialized);
-       preempt_enable_no_resched();
-       HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+       xen_halt();
        cpu_bringup();
 }
 #else
@@ -356,7 +355,8 @@ void exit_thread(void)
                struct thread_struct *t = &tsk->thread;
                struct physdev_set_iobitmap set_iobitmap;
                memset(&set_iobitmap, 0, sizeof(set_iobitmap));
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+               WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+                                             &set_iobitmap));
                kfree(t->io_bitmap_ptr);
                t->io_bitmap_ptr = NULL;
                clear_thread_flag(TIF_IO_BITMAP);
@@ -670,7 +670,9 @@ struct task_struct fastcall * __switch_t
                mcl++;
        }
 
-       (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
+       BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
+       if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
+               BUG();
 
        /*
         * Restore %fs and %gs if needed.
Index: head-2008-01-21/arch/x86_64/kernel/process-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/process-xen.c       2008-01-21 
13:29:49.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/process-xen.c    2008-01-21 
13:31:43.000000000 +0100
@@ -144,8 +144,7 @@ static inline void play_dead(void)
        idle_task_exit();
        local_irq_disable();
        cpu_clear(smp_processor_id(), cpu_initialized);
-       preempt_enable_no_resched();
-       HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+       xen_halt();
        cpu_bringup();
 }
 #else
@@ -349,7 +348,8 @@ void exit_thread(void)
                put_cpu();
 #endif
 #ifdef CONFIG_XEN
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &iobmp_op);
+               WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+                                             &iobmp_op));
 #endif
                t->io_bitmap_max = 0;
        }
@@ -357,7 +357,7 @@ void exit_thread(void)
 
 void load_gs_index(unsigned gs)
 {
-       HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs);
+       WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs));
 }
 
 void flush_thread(void)
@@ -608,7 +608,10 @@ __switch_to(struct task_struct *prev_p, 
                mcl++;
        }
 
-       (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
+       BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
+       if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
+               BUG();
+
        /* 
         * Switch DS and ES.
         * This won't pick up thread selector changes, but I guess that is ok.
@@ -626,13 +629,13 @@ __switch_to(struct task_struct *prev_p, 
                loadsegment(fs, next->fsindex);
 
        if (next->fs)
-               HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs); 
+               WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs));
        
        if (unlikely(next->gsindex))
                load_gs_index(next->gsindex);
 
        if (next->gs)
-               HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs); 
+               WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs));
 
        /* 
         * Switch the PDA context.
Index: head-2008-01-21/arch/i386/kernel/quirks-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/quirks-xen.c  2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/quirks-xen.c       2008-01-21 
13:31:43.000000000 +0100
@@ -33,7 +33,7 @@ static void __devinit quirk_intel_irqbal
                printk(KERN_INFO "Disabling irq balancing and affinity\n");
                op.cmd = XENPF_platform_quirk;
                op.u.platform_quirk.quirk_id = QUIRK_NOIRQBALANCING;
-               (void)HYPERVISOR_platform_op(&op);
+               WARN_ON(HYPERVISOR_platform_op(&op));
        }
 
        /* put back the original value for config space*/
Index: head-2008-01-21/arch/x86_64/kernel/setup64-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/setup64-xen.c       2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/setup64-xen.c    2008-01-21 
13:31:43.000000000 +0100
@@ -176,7 +176,9 @@ void pda_init(int cpu)
 #ifndef CONFIG_XEN
        wrmsrl(MSR_GS_BASE, pda);
 #else
-       HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL, (unsigned long)pda);
+       if (HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL,
+                                       (unsigned long)pda))
+               BUG();
 #endif
        pda->cpunumber = cpu; 
        pda->irqcount = -1;
Index: head-2008-01-21/arch/i386/kernel/setup-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/setup-xen.c   2007-12-11 
11:44:33.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/setup-xen.c        2008-01-21 
13:31:43.000000000 +0100
@@ -1598,9 +1598,10 @@ void __init setup_arch(char **cmdline_p)
        /* Register a call for panic conditions. */
        atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
 
-       HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
-       HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                            VMASST_TYPE_writable_pagetables);
+       WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+                                    VMASST_TYPE_4gb_segments));
+       WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+                                    VMASST_TYPE_writable_pagetables));
 
        memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
        early_cpu_init();
@@ -1828,7 +1829,7 @@ void __init setup_arch(char **cmdline_p)
                efi_map_memmap();
 
        set_iopl.iopl = 1;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+       WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
 
 #ifdef CONFIG_ACPI
        if (!is_initial_xendomain()) {
Index: head-2008-01-21/arch/x86_64/kernel/setup-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/setup-xen.c 2007-12-11 
11:44:33.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/setup-xen.c      2008-01-21 
13:31:43.000000000 +0100
@@ -346,8 +346,8 @@ void __init setup_arch(char **cmdline_p)
 
        copy_edid();
 
-       HYPERVISOR_vm_assist(VMASST_CMD_enable,
-                            VMASST_TYPE_writable_pagetables);
+       WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+                                    VMASST_TYPE_writable_pagetables));
 
        ARCH_SETUP
 #else
@@ -684,7 +684,7 @@ void __init setup_arch(char **cmdline_p)
                struct physdev_set_iopl set_iopl;
 
                set_iopl.iopl = 1;
-               HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+               WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
 
                if (is_initial_xendomain()) {
 #ifdef CONFIG_VT
Index: head-2008-01-21/arch/i386/kernel/time-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/time-xen.c    2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/time-xen.c 2008-01-21 13:31:43.000000000 
+0100
@@ -504,7 +504,7 @@ static void sync_xen_wallclock(unsigned 
        op.u.settime.secs        = sec;
        op.u.settime.nsecs       = nsec;
        op.u.settime.system_time = processed_system_time;
-       HYPERVISOR_platform_op(&op);
+       WARN_ON(HYPERVISOR_platform_op(&op));
 
        update_wallclock();
 
@@ -914,8 +914,16 @@ void __init time_init(void)
        }
 #endif
 
-       HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
-                          &xen_set_periodic_tick);
+       switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
+                                  &xen_set_periodic_tick)) {
+       case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+       case -ENOSYS:
+#endif
+               break;
+       default:
+               BUG();
+       }
 
        get_time_values_from_xen(0);
 
@@ -1020,7 +1028,7 @@ EXPORT_SYMBOL(xen_safe_halt);
 void halt(void)
 {
        if (irqs_disabled())
-               HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+               VOID(HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL));
 }
 EXPORT_SYMBOL(halt);
 
@@ -1032,8 +1040,16 @@ void time_resume(void)
        init_cpu_khz();
 
        for_each_online_cpu(cpu) {
-               HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-                                  &xen_set_periodic_tick);
+               switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
+                                          &xen_set_periodic_tick)) {
+               case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+               case -ENOSYS:
+#endif
+                       break;
+               default:
+                       BUG();
+               }
                get_time_values_from_xen(cpu);
                per_cpu(processed_system_time, cpu) =
                        per_cpu(shadow_time, 0).system_timestamp;
@@ -1054,8 +1070,16 @@ int __cpuinit local_setup_timer(unsigned
 
        BUG_ON(cpu == 0);
 
-       HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-                          &xen_set_periodic_tick);
+       switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
+                          &xen_set_periodic_tick)) {
+       case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+       case -ENOSYS:
+#endif
+               break;
+       default:
+               BUG();
+       }
 
        do {
                seq = read_seqbegin(&xtime_lock);
@@ -1103,7 +1127,7 @@ static int time_cpufreq_notifier(struct 
        op.u.change_freq.flags = 0;
        op.u.change_freq.cpu = freq->cpu;
        op.u.change_freq.freq = (u64)freq->new * 1000;
-       HYPERVISOR_platform_op(&op);
+       WARN_ON(HYPERVISOR_platform_op(&op));
 
        return 0;
 }
Index: head-2008-01-21/arch/i386/kernel/traps-xen.c
===================================================================
--- head-2008-01-21.orig/arch/i386/kernel/traps-xen.c   2008-01-21 
13:30:30.000000000 +0100
+++ head-2008-01-21/arch/i386/kernel/traps-xen.c        2008-01-21 
13:31:43.000000000 +0100
@@ -1166,7 +1166,11 @@ static __cpuinitdata trap_info_t trap_ta
 
 void __init trap_init(void)
 {
-       HYPERVISOR_set_trap_table(trap_table);
+       int ret;
+
+       ret = HYPERVISOR_set_trap_table(trap_table);
+       if (ret)
+               printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
 
        if (cpu_has_fxsr) {
                /*
Index: head-2008-01-21/arch/x86_64/kernel/traps-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/kernel/traps-xen.c 2008-01-21 
13:30:30.000000000 +0100
+++ head-2008-01-21/arch/x86_64/kernel/traps-xen.c      2008-01-21 
13:31:43.000000000 +0100
@@ -1193,10 +1193,8 @@ void __init trap_init(void)
         int ret;
 
         ret = HYPERVISOR_set_trap_table(trap_table);
-        
         if (ret) 
-                printk("HYPERVISOR_set_trap_table faild: error %d\n",
-                       ret);
+               printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
 
        /*
         * Should be a barrier for any external CPU state.
Index: head-2008-01-21/arch/x86_64/mm/init-xen.c
===================================================================
--- head-2008-01-21.orig/arch/x86_64/mm/init-xen.c      2008-01-21 
13:30:30.000000000 +0100
+++ head-2008-01-21/arch/x86_64/mm/init-xen.c   2008-01-21 13:31:43.000000000 
+0100
@@ -641,7 +641,8 @@ static void __init extend_init_mapping(u
 
        /* Kill mapping of low 1MB. */
        while (va < (unsigned long)&_text) {
-               HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
+               if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+                       BUG();
                va += PAGE_SIZE;
        }
 
@@ -674,7 +675,8 @@ static void __init extend_init_mapping(u
                pmd = (pmd_t *)&page[pmd_index(va)];
                if (pmd_none(*pmd))
                        break;
-               HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
+               if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+                       BUG();
                va += PAGE_SIZE;
        }
 }
@@ -727,8 +729,8 @@ static void __init xen_finish_init_mappi
        start = PAGE_ALIGN((unsigned long)_end);
        end   = __START_KERNEL_map + (table_end << PAGE_SHIFT);
        for (; start < end; start += PAGE_SIZE)
-               WARN_ON(HYPERVISOR_update_va_mapping(
-                       start, __pte_ma(0), 0));
+               if (HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0))
+                       BUG();
 
        /* Allocate pte's for initial fixmaps from 'start_pfn' allocator. */
        table_end = ~0UL;
Index: head-2008-01-21/arch/i386/oprofile/xenoprof.c
===================================================================
--- head-2008-01-21.orig/arch/i386/oprofile/xenoprof.c  2007-06-12 
13:12:49.000000000 +0200
+++ head-2008-01-21/arch/i386/oprofile/xenoprof.c       2008-01-21 
13:31:43.000000000 +0100
@@ -52,8 +52,8 @@ void xenoprof_arch_counter(void)
                counter.kernel    = (uint32_t)counter_config[i].kernel;
                counter.user      = (uint32_t)counter_config[i].user;
                counter.unit_mask = (uint64_t)counter_config[i].unit_mask;
-               HYPERVISOR_xenoprof_op(XENOPROF_counter, 
-                                      &counter);
+               WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_counter,
+                                              &counter));
        }
 }
 
Index: head-2008-01-21/drivers/xen/core/evtchn.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/core/evtchn.c      2008-01-21 
13:10:16.000000000 +0100
+++ head-2008-01-21/drivers/xen/core/evtchn.c   2008-01-21 13:31:43.000000000 
+0100
@@ -215,7 +215,7 @@ static inline void exit_idle(void) {}
  */
 void force_evtchn_callback(void)
 {
-       (void)HYPERVISOR_xen_version(0, NULL);
+       VOID(HYPERVISOR_xen_version(0, NULL));
 }
 /* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
 EXPORT_SYMBOL(force_evtchn_callback);
@@ -741,14 +741,15 @@ static inline void pirq_unmask_notify(in
 {
        struct physdev_eoi eoi = { .irq = pirq };
        if (unlikely(test_bit(pirq, pirq_needs_eoi)))
-               (void)HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi);
+               VOID(HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi));
 }
 
 static inline void pirq_query_unmask(int pirq)
 {
        struct physdev_irq_status_query irq_status;
        irq_status.irq = pirq;
-       (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
+       if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
+               irq_status.flags = 0;
        clear_bit(pirq, pirq_needs_eoi);
        if (irq_status.flags & XENIRQSTAT_needs_eoi)
                set_bit(pirq, pirq_needs_eoi);
@@ -868,7 +869,8 @@ int irq_ignore_unhandled(unsigned int ir
        if (!is_running_on_xen())
                return 0;
 
-       (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
+       if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
+               return 0;
        return !!(irq_status.flags & XENIRQSTAT_shared);
 }
 
@@ -905,7 +907,7 @@ void unmask_evtchn(int port)
        /* Slow path (hypercall) if this is a non-local port. */
        if (unlikely(cpu != cpu_from_evtchn(port))) {
                struct evtchn_unmask unmask = { .port = port };
-               (void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
+               VOID(HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask));
                return;
        }
 
Index: head-2008-01-21/drivers/xen/core/machine_kexec.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/core/machine_kexec.c       2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/drivers/xen/core/machine_kexec.c    2008-01-21 
13:31:43.000000000 +0100
@@ -155,7 +155,7 @@ void xen_machine_kexec_unload(struct kim
 
        memset(&xkl, 0, sizeof(xkl));
        xkl.type = image->type;
-       HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl);
+       WARN_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl));
 }
 
 /*
@@ -172,7 +172,7 @@ NORET_TYPE void machine_kexec(struct kim
 
        memset(&xke, 0, sizeof(xke));
        xke.type = image->type;
-       HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke);
+       VOID(HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke));
        panic("KEXEC_CMD_kexec hypercall should not return\n");
 }
 
Index: head-2008-01-21/drivers/xen/core/machine_reboot.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/core/machine_reboot.c      2007-12-18 
11:39:35.000000000 +0100
+++ head-2008-01-21/drivers/xen/core/machine_reboot.c   2008-01-21 
13:31:43.000000000 +0100
@@ -61,8 +61,8 @@ EXPORT_SYMBOL(machine_power_off);
 static void pre_suspend(void)
 {
        HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-       HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-                                    __pte_ma(0), 0);
+       WARN_ON(HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
+                                            __pte_ma(0), 0));
 
        xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
        xen_start_info->console.domU.mfn =
@@ -89,8 +89,10 @@ static void post_suspend(int suspend_can
        }
 
        shinfo_mfn = xen_start_info->shared_info >> PAGE_SHIFT;
-       HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-                                    pfn_pte_ma(shinfo_mfn, PAGE_KERNEL), 0);
+       if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
+                                        pfn_pte_ma(shinfo_mfn, PAGE_KERNEL),
+                                        0))
+               BUG();
        HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
 
        memset(empty_zero_page, 0, PAGE_SIZE);
Index: head-2008-01-21/drivers/xen/netback/netback.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/netback/netback.c  2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/drivers/xen/netback/netback.c       2008-01-21 
13:31:43.000000000 +0100
@@ -142,14 +142,16 @@ static int check_mfn(int nr)
                .extent_order = 0,
                .domid        = DOMID_SELF
        };
+       int rc;
 
        if (likely(alloc_index >= nr))
                return 0;
 
        set_xen_guest_handle(reservation.extent_start, mfn_list + alloc_index);
        reservation.nr_extents = MAX_MFN_ALLOC - alloc_index;
-       alloc_index += HYPERVISOR_memory_op(XENMEM_increase_reservation,
-                                           &reservation);
+       rc = HYPERVISOR_memory_op(XENMEM_increase_reservation, &reservation);
+       if (likely(rc > 0))
+               alloc_index += rc;
 
        return alloc_index >= nr ? 0 : -ENOMEM;
 }
@@ -349,7 +351,7 @@ int xen_network_done(void)
 
 struct netrx_pending_operations {
        unsigned trans_prod, trans_cons;
-       unsigned mmu_prod, mmu_cons;
+       unsigned mmu_prod, mmu_mcl;
        unsigned mcl_prod, mcl_cons;
        unsigned copy_prod, copy_cons;
        unsigned meta_prod, meta_cons;
@@ -605,8 +607,12 @@ static void net_rx_action(unsigned long 
                        break;
        }
 
-       if (npo.mcl_prod &&
-           !xen_feature(XENFEAT_auto_translated_physmap)) {
+       BUG_ON(npo.meta_prod > ARRAY_SIZE(meta));
+
+       npo.mmu_mcl = npo.mcl_prod;
+       if (npo.mcl_prod) {
+               BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap));
+               BUG_ON(npo.mmu_prod > ARRAY_SIZE(rx_mmu));
                mcl = npo.mcl + npo.mcl_prod++;
 
                BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
@@ -620,6 +626,7 @@ static void net_rx_action(unsigned long 
        }
 
        if (npo.trans_prod) {
+               BUG_ON(npo.trans_prod > ARRAY_SIZE(grant_trans_op));
                mcl = npo.mcl + npo.mcl_prod++;
                mcl->op = __HYPERVISOR_grant_table_op;
                mcl->args[0] = GNTTABOP_transfer;
@@ -628,6 +635,7 @@ static void net_rx_action(unsigned long 
        }
 
        if (npo.copy_prod) {
+               BUG_ON(npo.copy_prod > ARRAY_SIZE(grant_copy_op));
                mcl = npo.mcl + npo.mcl_prod++;
                mcl->op = __HYPERVISOR_grant_table_op;
                mcl->args[0] = GNTTABOP_copy;
@@ -639,14 +647,12 @@ static void net_rx_action(unsigned long 
        if (!npo.mcl_prod)
                return;
 
-       BUG_ON(npo.copy_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.mmu_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.trans_prod > NET_RX_RING_SIZE);
-       BUG_ON(npo.mcl_prod > NET_RX_RING_SIZE+3);
-       BUG_ON(npo.meta_prod > NET_RX_RING_SIZE);
+       BUG_ON(npo.mcl_prod > ARRAY_SIZE(rx_mcl));
 
        ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
        BUG_ON(ret != 0);
+       /* The mmu_machphys_update() must not fail. */
+       BUG_ON(npo.mmu_mcl && npo.mcl[npo.mmu_mcl].result != 0);
 
        while ((skb = __skb_dequeue(&rxq)) != NULL) {
                nr_frags = *(int *)skb->cb;
Index: head-2008-01-21/drivers/xen/netfront/netfront.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/netfront/netfront.c        2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/drivers/xen/netfront/netfront.c     2008-01-21 
13:31:43.000000000 +0100
@@ -840,11 +840,14 @@ no_skb:
 
                        /* Zap PTEs and give away pages in one big
                         * multicall. */
-                       (void)HYPERVISOR_multicall(np->rx_mcl, i+1);
+                       if (unlikely(HYPERVISOR_multicall(np->rx_mcl, i+1)))
+                               BUG();
 
                        /* Check return status of HYPERVISOR_memory_op(). */
                        if (unlikely(np->rx_mcl[i].result != i))
                                panic("Unable to reduce memory reservation\n");
+                       while (i--)
+                               BUG_ON(np->rx_mcl[i].result);
                } else {
                        if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
                                                 &reservation) != i)
@@ -1446,8 +1449,10 @@ err:     
                        mcl->args[1] = pages_flipped;
                        mcl->args[2] = 0;
                        mcl->args[3] = DOMID_SELF;
-                       (void)HYPERVISOR_multicall(np->rx_mcl,
-                                                  pages_flipped + 1);
+                       err = HYPERVISOR_multicall_check(np->rx_mcl,
+                                                        pages_flipped + 1,
+                                                        NULL);
+                       BUG_ON(err);
                }
        }
 
Index: head-2008-01-21/drivers/xen/xenoprof/xenoprofile.c
===================================================================
--- head-2008-01-21.orig/drivers/xen/xenoprof/xenoprofile.c     2008-01-21 
13:10:27.000000000 +0100
+++ head-2008-01-21/drivers/xen/xenoprof/xenoprofile.c  2008-01-21 
13:31:43.000000000 +0100
@@ -346,10 +346,11 @@ static void xenoprof_shutdown(void)
 {
        xenoprof_enabled = 0;
 
-       HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL);
+       WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL));
 
        if (xenoprof_is_primary) {
-               HYPERVISOR_xenoprof_op(XENOPROF_release_counters, NULL);
+               WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_release_counters,
+                                              NULL));
                active_defined = 0;
        }
 
@@ -376,7 +377,7 @@ static int xenoprof_start(void)
 static void xenoprof_stop(void)
 {
        if (xenoprof_is_primary)
-               HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL);
+               WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL));
        xenoprof_arch_stop();
 }
 
@@ -419,7 +420,8 @@ static int xenoprof_set_active(int * act
 
 out:
        if (ret)
-               HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
+               WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list,
+                                              NULL));
        active_defined = !ret;
        return ret;
 }
@@ -539,6 +541,6 @@ void xenoprofile_exit(void)
        xenoprof_arch_unmap_shared_buffer(&shared_buffer);
        if (xenoprof_is_primary) {
                unmap_passive_list();
-               HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL);
+               WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL));
         }
 }
Index: head-2008-01-21/include/asm-i386/mach-xen/asm/desc.h
===================================================================
--- head-2008-01-21.orig/include/asm-i386/mach-xen/asm/desc.h   2008-01-21 
13:10:27.000000000 +0100
+++ head-2008-01-21/include/asm-i386/mach-xen/asm/desc.h        2008-01-21 
13:31:43.000000000 +0100
@@ -100,7 +100,9 @@ extern int write_ldt_entry(void *ldt,
 
 static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
 {
-#define C(i) 
HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN
 + i]), *(u64 *)&t->tls_array[i])
+#define C(i) if 
(HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN
 + i]), \
+                                              *(u64 *)&t->tls_array[i])) \
+               BUG();
        C(0); C(1); C(2);
 #undef C
 }
Index: head-2008-01-21/include/asm-x86_64/mach-xen/asm/desc.h
===================================================================
--- head-2008-01-21.orig/include/asm-x86_64/mach-xen/asm/desc.h 2008-01-21 
13:13:02.000000000 +0100
+++ head-2008-01-21/include/asm-x86_64/mach-xen/asm/desc.h      2008-01-21 
13:31:43.000000000 +0100
@@ -220,7 +220,9 @@ static inline void load_TLS(struct threa
        gdt[2] = t->tls_array[2];
 #endif
 #define C(i) \
-       
HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + 
i]), t->tls_array[i])
+       if 
(HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + 
i]), \
+                                                t->tls_array[i])) \
+               BUG();
 
        C(0); C(1); C(2);
 #undef C
Index: head-2008-01-21/include/asm-i386/mach-xen/asm/hypercall.h
===================================================================
--- head-2008-01-21.orig/include/asm-i386/mach-xen/asm/hypercall.h      
2008-01-21 11:15:26.000000000 +0100
+++ head-2008-01-21/include/asm-i386/mach-xen/asm/hypercall.h   2008-01-21 
13:31:43.000000000 +0100
@@ -123,14 +123,14 @@
        (type)__res;                                            \
 })
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_trap_table(
        const trap_info_t *table)
 {
        return _hypercall1(int, set_trap_table, table);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_mmu_update(
        mmu_update_t *req, unsigned int count, unsigned int *success_count,
        domid_t domid)
@@ -138,7 +138,7 @@ HYPERVISOR_mmu_update(
        return _hypercall4(int, mmu_update, req, count, success_count, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_mmuext_op(
        struct mmuext_op *op, unsigned int count, unsigned int *success_count,
        domid_t domid)
@@ -146,21 +146,21 @@ HYPERVISOR_mmuext_op(
        return _hypercall4(int, mmuext_op, op, count, success_count, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_gdt(
        unsigned long *frame_list, unsigned int entries)
 {
        return _hypercall2(int, set_gdt, frame_list, entries);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_stack_switch(
        unsigned long ss, unsigned long esp)
 {
        return _hypercall2(int, stack_switch, ss, esp);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_callbacks(
        unsigned long event_selector, unsigned long event_address,
        unsigned long failsafe_selector, unsigned long failsafe_address)
@@ -177,21 +177,21 @@ HYPERVISOR_fpu_taskswitch(
        return _hypercall1(int, fpu_taskswitch, set);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_sched_op_compat(
        int cmd, unsigned long arg)
 {
        return _hypercall2(int, sched_op_compat, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_sched_op(
        int cmd, void *arg)
 {
        return _hypercall2(int, sched_op, cmd, arg);
 }
 
-static inline long
+static inline long __must_check
 HYPERVISOR_set_timer_op(
        u64 timeout)
 {
@@ -200,7 +200,7 @@ HYPERVISOR_set_timer_op(
        return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_platform_op(
        struct xen_platform_op *platform_op)
 {
@@ -208,42 +208,42 @@ HYPERVISOR_platform_op(
        return _hypercall1(int, platform_op, platform_op);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_debugreg(
        unsigned int reg, unsigned long value)
 {
        return _hypercall2(int, set_debugreg, reg, value);
 }
 
-static inline unsigned long
+static inline unsigned long __must_check
 HYPERVISOR_get_debugreg(
        unsigned int reg)
 {
        return _hypercall1(unsigned long, get_debugreg, reg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_descriptor(
        u64 ma, u64 desc)
 {
        return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_memory_op(
        unsigned int cmd, void *arg)
 {
        return _hypercall2(int, memory_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_multicall(
        multicall_entry_t *call_list, unsigned int nr_calls)
 {
        return _hypercall2(int, multicall, call_list, nr_calls);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_va_mapping(
        unsigned long va, pte_t new_val, unsigned long flags)
 {
@@ -255,7 +255,7 @@ HYPERVISOR_update_va_mapping(
                           new_val.pte_low, pte_hi, flags);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_event_channel_op(
        int cmd, void *arg)
 {
@@ -274,28 +274,28 @@ HYPERVISOR_event_channel_op(
        return rc;
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_acm_op(
        int cmd, void *arg)
 {
        return _hypercall2(int, acm_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_xen_version(
        int cmd, void *arg)
 {
        return _hypercall2(int, xen_version, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_console_io(
        int cmd, unsigned int count, char *str)
 {
        return _hypercall3(int, console_io, cmd, count, str);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_physdev_op(
        int cmd, void *arg)
 {
@@ -314,14 +314,14 @@ HYPERVISOR_physdev_op(
        return rc;
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_grant_table_op(
        unsigned int cmd, void *uop, unsigned int count)
 {
        return _hypercall3(int, grant_table_op, cmd, uop, count);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_va_mapping_otherdomain(
        unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
 {
@@ -333,21 +333,21 @@ HYPERVISOR_update_va_mapping_otherdomain
                           new_val.pte_low, pte_hi, flags, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_vm_assist(
        unsigned int cmd, unsigned int type)
 {
        return _hypercall2(int, vm_assist, cmd, type);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_vcpu_op(
        int cmd, unsigned int vcpuid, void *extra_args)
 {
        return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_suspend(
        unsigned long srec)
 {
@@ -367,15 +367,17 @@ HYPERVISOR_suspend(
        return rc;
 }
 
+#if CONFIG_XEN_COMPAT <= 0x030002
 static inline int
 HYPERVISOR_nmi_op(
        unsigned long op, void *arg)
 {
        return _hypercall2(int, nmi_op, op, arg);
 }
+#endif
 
 #ifndef CONFIG_XEN
-static inline unsigned long
+static inline unsigned long __must_check
 HYPERVISOR_hvm_op(
     int op, void *arg)
 {
@@ -383,21 +385,21 @@ HYPERVISOR_hvm_op(
 }
 #endif
 
-static inline int
+static inline int __must_check
 HYPERVISOR_callback_op(
        int cmd, const void *arg)
 {
        return _hypercall2(int, callback_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_xenoprof_op(
        int op, void *arg)
 {
        return _hypercall2(int, xenoprof_op, op, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_kexec_op(
        unsigned long op, void *args)
 {
Index: head-2008-01-21/include/asm-x86_64/mach-xen/asm/hypercall.h
===================================================================
--- head-2008-01-21.orig/include/asm-x86_64/mach-xen/asm/hypercall.h    
2008-01-21 11:15:27.000000000 +0100
+++ head-2008-01-21/include/asm-x86_64/mach-xen/asm/hypercall.h 2008-01-21 
13:31:43.000000000 +0100
@@ -129,14 +129,14 @@
        (type)__res;                                            \
 })
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_trap_table(
        const trap_info_t *table)
 {
        return _hypercall1(int, set_trap_table, table);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_mmu_update(
        mmu_update_t *req, unsigned int count, unsigned int *success_count,
        domid_t domid)
@@ -144,7 +144,7 @@ HYPERVISOR_mmu_update(
        return _hypercall4(int, mmu_update, req, count, success_count, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_mmuext_op(
        struct mmuext_op *op, unsigned int count, unsigned int *success_count,
        domid_t domid)
@@ -152,21 +152,21 @@ HYPERVISOR_mmuext_op(
        return _hypercall4(int, mmuext_op, op, count, success_count, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_gdt(
        unsigned long *frame_list, unsigned int entries)
 {
        return _hypercall2(int, set_gdt, frame_list, entries);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_stack_switch(
        unsigned long ss, unsigned long esp)
 {
        return _hypercall2(int, stack_switch, ss, esp);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_callbacks(
        unsigned long event_address, unsigned long failsafe_address, 
        unsigned long syscall_address)
@@ -182,28 +182,28 @@ HYPERVISOR_fpu_taskswitch(
        return _hypercall1(int, fpu_taskswitch, set);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_sched_op_compat(
        int cmd, unsigned long arg)
 {
        return _hypercall2(int, sched_op_compat, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_sched_op(
        int cmd, void *arg)
 {
        return _hypercall2(int, sched_op, cmd, arg);
 }
 
-static inline long
+static inline long __must_check
 HYPERVISOR_set_timer_op(
        u64 timeout)
 {
        return _hypercall1(long, set_timer_op, timeout);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_platform_op(
        struct xen_platform_op *platform_op)
 {
@@ -211,49 +211,49 @@ HYPERVISOR_platform_op(
        return _hypercall1(int, platform_op, platform_op);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_debugreg(
        unsigned int reg, unsigned long value)
 {
        return _hypercall2(int, set_debugreg, reg, value);
 }
 
-static inline unsigned long
+static inline unsigned long __must_check
 HYPERVISOR_get_debugreg(
        unsigned int reg)
 {
        return _hypercall1(unsigned long, get_debugreg, reg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_descriptor(
        unsigned long ma, unsigned long word)
 {
        return _hypercall2(int, update_descriptor, ma, word);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_memory_op(
        unsigned int cmd, void *arg)
 {
        return _hypercall2(int, memory_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_multicall(
        multicall_entry_t *call_list, unsigned int nr_calls)
 {
        return _hypercall2(int, multicall, call_list, nr_calls);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_va_mapping(
        unsigned long va, pte_t new_val, unsigned long flags)
 {
        return _hypercall3(int, update_va_mapping, va, new_val.pte, flags);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_event_channel_op(
        int cmd, void *arg)
 {
@@ -272,28 +272,28 @@ HYPERVISOR_event_channel_op(
        return rc;
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_acm_op(
        int cmd, void *arg)
 {
        return _hypercall2(int, acm_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_xen_version(
        int cmd, void *arg)
 {
        return _hypercall2(int, xen_version, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_console_io(
        int cmd, unsigned int count, char *str)
 {
        return _hypercall3(int, console_io, cmd, count, str);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_physdev_op(
        int cmd, void *arg)
 {
@@ -312,14 +312,14 @@ HYPERVISOR_physdev_op(
        return rc;
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_grant_table_op(
        unsigned int cmd, void *uop, unsigned int count)
 {
        return _hypercall3(int, grant_table_op, cmd, uop, count);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_update_va_mapping_otherdomain(
        unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
 {
@@ -327,28 +327,28 @@ HYPERVISOR_update_va_mapping_otherdomain
                           new_val.pte, flags, domid);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_vm_assist(
        unsigned int cmd, unsigned int type)
 {
        return _hypercall2(int, vm_assist, cmd, type);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_vcpu_op(
        int cmd, unsigned int vcpuid, void *extra_args)
 {
        return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_set_segment_base(
        int reg, unsigned long value)
 {
        return _hypercall2(int, set_segment_base, reg, value);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_suspend(
        unsigned long srec)
 {
@@ -368,15 +368,17 @@ HYPERVISOR_suspend(
        return rc;
 }
 
+#if CONFIG_XEN_COMPAT <= 0x030002
 static inline int
 HYPERVISOR_nmi_op(
        unsigned long op, void *arg)
 {
        return _hypercall2(int, nmi_op, op, arg);
 }
+#endif
 
 #ifndef CONFIG_XEN
-static inline unsigned long
+static inline unsigned long __must_check
 HYPERVISOR_hvm_op(
     int op, void *arg)
 {
@@ -384,21 +386,21 @@ HYPERVISOR_hvm_op(
 }
 #endif
 
-static inline int
+static inline int __must_check
 HYPERVISOR_callback_op(
        int cmd, const void *arg)
 {
        return _hypercall2(int, callback_op, cmd, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_xenoprof_op(
        int op, void *arg)
 {
        return _hypercall2(int, xenoprof_op, op, arg);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_kexec_op(
        unsigned long op, void *args)
 {
Index: head-2008-01-21/include/asm-i386/mach-xen/asm/hypervisor.h
===================================================================
--- head-2008-01-21.orig/include/asm-i386/mach-xen/asm/hypervisor.h     
2008-01-21 13:07:09.000000000 +0100
+++ head-2008-01-21/include/asm-i386/mach-xen/asm/hypervisor.h  2008-01-21 
13:31:43.000000000 +0100
@@ -166,7 +166,7 @@ HYPERVISOR_block(
        return rc;
 }
 
-static inline int
+static inline void __noreturn
 HYPERVISOR_shutdown(
        unsigned int reason)
 {
@@ -174,17 +174,16 @@ HYPERVISOR_shutdown(
                .reason = reason
        };
 
-       int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
-
+       VOID(HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown));
 #if CONFIG_XEN_COMPAT <= 0x030002
-       if (rc == -ENOSYS)
-               rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
+       VOID(HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason));
 #endif
-
-       return rc;
+       /* Don't recurse needlessly. */
+       BUG_ON(reason != SHUTDOWN_crash);
+       for(;;);
 }
 
-static inline int
+static inline int __must_check
 HYPERVISOR_poll(
        evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
 {
Index: head-2008-01-21/include/asm-i386/mach-xen/asm/processor.h
===================================================================
--- head-2008-01-21.orig/include/asm-i386/mach-xen/asm/processor.h      
2008-01-21 13:13:02.000000000 +0100
+++ head-2008-01-21/include/asm-i386/mach-xen/asm/processor.h   2008-01-21 
13:31:43.000000000 +0100
@@ -516,8 +516,10 @@ static inline void __load_esp0(struct t
 #define load_esp0(tss, thread) \
        __load_esp0(tss, thread)
 #else
-#define load_esp0(tss, thread) \
-       HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)
+#define load_esp0(tss, thread) do { \
+       if (HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)) \
+               BUG(); \
+} while (0)
 #endif
 
 #define start_thread(regs, new_eip, new_esp) do {              \
@@ -528,7 +530,7 @@ static inline void __load_esp0(struct t
 #define get_debugreg(var, register)                            \
                (var) = HYPERVISOR_get_debugreg((register))
 #define set_debugreg(value, register)                  \
-               HYPERVISOR_set_debugreg((register), (value))
+               WARN_ON(HYPERVISOR_set_debugreg((register), (value)))
 
 /*
  * Set IOPL bits in EFLAGS from given mask
@@ -540,7 +542,7 @@ static inline void set_iopl_mask(uns
 
        /* Force the change at ring 0. */
        set_iopl.iopl = (mask == 0) ? 1 : (mask >> 12) & 3;
-       HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+       WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
 }
 
 /* Forward declaration, a strange C thing */
Index: head-2008-01-21/include/asm-x86_64/mach-xen/asm/processor.h
===================================================================
--- head-2008-01-21.orig/include/asm-x86_64/mach-xen/asm/processor.h    
2008-01-21 13:13:02.000000000 +0100
+++ head-2008-01-21/include/asm-x86_64/mach-xen/asm/processor.h 2008-01-21 
13:31:43.000000000 +0100
@@ -284,8 +284,10 @@ struct thread_struct {
 
 #define get_debugreg(var, register)                            \
        var = HYPERVISOR_get_debugreg(register)
-#define set_debugreg(value, register)                  \
-       HYPERVISOR_set_debugreg(register, value)
+#define set_debugreg(value, register) do {                     \
+       if (HYPERVISOR_set_debugreg(register, value))           \
+               BUG();                                          \
+} while (0)
 
 struct task_struct;
 struct mm_struct;
Index: head-2008-01-21/include/xen/evtchn.h
===================================================================
--- head-2008-01-21.orig/include/xen/evtchn.h   2008-01-21 13:01:17.000000000 
+0100
+++ head-2008-01-21/include/xen/evtchn.h        2008-01-21 13:31:43.000000000 
+0100
@@ -126,7 +126,7 @@ static inline void clear_evtchn(int port
 static inline void notify_remote_via_evtchn(int port)
 {
        struct evtchn_send send = { .port = port };
-       (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
+       VOID(HYPERVISOR_event_channel_op(EVTCHNOP_send, &send));
 }
 
 /*
Index: head-2008-01-21/include/xen/hypercall.h
===================================================================
--- head-2008-01-21.orig/include/xen/hypercall.h        2008-01-21 
11:15:27.000000000 +0100
+++ head-2008-01-21/include/xen/hypercall.h     2008-01-21 13:31:43.000000000 
+0100
@@ -3,7 +3,7 @@
 
 #include <asm/hypercall.h>
 
-static inline int
+static inline int __must_check
 HYPERVISOR_multicall_check(
        multicall_entry_t *call_list, unsigned int nr_calls,
        const unsigned long *rc_list)
@@ -22,4 +22,9 @@ HYPERVISOR_multicall_check(
        return 0;
 }
 
+/* A construct to ignore the return value of hypercall wrappers in a few
+ * exceptional cases (simply casting the function result to void doesn't
+ * avoid the compiler warning): */
+#define VOID(expr) ((void)((expr)?:0))
+
 #endif /* __XEN_HYPERCALL_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] linux: check hypercall return status, Jan Beulich <=