Skip to content

Commit ce9f1aa

Browse files
committed
vregion: make 3 vregion API functions syscalls
vregion_get(), vregion_put() and vregion_set_interim() should also be callable from the userspace. Make them syscalls. Also remove redundant symbol exporting since the vregion API shouldn't be used directly by LLEXT modules. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 6012f09 commit ce9f1aa

3 files changed

Lines changed: 55 additions & 50 deletions

File tree

src/include/sof/lib/vregion.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct vregion *vregion_create(size_t memsize);
5151
*
5252
* @param[in] vr Pointer to the virtual region instance.
5353
*/
54-
void vregion_set_interim(struct vregion *vr);
54+
__syscall void vregion_set_interim(struct vregion *vr);
5555

5656
/**
5757
* @brief Increment virtual region's user count.
@@ -62,7 +62,7 @@ void vregion_set_interim(struct vregion *vr);
6262
* @param[in] vr Pointer to the virtual region instance to release.
6363
* @return struct vregion* Pointer to the virtual region instance.
6464
*/
65-
struct vregion *vregion_get(struct vregion *vr);
65+
__syscall struct vregion *vregion_get(struct vregion *vr);
6666

6767
/**
6868
* @brief Decrement virtual region's user count or destroy it.
@@ -73,7 +73,7 @@ struct vregion *vregion_get(struct vregion *vr);
7373
* @param[in] vr Pointer to the virtual region instance to release.
7474
* @return struct vregion* Pointer to the virtual region instance or NULL if it has been destroyed.
7575
*/
76-
struct vregion *vregion_put(struct vregion *vr);
76+
__syscall struct vregion *vregion_put(struct vregion *vr);
7777

7878
/**
7979
* @brief Allocate memory from the specified virtual region.
@@ -133,6 +133,8 @@ void vregion_info(struct vregion *vr);
133133
*/
134134
void vregion_mem_info(struct vregion *vr, size_t *size, uintptr_t *start);
135135

136+
#include <zephyr/syscalls/vregion.h>
137+
136138
#else /* CONFIG_SOF_VREGIONS */
137139

138140
struct vregion {
@@ -183,8 +185,4 @@ static inline void vregion_mem_info(struct vregion *vr, size_t *size, uintptr_t
183185
}
184186
#endif
185187

186-
#if CONFIG_SOF_VREGIONS
187-
#include <zephyr/syscalls/vregion.h>
188-
#endif
189-
190188
#endif /* __SOF_LIB_VREGION_H__ */

zephyr/lib/vregion.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <zephyr/logging/log.h>
1212
#include <sof/lib/vpage.h>
1313
#include <sof/lib/vregion.h>
14+
#include <sof/schedule/ll_schedule_domain.h>
1415
#include <rtos/alloc.h>
1516
#include <sof/common.h>
1617

@@ -161,12 +162,12 @@ struct vregion *vregion_create(size_t memsize)
161162

162163
/* log the new vregion */
163164
LOG_INF("new at base %p size %#zx pages %u metadata at %p",
164-
(void *)vr->base, total_size, pages, (void *)vr);
165+
(void *)vregion_base, total_size, pages, (void *)vr);
165166

166167
return vr;
167168
}
168169

