Skip to content

Commit 4b53b0c

Browse files
committed
Add syscall dispatcher abstraction layer
The generic syscall dispatcher coupled privilege transition mechanisms with table lookup logic, preventing architecture-specific trap implementations from reusing the dispatch table. Introduce separate dispatcher for direct table lookup that trap handlers can invoke without triggering privilege transitions. Mark user-space interface as weak symbol to enable architecture overrides. Rename wrapper functions to match generated short names.
1 parent 3d94a32 commit 4b53b0c

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

kernel/syscall.c

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,30 @@ SYSCALL_TABLE
1616
static const void *syscall_table[SYS_COUNT] = {SYSCALL_TABLE};
1717
#undef _
1818

19-
/* Weak, generic dispatcher */
20-
int syscall(int num, void *a1, void *a2, void *a3)
19+
/* Core syscall execution via direct table lookup.
20+
* Called by trap handlers to invoke syscall implementations without
21+
* triggering privilege transitions. User space must not call this directly.
22+
*/
23+
int do_syscall(int num, void *a1, void *a2, void *a3)
2124
{
2225
if (unlikely(num <= 0 || num >= SYS_COUNT))
2326
return -ENOSYS;
2427

25-
/* safety check for valid function pointer */
2628
if (unlikely(!syscall_table[num]))
2729
return -ENOSYS;
2830

2931
return ((int (*)(void *, void *, void *)) syscall_table[num])(a1, a2, a3);
3032
}
3133

34+
/* Generic user-space syscall interface.
35+
* This weak symbol allows architecture-specific implementations to override
36+
* with trap-based entry mechanisms.
37+
*/
38+
__attribute__((weak)) int syscall(int num, void *a1, void *a2, void *a3)
39+
{
40+
return do_syscall(num, a1, a2, a3);
41+
}
42+
3243
static char *_env[1] = {0};
3344
char **environ = _env;
3445
int errno = 0;
@@ -239,7 +250,7 @@ static int _tadd(void *task, int stack_size)
239250
return mo_task_spawn(task, stack_size);
240251
}
241252

242-
int sys_task_add(void *task, int stack_size)
253+
int sys_tadd(void *task, int stack_size)
243254
{
244255
return syscall(SYS_tadd, task, (void *) stack_size, 0);
245256
}
@@ -252,7 +263,7 @@ static int _tcancel(int id)
252263
return mo_task_cancel(id);
253264
}
254265

255-
int sys_task_cancel(int id)
266+
int sys_tcancel(int id)
256267
{
257268
return syscall(SYS_tcancel, (void *) id, 0, 0);
258269
}
@@ -263,7 +274,7 @@ static int _tyield(void)
263274
return 0;
264275
}
265276

266-
int sys_task_yield(void)
277+
int sys_tyield(void)
267278
{
268279
return syscall(SYS_tyield, 0, 0, 0);
269280
}
@@ -277,7 +288,7 @@ static int _tdelay(int ticks)
277288
return 0;
278289
}
279290

280-
int sys_task_delay(int ticks)
291+
int sys_tdelay(int ticks)
281292
{
282293
return syscall(SYS_tdelay, (void *) ticks, 0, 0);
283294
}
@@ -290,7 +301,7 @@ static int _tsuspend(int id)
290301
return mo_task_suspend(id);
291302
}
292303

293-
int sys_task_suspend(int id)
304+
int sys_tsuspend(int id)
294305
{
295306
return syscall(SYS_tsuspend, (void *) id, 0, 0);
296307
}
@@ -303,7 +314,7 @@ static int _tresume(int id)
303314
return mo_task_resume(id);
304315
}
305316

306-
int sys_task_resume(int id)
317+
int sys_tresume(int id)
307318
{
308319
return syscall(SYS_tresume, (void *) id, 0, 0);
309320
}
@@ -316,7 +327,7 @@ static int _tpriority(int id, int priority)
316327
return mo_task_priority(id, priority);
317328
}
318329

319-
int sys_task_priority(int id, int priority)
330+
int sys_tpriority(int id, int priority)
320331
{
321332
return syscall(SYS_tpriority, (void *) id, (void *) priority, 0);
322333
}
@@ -326,7 +337,7 @@ static int _tid(void)
326337
return mo_task_id();
327338
}
328339

329-
int sys_task_id(void)
340+
int sys_tid(void)
330341
{
331342
return syscall(SYS_tid, 0, 0, 0);
332343
}
@@ -337,7 +348,7 @@ static int _twfi(void)
337348
return 0;
338349
}
339350

340-
int sys_task_wfi(void)
351+
int sys_twfi(void)
341352
{
342353
return syscall(SYS_twfi, 0, 0, 0);
343354
}
@@ -347,7 +358,7 @@ static int _tcount(void)
347358
return mo_task_count();
348359
}
349360

350-
int sys_task_count(void)
361+
int sys_tcount(void)
351362
{
352363
return syscall(SYS_tcount, 0, 0, 0);
353364
}

0 commit comments

Comments
 (0)