Patchwork [05/30] memory: assert that PhysPageEntry's ptr does not overflow

login
register
mail settings
Submitter Paolo Bonzini
Date May 21, 2013, 10:57 a.m.
Message ID <1369133851-1894-6-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/245265/
State New
Headers show

Comments

Paolo Bonzini - May 21, 2013, 10:57 a.m.
While sized to 15 bits in PhysPageEntry, the ptr field is ORed into the
iotlb entries together with a page-aligned pointer.  The ptr field must
not overflow into this page-aligned value, assert that it is smaller than
the page size.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c | 2 ++
 1 file changed, 2 insertions(+)
Peter Maydell - May 23, 2013, 5:36 p.m.
On 21 May 2013 11:57, Paolo Bonzini <pbonzini@redhat.com> wrote:
> While sized to 15 bits in PhysPageEntry, the ptr field is ORed into the
> iotlb entries together with a page-aligned pointer.  The ptr field must
> not overflow into this page-aligned value, assert that it is smaller than
> the page size.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  exec.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/exec.c b/exec.c
> index 1355661..380245f 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -713,6 +713,8 @@ static void destroy_all_mappings(AddressSpaceDispatch *d)
>
>  static uint16_t phys_section_add(MemoryRegionSection *section)
>  {

You might consider having the rationale for the assert in a comment
here as well as in the commit log.

> +    assert(phys_sections_nb < TARGET_PAGE_SIZE);
> +
>      if (phys_sections_nb == phys_sections_nb_alloc) {
>          phys_sections_nb_alloc = MAX(phys_sections_nb_alloc * 2, 16);
>          phys_sections = g_renew(MemoryRegionSection, phys_sections,


Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

-- PMM

Patch

diff --git a/exec.c b/exec.c
index 1355661..380245f 100644
--- a/exec.c
+++ b/exec.c
@@ -713,6 +713,8 @@  static void destroy_all_mappings(AddressSpaceDispatch *d)
 
 static uint16_t phys_section_add(MemoryRegionSection *section)
 {
+    assert(phys_sections_nb < TARGET_PAGE_SIZE);
+
     if (phys_sections_nb == phys_sections_nb_alloc) {
         phys_sections_nb_alloc = MAX(phys_sections_nb_alloc * 2, 16);
         phys_sections = g_renew(MemoryRegionSection, phys_sections,