Skip to content

Commit a01aa82

Browse files
committed
vregion: allocate the metadata separately
Allocating vregion metadata together with the actual memory buffer makes that metadata accessible and writable by userspace modules. Fix this by allocating the metadata separately. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 0250d65 commit a01aa82

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

zephyr/lib/vregion.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,23 +117,24 @@ struct vregion *vregion_create(size_t lifetime_size, size_t interim_size)
117117
return NULL;
118118
}
119119

120-
/*
121-
* Align up lifetime sizes and interim sizes to nearest page, the
122-
* vregion structure is stored in lifetime area so account for its size too.
123-
*/
124-
lifetime_size += sizeof(*vr);
120+
/* Align up lifetime sizes and interim sizes to nearest page */
125121
lifetime_size = ALIGN_UP(lifetime_size, CONFIG_MM_DRV_PAGE_SIZE);
126122
interim_size = ALIGN_UP(interim_size, CONFIG_MM_DRV_PAGE_SIZE);
127123
total_size = lifetime_size + interim_size;
128124

125+
vr = rmalloc(0, sizeof(*vr));
126+
if (!vr)
127+
return NULL;
128+
129129
/* allocate pages for vregion */
130130
pages = total_size / CONFIG_MM_DRV_PAGE_SIZE;
131131
vregion_base = vpage_alloc(pages);
132-
if (!vregion_base)
132+
if (!vregion_base) {
133+
rfree(vr);
133134
return NULL;
135+
}
134136

135137
/* init vregion - place it at the start of the lifetime region */
136-
vr = (struct vregion *)(vregion_base + interim_size);
137138
vr->base = vregion_base;
138139
vr->size = total_size;
139140
vr->pages = pages;
@@ -147,9 +148,8 @@ struct vregion *vregion_create(size_t lifetime_size, size_t interim_size)
147148
vr->lifetime.base = vr->base + interim_size;
148149

149150
/* set alloc ptr addresses for lifetime linear partitions */
150-
vr->lifetime.ptr = vr->lifetime.base +
151-
ALIGN_UP(sizeof(*vr), CONFIG_DCACHE_LINE_SIZE); /* skip vregion struct */
152-
vr->lifetime.used = ALIGN_UP(sizeof(*vr), CONFIG_DCACHE_LINE_SIZE);
151+
vr->lifetime.ptr = vr->lifetime.base;
152+
vr->lifetime.used = 0;
153153

154154
/* init interim heaps */
155155
k_heap_init(&vr->interim.heap, vr->interim.heap.heap.init_mem, interim_size);
@@ -205,6 +205,7 @@ struct vregion *vregion_put(struct vregion *vr)
205205
LOG_DBG("destroy %p size %#zx pages %u", (void *)vr->base, vr->size, vr->pages);
206206
LOG_DBG(" lifetime used %zu free count %d", vr->lifetime.used, vr->lifetime.free_count);
207207
vpage_free(vr->base);
208+
rfree(vr);
208209

209210
return NULL;
210211
}

0 commit comments

Comments
 (0)