|
POK(kernelpart)
|
Syscalls management in SPARC. More...
#include <errno.h>#include <core/debug.h>#include <core/syscall.h>#include <core/partition.h>#include <types.h>#include <libc.h>#include "thread.h"#include "context_offset.h"#include "traps.h"#include "arch.h"Go to the source code of this file.
Functions | |
| void | pok_arch_sc_int (void) |
| void | pok_syscalls_init (void) |
Syscalls management in SPARC.
Definition in file syscalls.c.
| void pok_arch_sc_int | ( | void | ) |
Syscalls handler.
Definition at line 39 of file syscalls.c.
{
uint8_t *ctx = (uint8_t *)pok_arch_sp;
uint32_t num = *(uint32_t *)((char *)ctx - I0_OFFSET);
uint8_t part_id;
pok_syscall_info_t syscall_info;
pok_ret_t syscall_ret;
pok_syscall_args_t syscall_args;
pok_syscall_id_t syscall_id;
part_id = pok_current_partition;
/* prepare syscall_info */
syscall_info.partition = part_id;
syscall_info.base_addr = pok_partitions[part_id].base_addr;
syscall_info.thread = POK_SCHED_CURRENT_THREAD;
/* prepare syscall_args */
syscall_args.arg1 = *(uint32_t *)(ctx - I1_OFFSET);
syscall_args.arg2 = *(uint32_t *)(ctx - I2_OFFSET);
syscall_args.arg3 = *(uint32_t *)(ctx - I3_OFFSET);
syscall_args.arg4 = *(uint32_t *)(ctx - I4_OFFSET);
syscall_args.arg5 = *(uint32_t *)(ctx - I5_OFFSET);
syscall_args.nargs = 5;
/* prepare syscall_id */
syscall_id = (pok_syscall_id_t) num;
/*
* No pointer check needed, syscall_args is allocated in kernel stack.
*/
syscall_ret = pok_core_syscall (syscall_id, &syscall_args, &syscall_info);
*(uint32_t *)(ctx - I0_OFFSET) = syscall_ret;
*(uint32_t *)(ctx - PC_OFFSET) += 4; // skip "ta" instruction
*(uint32_t *)(ctx - NPC_OFFSET) += 4;
}
| void pok_syscalls_init | ( | void | ) |
Syscalls initialization. Just register the syscall handler.
Definition at line 83 of file syscalls.c.