From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: [PATCH v5 11/11] xen: add capability to load p2m list outside of kernel mapping Date: Thu, 25 Feb 2016 12:33:37 +0100 Message-ID: <1456400017-5789-12-git-send-email-jgross@suse.com> References: <1456400017-5789-1-git-send-email-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1456400017-5789-1-git-send-email-jgross@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: grub-devel@gnu.org Cc: Juergen Gross , phcoder@gmail.com, daniel.kiper@oracle.com, mchang@suse.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org TW9kZXJuIHB2b3BzIGxpbnV4IGtlcm5lbHMgc3VwcG9ydCBhIHAybSBsaXN0IG5vdCBjb3ZlcmVk IGJ5IHRoZQprZXJuZWwgbWFwcGluZy4gVGhpcyBjYXBhYmlsaXR5IGlzIGZsYWdnZWQgYnkgYW4g ZWxmLW5vdGUgc3BlY2lmeWluZwp0aGUgdmlydHVhbCBhZGRyZXNzIHRoZSBrZXJuZWwgaXMgZXhw ZWN0aW5nIHRoZSBwMm0gbGlzdCB0byBiZSBtYXBwZWQKdG8uCgpJbiBjYXNlIHRoZSBlbGYtbm90 ZSBpcyBzZXQgYnkgdGhlIGtlcm5lbCBkb24ndCBwbGFjZSB0aGUgcDJtIGxpc3QKaW50byB0aGUg a2VybmVsIG1hcHBpbmcsIGJ1dCBtYXAgaXQgdG8gdGhlIGdpdmVuIGFkZHJlc3MuIFRoaXMgd2ls bAphbGxvdyB0byBzdXBwb3J0IGRvbWFpbnMgd2l0aCBsYXJnZXIgbWVtb3J5LCBhcyB0aGUga2Vy bmVsIG1hcHBpbmcgaXMKbGltaXRlZCB0byAyR0IgYW5kIGEgZG9tYWluIHdpdGggaHVnZSBtZW1v cnkgaW4gdGhlIFRCIHJhbmdlIHdpbGwgaGF2ZQphIHAybSBsaXN0IGxhcmdlciB0aGFuIHRoaXMu CgpTaWduZWQtb2ZmLWJ5OiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5jb20+ClJldmlld2Vk LWJ5OiBEYW5pZWwgS2lwZXIgPGRhbmllbC5raXBlckBvcmFjbGUuY29tPgotLS0KIGdydWItY29y ZS9sb2FkZXIvaTM4Ni94ZW4uYyAgICAgICAgfCA1MyArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0tLS0tLQogZ3J1Yi1jb3JlL2xvYWRlci9pMzg2L3hlbl9maWxlWFguYyB8ICA0ICsr KwogaW5jbHVkZS9ncnViL3hlbl9maWxlLmggICAgICAgICAgICB8ICAyICsrCiAzIGZpbGVzIGNo YW5nZWQsIDUwIGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZ3J1 Yi1jb3JlL2xvYWRlci9pMzg2L3hlbi5jIGIvZ3J1Yi1jb3JlL2xvYWRlci9pMzg2L3hlbi5jCmlu ZGV4IDViY2ZkZTguLjliZjhkYTggMTAwNjQ0Ci0tLSBhL2dydWItY29yZS9sb2FkZXIvaTM4Ni94 ZW4uYworKysgYi9ncnViLWNvcmUvbG9hZGVyL2kzODYveGVuLmMKQEAgLTMxMywyNCArMzEzLDUw IEBAIHN0YXRpYyBncnViX2Vycl90CiBncnViX3hlbl9wMm1fYWxsb2MgKHZvaWQpCiB7CiAgIGdy dWJfcmVsb2NhdG9yX2NodW5rX3QgY2g7Ci0gIGdydWJfc2l6ZV90IHAybXNpemU7CisgIGdydWJf c2l6ZV90IHAybXNpemUsIHAybWFsbG9jOwogICBncnViX2Vycl90IGVycjsKKyAgc3RydWN0IGdy dWJfeGVuX21hcHBpbmcgKm1hcDsKIAogICBpZiAoeGVuX3N0YXRlLnZpcnRfbWZuX2xpc3QpCiAg ICAgcmV0dXJuIEdSVUJfRVJSX05PTkU7CiAKKyAgbWFwID0geGVuX3N0YXRlLm1hcHBpbmdzICsg eGVuX3N0YXRlLm5fbWFwcGluZ3M7CisgIHAybXNpemUgPSBBTElHTl9VUCAoc2l6ZW9mIChncnVi X3hlbl9tZm5fdCkgKgorCQkgICAgICBncnViX3hlbl9zdGFydF9wYWdlX2FkZHItPm5yX3BhZ2Vz LCBQQUdFX1NJWkUpOworICBpZiAoeGVuX3N0YXRlLnhlbl9pbmYuaGFzX3AybV9iYXNlKQorICAg IHsKKyAgICAgIGVyciA9IGdldF9wZ3RhYmxlX3NpemUgKHhlbl9zdGF0ZS54ZW5faW5mLnAybV9i YXNlLAorCQkJICAgICAgeGVuX3N0YXRlLnhlbl9pbmYucDJtX2Jhc2UgKyBwMm1zaXplLAorCQkJ ICAgICAgKHhlbl9zdGF0ZS5tYXhfYWRkciArIHAybXNpemUpID4+IFBBR0VfU0hJRlQpOworICAg ICAgaWYgKGVycikKKwlyZXR1cm4gZXJyOworCisgICAgICBtYXAtPmFyZWEucGZuX3N0YXJ0ID0g eGVuX3N0YXRlLm1heF9hZGRyID4+IFBBR0VfU0hJRlQ7CisgICAgICBwMm1hbGxvYyA9IHAybXNp emUgKyBwYWdlMm9mZnNldCAobWFwLT5hcmVhLm5fcHRfcGFnZXMpOworICAgICAgeGVuX3N0YXRl Lm5fbWFwcGluZ3MrKzsKKyAgICAgIHhlbl9zdGF0ZS5uZXh0X3N0YXJ0Lm1mbl9saXN0ID0geGVu X3N0YXRlLnhlbl9pbmYucDJtX2Jhc2U7CisgICAgICB4ZW5fc3RhdGUubmV4dF9zdGFydC5maXJz dF9wMm1fcGZuID0gbWFwLT5hcmVhLnBmbl9zdGFydDsKKyAgICAgIHhlbl9zdGF0ZS5uZXh0X3N0 YXJ0Lm5yX3AybV9mcmFtZXMgPSBwMm1hbGxvYyA+PiBQQUdFX1NISUZUOworICAgIH0KKyAgZWxz ZQorICAgIHsKKyAgICAgIHhlbl9zdGF0ZS5uZXh0X3N0YXJ0Lm1mbl9saXN0ID0KKwl4ZW5fc3Rh dGUubWF4X2FkZHIgKyB4ZW5fc3RhdGUueGVuX2luZi52aXJ0X2Jhc2U7CisgICAgICBwMm1hbGxv YyA9IHAybXNpemU7CisgICAgfQorCiAgIHhlbl9zdGF0ZS5zdGF0ZS5tZm5fbGlzdCA9IHhlbl9z dGF0ZS5tYXhfYWRkcjsKLSAgeGVuX3N0YXRlLm5leHRfc3RhcnQubWZuX2xpc3QgPQotICAgIHhl bl9zdGF0ZS5tYXhfYWRkciArIHhlbl9zdGF0ZS54ZW5faW5mLnZpcnRfYmFzZTsKLSAgcDJtc2l6 ZSA9IHNpemVvZiAoZ3J1Yl94ZW5fbWZuX3QpICogZ3J1Yl94ZW5fc3RhcnRfcGFnZV9hZGRyLT5u cl9wYWdlczsKICAgZXJyID0gZ3J1Yl9yZWxvY2F0b3JfYWxsb2NfY2h1bmtfYWRkciAoeGVuX3N0 YXRlLnJlbG9jYXRvciwgJmNoLAotCQkJCQkgeGVuX3N0YXRlLm1heF9hZGRyLCBwMm1zaXplKTsK KwkJCQkJIHhlbl9zdGF0ZS5tYXhfYWRkciwgcDJtYWxsb2MpOwogICBpZiAoZXJyKQogICAgIHJl dHVybiBlcnI7CiAgIHhlbl9zdGF0ZS52aXJ0X21mbl9saXN0ID0gZ2V0X3ZpcnR1YWxfY3VycmVu dF9hZGRyZXNzIChjaCk7CisgIGlmICh4ZW5fc3RhdGUueGVuX2luZi5oYXNfcDJtX2Jhc2UpCisg ICAgbWFwLT53aGVyZSA9IChncnViX3VpbnQ2NF90ICopIHhlbl9zdGF0ZS52aXJ0X21mbl9saXN0 ICsKKwkJIHAybXNpemUgLyBzaXplb2YgKGdydWJfdWludDY0X3QpOwogICBncnViX21lbWNweSAo eGVuX3N0YXRlLnZpcnRfbWZuX2xpc3QsCiAJICAgICAgICh2b2lkICopIGdydWJfeGVuX3N0YXJ0 X3BhZ2VfYWRkci0+bWZuX2xpc3QsIHAybXNpemUpOwotICB4ZW5fc3RhdGUubWF4X2FkZHIgPSBB TElHTl9VUCAoeGVuX3N0YXRlLm1heF9hZGRyICsgcDJtc2l6ZSwgUEFHRV9TSVpFKTsKKyAgeGVu X3N0YXRlLm1heF9hZGRyICs9IHAybWFsbG9jOwogCiAgIHJldHVybiBHUlVCX0VSUl9OT05FOwog fQpAQCAtNDQ3LDkgKzQ3MywxMiBAQCBncnViX3hlbl9hbGxvY19maW5hbCAodm9pZCkKIHsKICAg Z3J1Yl9lcnJfdCBlcnI7CiAKLSAgZXJyID0gZ3J1Yl94ZW5fcDJtX2FsbG9jICgpOwotICBpZiAo ZXJyKQotICAgIHJldHVybiBlcnI7CisgIGlmICgheGVuX3N0YXRlLnhlbl9pbmYuaGFzX3AybV9i YXNlKQorICAgIHsKKyAgICAgIGVyciA9IGdydWJfeGVuX3AybV9hbGxvYyAoKTsKKyAgICAgIGlm IChlcnIpCisJcmV0dXJuIGVycjsKKyAgICB9CiAgIGVyciA9IGdydWJfeGVuX3NwZWNpYWxfYWxs b2MgKCk7CiAgIGlmIChlcnIpCiAgICAgcmV0dXJuIGVycjsKQEAgLTQ3NCw2ICs1MDMsMTIgQEAg Z3J1Yl94ZW5fYm9vdCAodm9pZCkKICAgZXJyID0gZ3J1Yl94ZW5fYWxsb2NfZmluYWwgKCk7CiAg IGlmIChlcnIpCiAgICAgcmV0dXJuIGVycjsKKyAgaWYgKHhlbl9zdGF0ZS54ZW5faW5mLmhhc19w Mm1fYmFzZSkKKyAgICB7CisgICAgICBlcnIgPSBncnViX3hlbl9wMm1fYWxsb2MgKCk7CisgICAg ICBpZiAoZXJyKQorCXJldHVybiBlcnI7CisgICAgfQogCiAgIGVyciA9IHNldF9tZm5zICh4ZW5f c3RhdGUuY29uc29sZV9wZm4pOwogICBpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZ3J1Yi1jb3JlL2xv YWRlci9pMzg2L3hlbl9maWxlWFguYyBiL2dydWItY29yZS9sb2FkZXIvaTM4Ni94ZW5fZmlsZVhY LmMKaW5kZXggODc1MTE3NC4uZmI2NmU2NiAxMDA2NDQKLS0tIGEvZ3J1Yi1jb3JlL2xvYWRlci9p Mzg2L3hlbl9maWxlWFguYworKysgYi9ncnViLWNvcmUvbG9hZGVyL2kzODYveGVuX2ZpbGVYWC5j CkBAIC0yNjEsNiArMjYxLDEwIEBAIHBhcnNlX25vdGUgKGdydWJfZWxmX3QgZWxmLCBzdHJ1Y3Qg Z3J1Yl94ZW5fZmlsZV9pbmZvICp4aSwKIAkJCQkJICBkZXNjc3ogPT0gMiA/IDIgOiAzKSA9PSAw KQogCSAgICB4aS0+YXJjaCA9IEdSVUJfWEVOX0ZJTEVfSTM4NjsKIAkgIGJyZWFrOworCWNhc2Ug WEVOX0VMRk5PVEVfSU5JVF9QMk06CisJICB4aS0+cDJtX2Jhc2UgPSBncnViX2xlX3RvX2NwdV9h ZGRyICgqKEVsZl9BZGRyICopIGRlc2MpOworCSAgeGktPmhhc19wMm1fYmFzZSA9IDE7CisJICBi cmVhazsKIAljYXNlIFhFTl9FTEZOT1RFX01PRF9TVEFSVF9QRk46CiAJICB4aS0+dW5tYXBwZWRf aW5pdHJkID0gISFncnViX2xlX3RvX2NwdTMyKCooZ3J1Yl91aW50MzJfdCAqKSBkZXNjKTsKIAkg IGJyZWFrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncnViL3hlbl9maWxlLmggYi9pbmNsdWRlL2dy dWIveGVuX2ZpbGUuaAppbmRleCBlZDc0OWZhLi42NTg3OTk5IDEwMDY0NAotLS0gYS9pbmNsdWRl L2dydWIveGVuX2ZpbGUuaAorKysgYi9pbmNsdWRlL2dydWIveGVuX2ZpbGUuaApAQCAtMzIsOSAr MzIsMTEgQEAgc3RydWN0IGdydWJfeGVuX2ZpbGVfaW5mbwogICBncnViX3VpbnQ2NF90IGVudHJ5 X3BvaW50OwogICBncnViX3VpbnQ2NF90IGh5cGVyY2FsbF9wYWdlOwogICBncnViX3VpbnQ2NF90 IHBhZGRyX29mZnNldDsKKyAgZ3J1Yl91aW50NjRfdCBwMm1fYmFzZTsKICAgaW50IGhhc19oeXBl cmNhbGxfcGFnZTsKICAgaW50IGhhc19ub3RlOwogICBpbnQgaGFzX3hlbl9ndWVzdDsKKyAgaW50 IGhhc19wMm1fYmFzZTsKICAgaW50IGV4dGVuZGVkX2NyMzsKICAgaW50IHVubWFwcGVkX2luaXRy ZDsKICAgZW51bQotLSAKMi42LjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4u b3JnCmh0dHA6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1aYuBD-00028Q-IP for mharc-grub-devel@gnu.org; Thu, 25 Feb 2016 06:33:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58272) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYuB5-0001tu-O0 for grub-devel@gnu.org; Thu, 25 Feb 2016 06:33:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aYuB2-0000EG-St for grub-devel@gnu.org; Thu, 25 Feb 2016 06:33:51 -0500 Received: from mx2.suse.de ([195.135.220.15]:34225) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYuB2-0000DW-K3 for grub-devel@gnu.org; Thu, 25 Feb 2016 06:33:48 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AC9B5AD7D; Thu, 25 Feb 2016 11:33:47 +0000 (UTC) From: Juergen Gross To: grub-devel@gnu.org Subject: [PATCH v5 11/11] xen: add capability to load p2m list outside of kernel mapping Date: Thu, 25 Feb 2016 12:33:37 +0100 Message-Id: <1456400017-5789-12-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1456400017-5789-1-git-send-email-jgross@suse.com> References: <1456400017-5789-1-git-send-email-jgross@suse.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-Received-From: 195.135.220.15 Cc: Juergen Gross , phcoder@gmail.com, daniel.kiper@oracle.com, mchang@suse.com, xen-devel@lists.xen.org X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Feb 2016 11:33:53 -0000 Modern pvops linux kernels support a p2m list not covered by the kernel mapping. This capability is flagged by an elf-note specifying the virtual address the kernel is expecting the p2m list to be mapped to. In case the elf-note is set by the kernel don't place the p2m list into the kernel mapping, but map it to the given address. This will allow to support domains with larger memory, as the kernel mapping is limited to 2GB and a domain with huge memory in the TB range will have a p2m list larger than this. Signed-off-by: Juergen Gross Reviewed-by: Daniel Kiper --- grub-core/loader/i386/xen.c | 53 +++++++++++++++++++++++++++++++------- grub-core/loader/i386/xen_fileXX.c | 4 +++ include/grub/xen_file.h | 2 ++ 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c index 5bcfde8..9bf8da8 100644 --- a/grub-core/loader/i386/xen.c +++ b/grub-core/loader/i386/xen.c @@ -313,24 +313,50 @@ static grub_err_t grub_xen_p2m_alloc (void) { grub_relocator_chunk_t ch; - grub_size_t p2msize; + grub_size_t p2msize, p2malloc; grub_err_t err; + struct grub_xen_mapping *map; if (xen_state.virt_mfn_list) return GRUB_ERR_NONE; + map = xen_state.mappings + xen_state.n_mappings; + p2msize = ALIGN_UP (sizeof (grub_xen_mfn_t) * + grub_xen_start_page_addr->nr_pages, PAGE_SIZE); + if (xen_state.xen_inf.has_p2m_base) + { + err = get_pgtable_size (xen_state.xen_inf.p2m_base, + xen_state.xen_inf.p2m_base + p2msize, + (xen_state.max_addr + p2msize) >> PAGE_SHIFT); + if (err) + return err; + + map->area.pfn_start = xen_state.max_addr >> PAGE_SHIFT; + p2malloc = p2msize + page2offset (map->area.n_pt_pages); + xen_state.n_mappings++; + xen_state.next_start.mfn_list = xen_state.xen_inf.p2m_base; + xen_state.next_start.first_p2m_pfn = map->area.pfn_start; + xen_state.next_start.nr_p2m_frames = p2malloc >> PAGE_SHIFT; + } + else + { + xen_state.next_start.mfn_list = + xen_state.max_addr + xen_state.xen_inf.virt_base; + p2malloc = p2msize; + } + xen_state.state.mfn_list = xen_state.max_addr; - xen_state.next_start.mfn_list = - xen_state.max_addr + xen_state.xen_inf.virt_base; - p2msize = sizeof (grub_xen_mfn_t) * grub_xen_start_page_addr->nr_pages; err = grub_relocator_alloc_chunk_addr (xen_state.relocator, &ch, - xen_state.max_addr, p2msize); + xen_state.max_addr, p2malloc); if (err) return err; xen_state.virt_mfn_list = get_virtual_current_address (ch); + if (xen_state.xen_inf.has_p2m_base) + map->where = (grub_uint64_t *) xen_state.virt_mfn_list + + p2msize / sizeof (grub_uint64_t); grub_memcpy (xen_state.virt_mfn_list, (void *) grub_xen_start_page_addr->mfn_list, p2msize); - xen_state.max_addr = ALIGN_UP (xen_state.max_addr + p2msize, PAGE_SIZE); + xen_state.max_addr += p2malloc; return GRUB_ERR_NONE; } @@ -447,9 +473,12 @@ grub_xen_alloc_final (void) { grub_err_t err; - err = grub_xen_p2m_alloc (); - if (err) - return err; + if (!xen_state.xen_inf.has_p2m_base) + { + err = grub_xen_p2m_alloc (); + if (err) + return err; + } err = grub_xen_special_alloc (); if (err) return err; @@ -474,6 +503,12 @@ grub_xen_boot (void) err = grub_xen_alloc_final (); if (err) return err; + if (xen_state.xen_inf.has_p2m_base) + { + err = grub_xen_p2m_alloc (); + if (err) + return err; + } err = set_mfns (xen_state.console_pfn); if (err) diff --git a/grub-core/loader/i386/xen_fileXX.c b/grub-core/loader/i386/xen_fileXX.c index 8751174..fb66e66 100644 --- a/grub-core/loader/i386/xen_fileXX.c +++ b/grub-core/loader/i386/xen_fileXX.c @@ -261,6 +261,10 @@ parse_note (grub_elf_t elf, struct grub_xen_file_info *xi, descsz == 2 ? 2 : 3) == 0) xi->arch = GRUB_XEN_FILE_I386; break; + case XEN_ELFNOTE_INIT_P2M: + xi->p2m_base = grub_le_to_cpu_addr (*(Elf_Addr *) desc); + xi->has_p2m_base = 1; + break; case XEN_ELFNOTE_MOD_START_PFN: xi->unmapped_initrd = !!grub_le_to_cpu32(*(grub_uint32_t *) desc); break; diff --git a/include/grub/xen_file.h b/include/grub/xen_file.h index ed749fa..6587999 100644 --- a/include/grub/xen_file.h +++ b/include/grub/xen_file.h @@ -32,9 +32,11 @@ struct grub_xen_file_info grub_uint64_t entry_point; grub_uint64_t hypercall_page; grub_uint64_t paddr_offset; + grub_uint64_t p2m_base; int has_hypercall_page; int has_note; int has_xen_guest; + int has_p2m_base; int extended_cr3; int unmapped_initrd; enum -- 2.6.2