From: Keir Fraser <keir.xen@gmail.com>
To: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xen.org
Subject: Re: [PATCH] tools/hvmloader: move shared_info to reserved memory area
Date: Wed, 24 Oct 2012 12:05:32 -0700 [thread overview]
Message-ID: <CCAD8A0E.4269A%keir.xen@gmail.com> (raw)
In-Reply-To: <6a0c73ae9ce5cca72f78.1351101425@probook.site>
[-- Attachment #1: Type: text/plain, Size: 3081 bytes --]
On 24/10/2012 10:57, "Olaf Hering" <olaf@aepfle.de> wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1351101387 -7200
> # Node ID 6a0c73ae9ce5cca72f788c0e0f8fd6872010d83e
> # Parent 22e08c9ac770db07c3c3e7c844aa7153050939f3
> tools/hvmloader: move shared_info to reserved memory area
>
> Reserve a range of 1MB for the HVM shared info page at 0xFE700000. This
> area is already marked as reserved in the E820 map. The purpose of this
> change is to provide Linux PVonHVM guests with a fixed page outside of
> ordinary RAM. If the shared page is located in RAM it would be
> overwritten during a kexec boot.
I don't think hvmloader actually needs to map shared-info to the new
location, it justs needs to guarantee that this location is unused, and
document it so that it never *becomes* used in future.
Which can be as simple as the attached patch (in fact all the changes apart
from introducing GUEST_RESERVED_{START,END} are really cleaning up and
bug-fixing the out-of-space checks in the mem_hole_alloc/mem_alloc
functions).
This then just requires that the guest maps shared-info to FE700000 itself.
Should be quite easy. :)
-- Keir
> Signed-off-by: Olaf Hering <olaf@aepfle.de>
>
> diff -r 22e08c9ac770 -r 6a0c73ae9ce5 tools/firmware/hvmloader/config.h
> --- a/tools/firmware/hvmloader/config.h
> +++ b/tools/firmware/hvmloader/config.h
> @@ -68,6 +68,8 @@ extern unsigned long pci_mem_start, pci_
> /* NB. ACPI_INFO_PHYSICAL_ADDRESS *MUST* match definition in acpi/dsdt.asl!
> */
> #define ACPI_INFO_PHYSICAL_ADDRESS 0xFC000000
> #define RESERVED_MEMORY_DYNAMIC 0xFC001000
> +#define HVM_SHARED_INFO_AREA 0xFE700000
> +#define HVM_SHARED_INFO_SIZE 0x00100000
>
> extern unsigned long scratch_start;
>
> diff -r 22e08c9ac770 -r 6a0c73ae9ce5 tools/firmware/hvmloader/util.c
> --- a/tools/firmware/hvmloader/util.c
> +++ b/tools/firmware/hvmloader/util.c
> @@ -433,11 +433,18 @@ void *mem_alloc(uint32_t size, uint32_t
> if ( align < 16 )
> align = 16;
>
> +retry:
> s = (reserve + align) & ~(align - 1);
> e = s + size - 1;
>
> BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart);
>
> + /* Skip the shared info region */
> + if (s <= HVM_SHARED_INFO_AREA && e >= HVM_SHARED_INFO_AREA) {
> + reserve = HVM_SHARED_INFO_AREA + HVM_SHARED_INFO_SIZE - 1;
> + goto retry;
> + }
> +
> while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
> {
> reserve += PAGE_SIZE;
> @@ -765,7 +772,7 @@ struct shared_info *get_shared_info(void
> xatp.domid = DOMID_SELF;
> xatp.space = XENMAPSPACE_shared_info;
> xatp.idx = 0;
> - xatp.gpfn = mem_hole_alloc(1);
> + xatp.gpfn = HVM_SHARED_INFO_AREA >> PAGE_SHIFT;
> shared_info = (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
> if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
> BUG();
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
[-- Attachment #2: 00-hvmloader-reserved-mem --]
[-- Type: application/octet-stream, Size: 2494 bytes --]
diff -r 22e08c9ac770 tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Wed Oct 24 17:51:48 2012 +0200
+++ b/tools/firmware/hvmloader/config.h Wed Oct 24 04:01:24 2012 -0700
@@ -67,7 +67,15 @@ extern unsigned long pci_mem_start, pci_
#define RESERVED_MEMBASE 0xFC000000
/* NB. ACPI_INFO_PHYSICAL_ADDRESS *MUST* match definition in acpi/dsdt.asl! */
#define ACPI_INFO_PHYSICAL_ADDRESS 0xFC000000
-#define RESERVED_MEMORY_DYNAMIC 0xFC001000
+#define RESERVED_MEMORY_DYNAMIC_START 0xFC001000
+#define RESERVED_MEMORY_DYNAMIC_END 0xFE000000
+/*
+ * GUEST_RESERVED: Physical address space reserved for guest use.
+ * This is not dynamically advertised to guests, so this range must *never*
+ * be used for any purpose by us, in future.
+ */
+#define GUEST_RESERVED_START 0xFE700000
+#define GUEST_RESERVED_END 0xFE800000
extern unsigned long scratch_start;
diff -r 22e08c9ac770 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c Wed Oct 24 17:51:48 2012 +0200
+++ b/tools/firmware/hvmloader/util.c Wed Oct 24 04:01:24 2012 -0700
@@ -416,13 +416,14 @@ void mem_hole_populate_ram(xen_pfn_t mfn
}
}
-static uint32_t reserve = RESERVED_MEMORY_DYNAMIC - 1;
+static uint32_t alloc_up = RESERVED_MEMORY_DYNAMIC_START - 1;
+static uint32_t alloc_down = RESERVED_MEMORY_DYNAMIC_END;
xen_pfn_t mem_hole_alloc(uint32_t nr_mfns)
{
- hvm_info->reserved_mem_pgstart -= nr_mfns;
- BUG_ON(hvm_info->reserved_mem_pgstart <= (reserve >> PAGE_SHIFT));
- return hvm_info->reserved_mem_pgstart;
+ alloc_down -= nr_mfns << PAGE_SHIFT;
+ BUG_ON(alloc_up >= alloc_down);
+ return alloc_down >> PAGE_SHIFT;
}
void *mem_alloc(uint32_t size, uint32_t align)
@@ -433,18 +434,18 @@ void *mem_alloc(uint32_t size, uint32_t
if ( align < 16 )
align = 16;
- s = (reserve + align) & ~(align - 1);
+ s = (alloc_up + align) & ~(align - 1);
e = s + size - 1;
- BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart);
+ BUG_ON((e < s) || (e >= alloc_down));
- while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
+ while ( (alloc_up >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
{
- reserve += PAGE_SIZE;
- mem_hole_populate_ram(reserve >> PAGE_SHIFT, 1);
+ alloc_up += PAGE_SIZE;
+ mem_hole_populate_ram(alloc_up >> PAGE_SHIFT, 1);
}
- reserve = e;
+ alloc_up = e;
return (void *)(unsigned long)s;
}
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2012-10-24 19:05 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-24 17:57 [PATCH] tools/hvmloader: move shared_info to reserved memory area Olaf Hering
2012-10-24 19:05 ` Keir Fraser [this message]
2012-10-25 7:42 ` Olaf Hering
2012-10-25 7:51 ` Olaf Hering
2012-10-25 11:33 ` Keir Fraser
2012-10-25 11:39 ` Keir Fraser
2012-10-25 11:46 ` Olaf Hering
2012-10-25 12:10 ` Ian Campbell
2012-10-25 12:16 ` Olaf Hering
2012-10-26 11:58 ` Konrad Rzeszutek Wilk
2012-10-26 14:08 ` Olaf Hering
2012-10-26 15:51 ` Olaf Hering
2012-10-26 16:08 ` Keir Fraser
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CCAD8A0E.4269A%keir.xen@gmail.com \
--to=keir.xen@gmail.com \
--cc=olaf@aepfle.de \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).