Skip to content

Commit 88419fe

Browse files
lyakhlgirdwood
authored andcommitted
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 3294951 commit 88419fe

1 file changed

Lines changed: 14 additions & 11 deletions

File tree

zephyr/lib/vregion.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,23 +117,25 @@ 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+
/* allocate vregion metadata separately to keep it inaccessible to the user */
126+
vr = rmalloc(0, sizeof(*vr));
127+
if (!vr)
128+
return NULL;
129+
129130
/* allocate pages for vregion */
130131
pages = total_size / CONFIG_MM_DRV_PAGE_SIZE;
131132
vregion_base = vpage_alloc(pages);
132-
if (!vregion_base)
133+
if (!vregion_base) {
134+
rfree(vr);
133135
return NULL;
136+
}
134137

135-
/* init vregion - place it at the start of the lifetime region */
136-
vr = (struct vregion *)(vregion_base + interim_size);
138+
/* init vregion */
137139
vr->base = vregion_base;
138140
vr->size = total_size;
139141
vr->pages = pages;
@@ -147,9 +149,9 @@ struct vregion *vregion_create(size_t lifetime_size, size_t interim_size)
147149
vr->lifetime.base = vr->base + interim_size;
148150

149151
/* 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);
152+
vr->lifetime.ptr = vr->lifetime.base;
153+
vr->lifetime.used = 0;
154+
vr->lifetime.free_count = 0;
153155

154156
/* init interim heaps */
155157
k_heap_init(&vr->interim.heap, vr->interim.heap.heap.init_mem, interim_size);
@@ -205,6 +207,7 @@ struct vregion *vregion_put(struct vregion *vr)
205207
LOG_DBG("destroy %p size %#zx pages %u", (void *)vr->base, vr->size, vr->pages);
206208
LOG_DBG(" lifetime used %zu free count %d", vr->lifetime.used, vr->lifetime.free_count);
207209
vpage_free(vr->base);
210+
rfree(vr);
208211

209212
return NULL;
210213
}

0 commit comments

Comments
 (0)