We cannot allow nested C functions. They create a stack
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 22 Aug 2005 19:58:22 +0000 (19:58 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Mon, 22 Aug 2005 19:58:22 +0000 (19:58 +0000)
trampoline when their address is taken, which causes a
fault if the system implements NX/XD.

Signed-off-by: Keir Fraser <keir@xensource.com>
Config.mk
linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c
linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c

index 76180e6b26c7d9e5e0ce82e6b49c8bfc3c0f846d..2f2183e20ea6dc28e46b3287e4c9a89e78c179d8 100644 (file)
--- a/Config.mk
+++ b/Config.mk
@@ -3,7 +3,7 @@
 # Currently supported architectures: x86_32, x86_64
 XEN_COMPILE_ARCH    ?= $(shell uname -m | sed -e s/i.86/x86_32/)
 XEN_TARGET_ARCH     ?= $(XEN_COMPILE_ARCH)
-XEN_TARGET_X86_PAE  ?= n
+XEN_TARGET_X86_PAE  ?= y
 
 # Tools to run on system hosting the build
 HOSTCC     = gcc
index 26a69baa6c3e4e4d286a04dc65b16de804d2a4d0..e33dc9b633297986cf718be5e5769e4e8e374f70 100644 (file)
@@ -368,35 +368,37 @@ int direct_remap_area_pages(struct mm_struct *mm,
 
 EXPORT_SYMBOL(direct_remap_area_pages);
 
+static int lookup_pte_fn(
+       pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
+{
+       unsigned long *ptep = (unsigned long *)data;
+       if (ptep)
+               *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) <<
+                        PAGE_SHIFT) |
+                       ((unsigned long)pte & ~PAGE_MASK);
+       return 0;
+}
+
 int create_lookup_pte_addr(struct mm_struct *mm, 
                           unsigned long address,
                           unsigned long *ptep)
 {
-       int f(pte_t *pte, struct page *pte_page, unsigned long addr,
-             void *data) {
-               unsigned long *ptep = (unsigned long *)data;
-               if (ptep)
-                       *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) <<
-                                PAGE_SHIFT) |
-                               ((unsigned long)pte & ~PAGE_MASK);
-               return 0;
-       }
-
-       return generic_page_range(mm, address, PAGE_SIZE, f, ptep);
+       return generic_page_range(mm, address, PAGE_SIZE, lookup_pte_fn, ptep);
 }
 
 EXPORT_SYMBOL(create_lookup_pte_addr);
 
+static int noop_fn(
+       pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
+{
+       return 0;
+}
+
 int touch_pte_range(struct mm_struct *mm,
                    unsigned long address,
                    unsigned long size)
 {
-       int f(pte_t *pte, struct page *pte_page, unsigned long addr,
-             void *data) {
-               return 0;
-       }
-
-       return generic_page_range(mm, address, size, f, NULL);
+       return generic_page_range(mm, address, size, noop_fn, NULL);
 } 
 
 EXPORT_SYMBOL(touch_pte_range);
index c3d6ee395930097c55b74599a447466ac3a07936..c56e92cb62ae51e9c28f9e4480ad4244a3ffa62e 100644 (file)
@@ -465,33 +465,35 @@ int direct_remap_area_pages(struct mm_struct *mm,
 
 EXPORT_SYMBOL(direct_remap_area_pages);
 
+static int lookup_pte_fn(
+    pte_t *pte, struct page *pte_page, unsigned long addr, void *data) 
+{
+    unsigned long *ptep = (unsigned long *)data;
+    if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT)
+                  | ((unsigned long)pte & ~PAGE_MASK);
+    return 0;
+}
+
 int create_lookup_pte_addr(struct mm_struct *mm, 
                            unsigned long address,
                            unsigned long *ptep)
 {
-    int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) 
-    {
-        unsigned long *ptep = (unsigned long *)data;
-        if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT)
-                       | ((unsigned long)pte & ~PAGE_MASK);
-        return 0;
-    }
-
-    return generic_page_range(mm, address, PAGE_SIZE, f, ptep);
+    return generic_page_range(mm, address, PAGE_SIZE, lookup_pte_fn, ptep);
 }
 
 EXPORT_SYMBOL(create_lookup_pte_addr);
 
+static int noop_fn(
+    pte_t *pte, struct page *pte_page, unsigned long addr, void *data) 
+{
+    return 0;
+}
+
 int touch_pte_range(struct mm_struct *mm,
                     unsigned long address,
                     unsigned long size)
 {
-    int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) 
-    {
-        return 0;
-    }
-
-    return generic_page_range(mm, address, size, f, NULL);
-}                 
+    return generic_page_range(mm, address, size, noop_fn, NULL);
+}
 
 EXPORT_SYMBOL(touch_pte_range);
index 090a19be4dc475a9b57a3a28d8bf5f45d8943eea..5498e5a80409fc666ff55e61f2e47ad88bc27e89 100644 (file)
@@ -434,20 +434,20 @@ void balloon_update_driver_allowance(long delta)
        balloon_unlock(flags);
 }
 
-struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
+static int dealloc_pte_fn(
+       pte_t *pte, struct page *pte_page, unsigned long addr, void *data)
 {
-       int f(pte_t *pte, struct page *pte_page,
-             unsigned long addr, void *data)
-       {
-               unsigned long mfn = pte_mfn(*pte);
-               set_pte(pte, __pte_ma(0));
-               phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] =
-                       INVALID_P2M_ENTRY;
-               BUG_ON(HYPERVISOR_dom_mem_op(
-                       MEMOP_decrease_reservation, &mfn, 1, 0) != 1);
-               return 0;
-        }
+       unsigned long mfn = pte_mfn(*pte);
+       set_pte(pte, __pte_ma(0));
+       phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] =
+               INVALID_P2M_ENTRY;
+       BUG_ON(HYPERVISOR_dom_mem_op(
+               MEMOP_decrease_reservation, &mfn, 1, 0) != 1);
+       return 0;
+}
 
+struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
+{
        unsigned long vstart, flags;
        unsigned int  order = get_order(nr_pages * PAGE_SIZE);
 
@@ -459,7 +459,7 @@ struct page *balloon_alloc_empty_page_range(unsigned long nr_pages)
 
        balloon_lock(flags);
        BUG_ON(generic_page_range(
-               &init_mm, vstart, PAGE_SIZE << order, f, NULL) != 0);
+               &init_mm, vstart, PAGE_SIZE << order, dealloc_pte_fn, NULL));
        current_pages -= 1UL << order;
        balloon_unlock(flags);