169-
struct vregion *vregion_get(struct vregion *vr)
170+
struct vregion *z_impl_vregion_get(struct vregion *vr)
170171
{
171172
if (!vr)
172173
return NULL;
@@ -184,7 +185,7 @@ struct vregion *vregion_get(struct vregion *vr)
184185
* @param[in] vr Pointer to the virtual region instance to release.
185186
* @return struct vregion* Pointer to the virtual region instance or NULL if it has been destroyed.
186187
*/
187-
struct vregion *vregion_put(struct vregion *vr)
188+
struct vregion *z_impl_vregion_put(struct vregion *vr)
188189
{
189190
unsigned int use_count;
190191

@@ -259,7 +260,7 @@ static void interim_heap_init(struct vregion *vr)
259260
vr->lifetime.used = (uint8_t *)vr->lifetime.ptr - (uint8_t *)vr->lifetime.base;
260261
}
261262

262-
void vregion_set_interim(struct vregion *vr)
263+
void z_impl_vregion_set_interim(struct vregion *vr)
263264
{
264265
if (!vr)
265266
return;
@@ -390,7 +391,6 @@ void z_impl_vregion_free(struct vregion *vr, void *ptr)
390391

391392
k_mutex_unlock(&vr->lock);
392393
}
393-
EXPORT_SYMBOL(z_impl_vregion_free);
394394

395395
/**
396396
* @brief Allocate memory from the virtual region.
@@ -430,7 +430,6 @@ void *z_impl_vregion_alloc_align(struct vregion *vr,
430430

431431
return p;
432432
}
433-
EXPORT_SYMBOL(z_impl_vregion_alloc_align);
434433

435434
/**
436435
* @brief Allocate memory from the virtual region.
@@ -442,7 +441,6 @@ void *z_impl_vregion_alloc(struct vregion *vr, size_t size)
442441
{
443442
return z_impl_vregion_alloc_align(vr, size, 0);
444443
}
445-
EXPORT_SYMBOL(z_impl_vregion_alloc);
446444

447445
void *z_impl_vregion_alloc_coherent(struct vregion *vr, size_t size)
448446
{
@@ -457,7 +455,6 @@ void *z_impl_vregion_alloc_coherent(struct vregion *vr, size_t size)
457455

458456
return sys_cache_uncached_ptr_get(p);
459457
}
460-
EXPORT_SYMBOL(z_impl_vregion_alloc_coherent);
461458

462459
void *z_impl_vregion_alloc_coherent_align(struct vregion *vr, size_t size, size_t alignment)
463460
{
@@ -474,7 +471,6 @@ void *z_impl_vregion_alloc_coherent_align(struct vregion *vr, size_t size, size_
474471

475472
return sys_cache_uncached_ptr_get(p);
476473
}
477-
EXPORT_SYMBOL(z_impl_vregion_alloc_coherent_align);
478474

479475
/**
480476
* @brief Log virtual region memory usage.
@@ -491,7 +487,6 @@ void vregion_info(struct vregion *vr)
491487
LOG_INF("lifetime used %#zx free count %d",
492488
vr->lifetime.used, vr->lifetime.free_count);
493489
}
494-
EXPORT_SYMBOL(vregion_info);
495490

496491
void vregion_mem_info(struct vregion *vr, size_t *size, uintptr_t *start)
497492
{

zephyr/syscall/vregion.c

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,68 +6,80 @@
66
#include <zephyr/kernel.h>
77
#include <zephyr/internal/syscall_handler.h>
88

9-
static inline void *z_vrfy_vregion_alloc(struct vregion *vr, size_t size)
9+
static bool vregion_verify(struct vregion *vr)
1010
{
11+
if (!vr)
12+
return false;
13+
1114
size_t vr_size = 0;
1215
uintptr_t vr_start;
1316

1417
vregion_mem_info(vr, &vr_size, &vr_start);
1518
if (vr_size)
1619
K_OOPS(K_SYSCALL_MEMORY_WRITE((void *)vr_start, vr_size));
1720

18-
return z_impl_vregion_alloc(vr, size);
21+
return true;
22+
}
23+
24+
static inline void *z_vrfy_vregion_alloc(struct vregion *vr, size_t size)
25+
{
26+
if (vregion_verify(vr))
27+
return z_impl_vregion_alloc(vr, size);
28+
return NULL;
1929
}
2030
#include <zephyr/syscalls/vregion_alloc_mrsh.c>
2131

2232
static inline void *z_vrfy_vregion_alloc_coherent(struct vregion *vr, size_t size)
2333
{
24-
size_t vr_size = 0;
25-
uintptr_t vr_start;
26-
27-
vregion_mem_info(vr, &vr_size, &vr_start);
28-
if (vr_size)
29-
K_OOPS(K_SYSCALL_MEMORY_WRITE((void *)vr_start, vr_size));
30-
31-
return z_impl_vregion_alloc_coherent(vr, size);
34+
if (vregion_verify(vr))
35+
return z_impl_vregion_alloc_coherent(vr, size);
36+
return NULL;
3237
}
3338
#include <zephyr/syscalls/vregion_alloc_coherent_mrsh.c>
3439

3540
static inline void *z_vrfy_vregion_alloc_align(struct vregion *vr, size_t size, size_t alignment)
3641
{
37-
size_t vr_size = 0;
38-
uintptr_t vr_start;
39-
40-
vregion_mem_info(vr, &vr_size, &vr_start);
41-
if (vr_size)
42-
K_OOPS(K_SYSCALL_MEMORY_WRITE((void *)vr_start, vr_size));
43-
44-
return z_impl_vregion_alloc_align(vr, size, alignment);
42+
if (vregion_verify(vr))
43+
return z_impl_vregion_alloc_align(vr, size, alignment);
44+
return NULL;
4545
}
4646
#include <zephyr/syscalls/vregion_alloc_align_mrsh.c>
4747

4848
static inline void *z_vrfy_vregion_alloc_coherent_align(struct vregion *vr,
4949
size_t size, size_t alignment)
5050
{
51-
size_t vr_size = 0;
52-
uintptr_t vr_start;
53-
54-
vregion_mem_info(vr, &vr_size, &vr_start);
55-
if (vr_size)
56-
K_OOPS(K_SYSCALL_MEMORY_WRITE((void *)vr_start, vr_size));
57-
58-
return z_impl_vregion_alloc_coherent_align(vr, size, alignment);
51+
if (vregion_verify(vr))
52+
return z_impl_vregion_alloc_coherent_align(vr, size, alignment);
53+
return NULL;
5954
}
6055
#include <zephyr/syscalls/vregion_alloc_coherent_align_mrsh.c>
6156

6257
static inline void z_vrfy_vregion_free(struct vregion *vr, void *ptr)
6358
{
64-
size_t vr_size = 0;
65-
uintptr_t vr_start;
59+
if (vregion_verify(vr))
60+
z_impl_vregion_free(vr, ptr);
61+
}
62+
#include <zephyr/syscalls/vregion_free_mrsh.c>
6663

67-
vregion_mem_info(vr, &vr_size, &vr_start);
68-
if (vr_size)
69-
K_OOPS(K_SYSCALL_MEMORY_WRITE((void *)vr_start, vr_size));
64+
struct vregion *z_vrfy_vregion_get(struct vregion *vr)
65+
{
66+
if (vregion_verify(vr))
67+
return z_impl_vregion_get(vr);
68+
return NULL;
69+
}
70+
#include <zephyr/syscalls/vregion_get_mrsh.c>
7071

71-
z_impl_vregion_free(vr, ptr);
72+
struct vregion *z_vrfy_vregion_put(struct vregion *vr)
73+
{
74+
if (vregion_verify(vr))
75+
return z_impl_vregion_put(vr);
76+
return NULL;
7277
}
73-
#include <zephyr/syscalls/vregion_free_mrsh.c>
78+
#include <zephyr/syscalls/vregion_put_mrsh.c>
79+
80+
void z_vrfy_vregion_set_interim(struct vregion *vr)
81+
{
82+
if (vregion_verify(vr))
83+
z_impl_vregion_set_interim(vr);
84+
}
85+
#include <zephyr/syscalls/vregion_set_interim_mrsh.c>

0 commit comments

Comments
 (0)