Index: sys/amd64/xen/pmap.c =================================================================== --- sys/amd64/xen/pmap.c (revisione 237776) +++ sys/amd64/xen/pmap.c (copia locale) @@ -120,6 +120,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -136,6 +137,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include @@ -179,6 +181,7 @@ static vm_paddr_t boot_ptendphys; /* phys addr of * bootstrap page tables */ +static uma_zone_t xen_pagezone; static size_t tsz; /* mmu_map.h opaque cookie size */ static vm_offset_t (*ptmb_mappedalloc)(size_t) = NULL; static void (*ptmb_mappedfree)(size_t) = NULL; @@ -239,6 +242,48 @@ pmap_xen_setpages_rw(vm_offset_t va, vm_size_t npa } } +static vm_offset_t +xen_pagezone_alloc(size_t size) +{ + vm_offset_t ret; + + KASSERT(size == PAGE_SIZE, ("%s: invalid size", __func__)); + + ret = (vm_offset_t)uma_zalloc(xen_pagezone, M_NOWAIT | M_ZERO); + if (ret == 0) + panic("%s: failed allocation\n", __func__); + return (ret); +} + +static void +xen_pagezone_free(vm_offset_t page) +{ + + uma_zfree(xen_pagezone, (void *)page); +} + +static int +xen_pagezone_init(void *mem, int size, int flags) +{ + vm_offset_t va; + + va = (vm_offset_t)mem; + pmap_xen_setpages_ro(va, atop(size)); + return (0); +} + +static void +setup_xen_pagezone(void *dummy __unused) +{ + + xen_pagezone = uma_zcreate("XEN PAGEZONE", PAGE_SIZE, NULL, NULL, + xen_pagezone_init, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM); + ptmb_mappedalloc = xen_pagezone_alloc; + ptmb_mappedfree = xen_pagezone_free; +} +SYSINIT(setup_xen_pagezone, SI_SUB_VM_CONF, SI_ORDER_ANY, setup_xen_pagezone, + NULL); + extern int etext; /* End of kernel text (virtual address) */ extern int end; /* End of kernel binary (virtual address) */ /* Return pte flags according to kernel va access restrictions */