[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-3.1-testing] x86/64 compat: Replace hypervisor BUG_ON() with a cleaner hypercall failure.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1207901973 -3600
# Node ID f347764f440ab0b5210f39b0178dbb736a4e977a
# Parent  fa49d1580738cb83800d2d04e1f88592ad957783
x86/64 compat: Replace hypervisor BUG_ON() with a cleaner hypercall failure.

While trying to run a 32-bit PV domU on a 64-bit hypervisor, I
triggered an assert in the hypervisor.  The assert dealt with the
maximum number of grants that a domU can have.  I made the hypervisor
a bit more graceful by returning an error rather than asserting.

Signed-off-by: Michael Abd-El-Malek <mabdelmalek@xxxxxxx>
xen-unstable changeset:   17438:115a1720e976a184b2c044541a99b413b2bf844e
xen-unstable date:        Fri Apr 11 09:10:58 2008 +0100
---
 xen/common/compat/grant_table.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff -r fa49d1580738 -r f347764f440a xen/common/compat/grant_table.c
--- a/xen/common/compat/grant_table.c   Fri Apr 11 09:19:11 2008 +0100
+++ b/xen/common/compat/grant_table.c   Fri Apr 11 09:19:33 2008 +0100
@@ -101,12 +101,24 @@ int compat_grant_table_op(unsigned int c
                 rc = -EFAULT;
             else
             {
-                BUG_ON((COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) / 
sizeof(*nat.setup->frame_list.p) < max_nr_grant_frames);
+                unsigned int max_frame_list_size_in_page =
+                    (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) /
+                    sizeof(*nat.setup->frame_list.p);
+                if ( max_frame_list_size_in_page < max_nr_grant_frames )
+                {
+                    gdprintk(XENLOG_WARNING,
+                             "max_nr_grant_frames is too large (%u,%u)\n",
+                             max_nr_grant_frames, max_frame_list_size_in_page);
+                    rc = -EINVAL;
+                }
+                else
+                {
 #define XLAT_gnttab_setup_table_HNDL_frame_list(_d_, _s_) \
-                set_xen_guest_handle((_d_)->frame_list, (unsigned long 
*)(nat.setup + 1))
-                XLAT_gnttab_setup_table(nat.setup, &cmp.setup);
+                    set_xen_guest_handle((_d_)->frame_list, (unsigned long 
*)(nat.setup + 1))
+                    XLAT_gnttab_setup_table(nat.setup, &cmp.setup);
 #undef XLAT_gnttab_setup_table_HNDL_frame_list
-                rc = gnttab_setup_table(guest_handle_cast(nat.uop, 
gnttab_setup_table_t), 1);
+                    rc = gnttab_setup_table(guest_handle_cast(nat.uop, 
gnttab_setup_table_t), 1);
+                }
             }
             if ( rc == 0 )
             {

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.