The Pedigree Project 0.1
KernelCoreSyscallManager.cc
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include "pedigree/kernel/Log.h"
21#include "pedigree/kernel/process/Scheduler.h"
22#include "pedigree/kernel/processor/KernelCoreSyscallManager.h"
23#include "pedigree/kernel/processor/SyscallManager.h"
24#include "pedigree/kernel/processor/Syscalls.h"
25#include "pedigree/kernel/processor/state.h"
26
28
30
32
33void KernelCoreSyscallManager::initialise() {
34 for (int i = 0; i < 16; i++) {
35 m_Functions[i] = 0;
36 }
37 if (!SyscallManager::instance().registerSyscallHandler(kernelCore, this, m_Registration)) {
38 FATAL("Kernel-core syscall service registration failed.");
39 }
40}
41
42uintptr_t KernelCoreSyscallManager::call(Function_t function, uintptr_t p1, uintptr_t p2,
43 uintptr_t p3, uintptr_t p4, uintptr_t p5) {
44 // if (function >= serviceEnd)
45 // {
46 // ERROR("KernelCoreSyscallManager: invalid function called: " << Dec <<
47 // static_cast<int>(function)); return 0;
48 // }
49 return SyscallManager::instance().syscall(kernelCore, function, p1, p2, p3, p4, p5);
50}
51
52uintptr_t KernelCoreSyscallManager::syscall(SyscallState& state) {
53 NOTICE("???");
54 switch (state.getSyscallNumber()) {
55 case yield:
56#if THREADS
58#endif
59 return 0;
60 default: {
61 if (state.getSyscallNumber() >= 16 || m_Functions[state.getSyscallNumber()] == 0) {
62 ERROR("KernelCoreSyscallManager: invalid syscall received: " << Dec
63 << state.getSyscallNumber());
64 return 0;
65 } else {
66 return m_Functions[state.getSyscallNumber()](state);
67 }
68 }
69 }
70}
71
72uintptr_t KernelCoreSyscallManager::registerSyscall(Function_t function, SyscallCallback func) {
73 m_Functions[function] = func;
74 return 0;
75}
virtual uintptr_t syscall(SyscallState &state)
uintptr_t call(Function_t function, uintptr_t p1=0, uintptr_t p2=0, uintptr_t p3=0, uintptr_t p4=0, uintptr_t p5=0)
uintptr_t registerSyscall(Function_t function, SyscallCallback func)
static KernelCoreSyscallManager m_Instance
static Scheduler & instance()
Definition Scheduler.h:96
void yield()
Definition Scheduler.cc:236
virtual uintptr_t syscall(Service_t service, uintptr_t function, uintptr_t p1=0, uintptr_t p2=0, uintptr_t p3=0, uintptr_t p4=0, uintptr_t p5=0)=0
static EXPORTED_PUBLIC SyscallManager & instance()
@ Dec
Definition Log.h:126