hw: centralize permission check of kernel calls

ref #1101
This commit is contained in:
Martin Stein 2014-03-25 17:23:33 +01:00 committed by Norman Feske
parent 02c16e7106
commit 7ffcc74d72

View File

@ -268,12 +268,6 @@ char const * Kernel::Thread::pd_label() const
void Thread::_call_new_pd() void Thread::_call_new_pd()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to create protection domain");
user_arg_0(0);
return;
}
/* create translation lookaside buffer and protection domain */ /* create translation lookaside buffer and protection domain */
void * p = (void *)user_arg_1(); void * p = (void *)user_arg_1();
Tlb * const tlb = new (p) Tlb(); Tlb * const tlb = new (p) Tlb();
@ -285,12 +279,6 @@ void Thread::_call_new_pd()
void Thread::_call_bin_pd() void Thread::_call_bin_pd()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to destruct protection domain");
user_arg_0(-1);
return;
}
/* lookup protection domain */ /* lookup protection domain */
unsigned id = user_arg_1(); unsigned id = user_arg_1();
Pd * const pd = Pd::pool()->object(id); Pd * const pd = Pd::pool()->object(id);
@ -312,12 +300,6 @@ void Thread::_call_bin_pd()
void Thread::_call_new_thread() void Thread::_call_new_thread()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to create thread");
user_arg_0(0);
return;
}
/* create new thread */ /* create new thread */
void * const p = (void *)user_arg_1(); void * const p = (void *)user_arg_1();
unsigned const priority = user_arg_2(); unsigned const priority = user_arg_2();
@ -329,11 +311,6 @@ void Thread::_call_new_thread()
void Thread::_call_bin_thread() void Thread::_call_bin_thread()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to bin thread");
return;
}
/* lookup thread */ /* lookup thread */
Thread * const thread = Thread::pool()->object(user_arg_1()); Thread * const thread = Thread::pool()->object(user_arg_1());
if (!thread) { if (!thread) {
@ -347,12 +324,6 @@ void Thread::_call_bin_thread()
void Thread::_call_start_thread() void Thread::_call_start_thread()
{ {
/* check permissions */
if (!_core()) {
PWRN("permission denied");
user_arg_0(0);
return;
}
/* lookup thread */ /* lookup thread */
unsigned const thread_id = user_arg_1(); unsigned const thread_id = user_arg_1();
Thread * const thread = Thread::pool()->object(thread_id); Thread * const thread = Thread::pool()->object(thread_id);
@ -389,11 +360,6 @@ void Thread::_call_pause_current_thread() { _pause(); }
void Thread::_call_pause_thread() void Thread::_call_pause_thread()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to pause thread");
return;
}
/* lookup thread */ /* lookup thread */
Thread * const thread = Thread::pool()->object(user_arg_1()); Thread * const thread = Thread::pool()->object(user_arg_1());
if (!thread) { if (!thread) {
@ -407,12 +373,6 @@ void Thread::_call_pause_thread()
void Thread::_call_resume_thread() void Thread::_call_resume_thread()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to resume thread");
_stop();
return;
}
/* lookup thread */ /* lookup thread */
Thread * const thread = Thread::pool()->object(user_arg_1()); Thread * const thread = Thread::pool()->object(user_arg_1());
if (!thread) { if (!thread) {
@ -509,12 +469,6 @@ void Thread::_call_send_reply_msg()
void Thread::_call_route_thread_event() void Thread::_call_route_thread_event()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to route thread event");
user_arg_0(-1);
return;
}
/* get targeted thread */ /* get targeted thread */
unsigned const thread_id = user_arg_1(); unsigned const thread_id = user_arg_1();
Thread * const t = Thread::pool()->object(thread_id); Thread * const t = Thread::pool()->object(thread_id);
@ -570,16 +524,10 @@ unsigned Thread_event::signal_context_id() const
void Thread::_call_access_thread_regs() void Thread::_call_access_thread_regs()
{ {
/* check permissions */
unsigned const reads = user_arg_2();
unsigned const writes = user_arg_3();
if (!_core()) {
PWRN("not entitled to access thread regs");
user_arg_0(reads + writes);
return;
}
/* get targeted thread */ /* get targeted thread */
unsigned const thread_id = user_arg_1(); unsigned const thread_id = user_arg_1();
unsigned const reads = user_arg_2();
unsigned const writes = user_arg_3();
Thread * const t = Thread::pool()->object(thread_id); Thread * const t = Thread::pool()->object(thread_id);
if (!t) { if (!t) {
PWRN("unknown thread"); PWRN("unknown thread");
@ -613,11 +561,6 @@ void Thread::_call_access_thread_regs()
void Thread::_call_update_pd() void Thread::_call_update_pd()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to update domain");
return;
}
/* update hardware caches */ /* update hardware caches */
Processor::flush_tlb_by_pid(user_arg_1()); Processor::flush_tlb_by_pid(user_arg_1());
} }
@ -625,11 +568,6 @@ void Thread::_call_update_pd()
void Thread::_call_update_region() void Thread::_call_update_region()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to update region");
return;
}
/* flush hardware caches */ /* flush hardware caches */
Processor::flush_data_cache_by_virt_region((addr_t)user_arg_1(), Processor::flush_data_cache_by_virt_region((addr_t)user_arg_1(),
(size_t)user_arg_2()); (size_t)user_arg_2());
@ -716,12 +654,6 @@ void Thread::_call_print_char()
void Thread::_call_new_signal_receiver() void Thread::_call_new_signal_receiver()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to create signal receiver");
user_arg_0(0);
return;
}
/* create receiver */ /* create receiver */
void * const p = (void *)user_arg_1(); void * const p = (void *)user_arg_1();
Signal_receiver * const r = new (p) Signal_receiver(); Signal_receiver * const r = new (p) Signal_receiver();
@ -731,12 +663,6 @@ void Thread::_call_new_signal_receiver()
void Thread::_call_new_signal_context() void Thread::_call_new_signal_context()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to create signal context");
user_arg_0(0);
return;
}
/* lookup receiver */ /* lookup receiver */
unsigned const id = user_arg_2(); unsigned const id = user_arg_2();
Signal_receiver * const r = Signal_receiver::pool()->object(id); Signal_receiver * const r = Signal_receiver::pool()->object(id);
@ -850,12 +776,6 @@ void Thread::_call_kill_signal_context()
void Thread::_call_bin_signal_context() void Thread::_call_bin_signal_context()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to kill signal context");
user_arg_0(-1);
return;
}
/* lookup signal context */ /* lookup signal context */
unsigned const id = user_arg_1(); unsigned const id = user_arg_1();
Signal_context * const c = Signal_context::pool()->object(id); Signal_context * const c = Signal_context::pool()->object(id);
@ -872,12 +792,6 @@ void Thread::_call_bin_signal_context()
void Thread::_call_bin_signal_receiver() void Thread::_call_bin_signal_receiver()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to kill signal receiver");
user_arg_0(-1);
return;
}
/* lookup signal receiver */ /* lookup signal receiver */
unsigned const id = user_arg_1(); unsigned const id = user_arg_1();
Signal_receiver * const r = Signal_receiver::pool()->object(id); Signal_receiver * const r = Signal_receiver::pool()->object(id);
@ -893,12 +807,6 @@ void Thread::_call_bin_signal_receiver()
void Thread::_call_new_vm() void Thread::_call_new_vm()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to create virtual machine");
user_arg_0(0);
return;
}
/* lookup signal context */ /* lookup signal context */
auto const context = Signal_context::pool()->object(user_arg_3()); auto const context = Signal_context::pool()->object(user_arg_3());
if (!context) { if (!context) {
@ -919,11 +827,6 @@ void Thread::_call_new_vm()
void Thread::_call_run_vm() void Thread::_call_run_vm()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to run virtual machine");
return;
}
/* lookup virtual machine */ /* lookup virtual machine */
Vm * const vm = Vm::pool()->object(user_arg_1()); Vm * const vm = Vm::pool()->object(user_arg_1());
if (!vm) { if (!vm) {
@ -937,11 +840,6 @@ void Thread::_call_run_vm()
void Thread::_call_pause_vm() void Thread::_call_pause_vm()
{ {
/* check permissions */
if (!_core()) {
PWRN("not entitled to pause virtual machine");
return;
}
/* lookup virtual machine */ /* lookup virtual machine */
Vm * const vm = Vm::pool()->object(user_arg_1()); Vm * const vm = Vm::pool()->object(user_arg_1());
if (!vm) { if (!vm) {
@ -979,39 +877,52 @@ int Thread::_write_reg(addr_t const id, addr_t const value)
void Thread::_call(unsigned const processor_id) void Thread::_call(unsigned const processor_id)
{ {
switch (user_arg_0()) { /* switch over unrestricted kernel calls */
case call_id_new_thread(): _call_new_thread(); return; unsigned const call_id = user_arg_0();
case call_id_bin_thread(): _call_bin_thread(); return; switch (call_id) {
case call_id_start_thread(): _call_start_thread(); return;
case call_id_pause_current_thread(): _call_pause_current_thread(); return; case call_id_pause_current_thread(): _call_pause_current_thread(); return;
case call_id_pause_thread(): _call_pause_thread(); return;
case call_id_resume_thread(): _call_resume_thread(); return;
case call_id_resume_local_thread(): _call_resume_local_thread(); return; case call_id_resume_local_thread(): _call_resume_local_thread(); return;
case call_id_yield_thread(): _call_yield_thread(); return; case call_id_yield_thread(): _call_yield_thread(); return;
case call_id_send_request_msg(): _call_send_request_msg(); return; case call_id_send_request_msg(): _call_send_request_msg(); return;
case call_id_send_reply_msg(): _call_send_reply_msg(); return; case call_id_send_reply_msg(): _call_send_reply_msg(); return;
case call_id_await_request_msg(): _call_await_request_msg(); return; case call_id_await_request_msg(): _call_await_request_msg(); return;
case call_id_update_pd(): _call_update_pd(); return;
case call_id_update_region(): _call_update_region(); return;
case call_id_new_pd(): _call_new_pd(); return;
case call_id_print_char(): _call_print_char(); return;
case call_id_new_signal_receiver(): _call_new_signal_receiver(); return;
case call_id_new_signal_context(): _call_new_signal_context(); return;
case call_id_kill_signal_context(): _call_kill_signal_context(); return; case call_id_kill_signal_context(): _call_kill_signal_context(); return;
case call_id_bin_signal_context(): _call_bin_signal_context(); return;
case call_id_bin_signal_receiver(): _call_bin_signal_receiver(); return;
case call_id_await_signal(): _call_await_signal(); return;
case call_id_submit_signal(): _call_submit_signal(); return; case call_id_submit_signal(): _call_submit_signal(); return;
case call_id_await_signal(): _call_await_signal(); return;
case call_id_signal_pending(): _call_signal_pending(); return; case call_id_signal_pending(): _call_signal_pending(); return;
case call_id_ack_signal(): _call_ack_signal(); return; case call_id_ack_signal(): _call_ack_signal(); return;
case call_id_new_vm(): _call_new_vm(); return; case call_id_print_char(): _call_print_char(); return;
case call_id_run_vm(): _call_run_vm(); return; default:
case call_id_pause_vm(): _call_pause_vm(); return; /* check wether this is a core thread */
case call_id_bin_pd(): _call_bin_pd(); return; if (!_core()) {
case call_id_access_thread_regs(): _call_access_thread_regs(); return; PWRN("not entitled to do kernel call");
case call_id_route_thread_event(): _call_route_thread_event(); return; _stop();
return;
}
}
/* switch over kernel calls that are restricted to core */
switch (call_id) {
case call_id_new_thread(): _call_new_thread(); return;
case call_id_bin_thread(): _call_bin_thread(); return;
case call_id_start_thread(): _call_start_thread(); return;
case call_id_resume_thread(): _call_resume_thread(); return;
case call_id_access_thread_regs(): _call_access_thread_regs(); return;
case call_id_route_thread_event(): _call_route_thread_event(); return;
case call_id_update_pd(): _call_update_pd(); return;
case call_id_update_region(): _call_update_region(); return;
case call_id_new_pd(): _call_new_pd(); return;
case call_id_bin_pd(): _call_bin_pd(); return;
case call_id_new_signal_receiver(): _call_new_signal_receiver(); return;
case call_id_new_signal_context(): _call_new_signal_context(); return;
case call_id_bin_signal_context(): _call_bin_signal_context(); return;
case call_id_bin_signal_receiver(): _call_bin_signal_receiver(); return;
case call_id_new_vm(): _call_new_vm(); return;
case call_id_run_vm(): _call_run_vm(); return;
case call_id_pause_vm(): _call_pause_vm(); return;
case call_id_pause_thread(): _call_pause_thread(); return;
default: default:
PWRN("unknown kernel call"); PWRN("unknown kernel call");
_stop(); _stop();
return;
} }
} }