[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |