@@ -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