From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1gLCkm-0004v7-E4 for mharc-grub-devel@gnu.org; Fri, 09 Nov 2018 14:47:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54345) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gLCki-0004dt-77 for grub-devel@gnu.org; Fri, 09 Nov 2018 14:47:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gLCkY-0000X5-R3 for grub-devel@gnu.org; Fri, 09 Nov 2018 14:47:30 -0500 Received: from userp2120.oracle.com ([156.151.31.85]:41266) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gLCkY-0000H7-8d for grub-devel@gnu.org; Fri, 09 Nov 2018 14:47:26 -0500 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id wA9JhmM4015544; Fri, 9 Nov 2018 19:47:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : content-transfer-encoding : in-reply-to; s=corp-2018-07-02; bh=6N50Zwka1hclaevHnEV8UvlwJBmwC+c+0x2rI99u5jU=; b=bMt4xcwtkzvCKd9A3TH2gBE8NVUCucgBzfEe9IKWw68Cm+Am8o7H65V54nHLFvMXzYnl ZZGbRxy2NeDxnxnpqB+qVnLtuEk+dBU+ZV0eoFZbSfC9ub3miuuG/VtGOmb/paQGOolM t/6hvoClOT052V4/ybXIpyHwX04DJNyLIwFTXuYn56Oiiwrll1I8D35HSD5pm6eQJpgq 293YFOFsmIk/iY0Io10+3rdEKD9rr+FAoVgCncTS+iYOFY0XdWggLrDmqZ3hYvJsxRZn F8la7p0O81EfQWmX1EjI8v9qPkQm1lIrHru+5IObu9JxYAV7X0jeo2ydL1r+UE3M6mMw xg== Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp2120.oracle.com with ESMTP id 2nh4ar8u10-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 09 Nov 2018 19:47:15 +0000 Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id wA9JlEgU014407 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 9 Nov 2018 19:47:14 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id wA9JlEJ5008429; Fri, 9 Nov 2018 19:47:14 GMT Received: from olila.i.net-space.pl (/10.175.209.204) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 09 Nov 2018 11:47:13 -0800 Date: Fri, 9 Nov 2018 20:47:09 +0100 From: Daniel Kiper To: Juergen Gross Cc: grub-devel@gnu.org, xen-devel@lists.xen.org, phcoder@gmail.com, hans@knorrie.org Subject: Re: [PATCH v4 13/19] xen: setup Xen specific data for PVH Message-ID: <20181109194709.GG4363@olila.i.net-space.pl> References: <20181102123738.16395-1-jgross@suse.com> <20181102123738.16395-14-jgross@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <20181102123738.16395-14-jgross@suse.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9072 signatures=668683 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=2 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1811090177 Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by userp2120.oracle.com id wA9JhmM4015544 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 156.151.31.85 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 09 Nov 2018 19:47:39 -0000 On Fri, Nov 02, 2018 at 01:37:32PM +0100, Juergen Gross wrote: > Initialize the needed Xen specific data. This is: > > - the Xen start of day page containing the console and Xenstore ring > page PFN and event channel > - the grant table > - the shared info page > > Write back the possibly modified memory map to the hypervisor in case > the guest is reading it from there again. > > Set the RSDP address for the guest from the start_info page passed > as boot parameter. > > Signed-off-by: Juergen Gross > --- > V4: write back memory map to Xen (Roger Pau Monn=E9) > --- > grub-core/kern/i386/xen/pvh.c | 119 ++++++++++++++++++++++++++++++++++= ++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pv= h.c > index 442351d1d..d74301f92 100644 > --- a/grub-core/kern/i386/xen/pvh.c > +++ b/grub-core/kern/i386/xen/pvh.c > @@ -27,6 +27,7 @@ > #include > #include > #include > +#include > #include > > #define XEN_CONSOLE_PORT 0xe9 > @@ -39,6 +40,7 @@ static char hypercall_page[GRUB_XEN_PAGE_SIZE] > __attribute__ ((aligned (GRUB_XEN_PAGE_SIZE))); > > static grub_uint32_t xen_cpuid_base; > +static struct start_info grub_xen_start_page; > static struct grub_e820_mmap_entry map[XEN_MEMORY_MAP_SIZE]; > static unsigned int nr_map_entries; > > @@ -100,6 +102,36 @@ grub_xen_hypercall (grub_uint32_t callno, grub_uin= t32_t a0, > return __res; > } > > +static grub_uint32_t > +grub_xen_get_param (int idx) > +{ > + struct xen_hvm_param xhv; > + int r; > + > + xhv.domid =3D DOMID_SELF; > + xhv.index =3D idx; > + r =3D grub_xen_hypercall (__HYPERVISOR_hvm_op, HVMOP_get_param, > + (grub_uint32_t) (&xhv), 0, 0, 0, 0); > + if (r < 0) > + grub_xen_panic ("Could not get parameter from Xen.\n"); I would replace "." with "!" here and in the other grub_xen_panic() calls. > + return xhv.value; > +} > + > +static void * > +grub_xen_add_physmap (unsigned int space, void *addr) > +{ > + struct xen_add_to_physmap xatp; > + > + xatp.domid =3D DOMID_SELF; > + xatp.idx =3D 0; > + xatp.space =3D space; > + xatp.gpfn =3D (grub_addr_t) addr >> GRUB_XEN_LOG_PAGE_SIZE; > + if (grub_xen_hypercall (__HYPERVISOR_memory_op, XENMEM_add_to_physma= p, > + (grub_uint32_t) (&xatp), 0, 0, 0, 0)) > + grub_xen_panic ("Memory_op hypercall failed.\n"); > + return addr; > +} > + > static void > grub_xen_sort_mmap (void) > { > @@ -255,12 +287,99 @@ grub_xen_get_mmap (void) > grub_xen_sort_mmap (); > } > > +static void > +grub_xen_set_mmap (void) > +{ > + struct xen_foreign_memory_map memmap; > + > + memmap.domid =3D DOMID_SELF; > + memmap.map.nr_entries =3D nr_map_entries; > + set_xen_guest_handle (memmap.map.buffer, map); > + grub_xen_hypercall (__HYPERVISOR_memory_op, XENMEM_set_memory_map, > + (grub_uint32_t) (&memmap), 0, 0, 0, 0); > +} > + > +static grub_uint64_t > +grub_xen_find_page (grub_uint64_t start) > +{ > + unsigned int i, j; > + grub_uint64_t last =3D start; > + > + /* Try to find a e820 map hole below 4G. */ > + for (i =3D 0; i < nr_map_entries; i++) > + { > + if (last > map[i].addr + map[i].len) > + continue; > + if (last < map[i].addr) > + return last; > + if ((map[i].addr >> 32) || ((map[i].addr + map[i].len) >> 32)) > + break; > + last =3D map[i].addr + map[i].len; > + } It took me some time to get why it works. AIUI this is due to proper start/end alignment. Right? So, please say about that in the comment. And I would like to hear a word from Roger here too. If he is OK with the patch you can add my RB too. Daniel > + if (i =3D=3D nr_map_entries) > + return last; > + > + /* No hole found, use the highest RAM page below 4G and reserve it. = */ > + if (nr_map_entries =3D=3D ARRAY_SIZE (map)) > + grub_xen_panic ("Memory map size limit reached.\n"); > + for (i =3D 0, j =3D 0; i < nr_map_entries; i++) > + { > + if (map[i].type !=3D GRUB_MEMORY_AVAILABLE) > + continue; > + if (map[i].addr >> 32) > + break; > + j =3D i; > + if ((map[i].addr + map[i].len) >> 32) > + break; > + } > + if (map[j].type !=3D GRUB_MEMORY_AVAILABLE) > + grub_xen_panic ("No free memory page found.\n"); > + if ((map[j].addr + map[j].len) >> 32) > + last =3D (1ULL << 32) - GRUB_XEN_PAGE_SIZE; > + else > + last =3D map[j].addr + map[j].len - GRUB_XEN_PAGE_SIZE; > + map[nr_map_entries].addr =3D last; > + map[nr_map_entries].len =3D GRUB_XEN_PAGE_SIZE; > + map[nr_map_entries].type =3D GRUB_MEMORY_RESERVED; > + nr_map_entries++; > + grub_xen_sort_mmap (); > + > + return last; > +} > + > void > grub_xen_setup_pvh (void) > { > + grub_addr_t par; > + > grub_xen_cpuid_base (); > grub_xen_setup_hypercall_page (); > grub_xen_get_mmap (); > + > + /* Setup Xen data. */ > + grub_xen_start_page_addr =3D &grub_xen_start_page; > + > + par =3D grub_xen_get_param (HVM_PARAM_CONSOLE_PFN); > + grub_xen_start_page_addr->console.domU.mfn =3D par; > + grub_xen_xcons =3D (void *) (grub_addr_t) (par << GRUB_XEN_LOG_PAGE_= SIZE); > + par =3D grub_xen_get_param (HVM_PARAM_CONSOLE_EVTCHN); > + grub_xen_start_page_addr->console.domU.evtchn =3D par; > + > + par =3D grub_xen_get_param (HVM_PARAM_STORE_PFN); > + grub_xen_start_page_addr->store_mfn =3D par; > + grub_xen_xenstore =3D (void *) (grub_addr_t) (par << GRUB_XEN_LOG_PA= GE_SIZE); > + par =3D grub_xen_get_param (HVM_PARAM_STORE_EVTCHN); > + grub_xen_start_page_addr->store_evtchn =3D par; > + > + par =3D grub_xen_find_page (0); > + grub_xen_grant_table =3D grub_xen_add_physmap (XENMAPSPACE_grant_tab= le, > + (void *) par); > + par =3D grub_xen_find_page (par + GRUB_XEN_PAGE_SIZE); > + grub_xen_shared_info =3D grub_xen_add_physmap (XENMAPSPACE_shared_in= fo, > + (void *) par); > + grub_xen_set_mmap (); > + > + grub_rsdp_addr =3D pvh_start_info->rsdp_paddr; > } > > grub_err_t > -- > 2.16.4