Added privilidges
This commit is contained in:
62
task.c
62
task.c
@@ -69,6 +69,7 @@ void task_init(BootInfo *Boot)
|
||||
for (i = 0; i < TASK_MAX; i++) {
|
||||
tasks[i].state = TASK_STATE_FREE;
|
||||
tasks[i].pid = 0;
|
||||
tasks[i].privilege = TASK_PRIV_USER;
|
||||
tasks[i].saved_rsp = 0;
|
||||
tasks[i].stack_base = 0;
|
||||
tasks[i].stack_pages = 0;
|
||||
@@ -84,9 +85,10 @@ void task_init(BootInfo *Boot)
|
||||
* allocate one. Its saved_rsp will be filled in during the
|
||||
* first context_switch call in task_yield().
|
||||
*/
|
||||
tasks[0].pid = next_pid++;
|
||||
tasks[0].state = TASK_STATE_RUNNING;
|
||||
tasks[0].switches = 1;
|
||||
tasks[0].pid = next_pid++;
|
||||
tasks[0].state = TASK_STATE_RUNNING;
|
||||
tasks[0].privilege = TASK_PRIV_KERNEL;
|
||||
tasks[0].switches = 1;
|
||||
wstrcpy16(tasks[0].name, L"core", TASK_NAME_LEN);
|
||||
|
||||
current_task = &tasks[0];
|
||||
@@ -119,7 +121,10 @@ static void task_trampoline(void)
|
||||
* Create a new task
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
Task *task_create(const CHAR16 *name, TaskEntryFn entry, void *arg)
|
||||
Task *task_create_with_priv(const CHAR16 *name,
|
||||
TaskEntryFn entry,
|
||||
void *arg,
|
||||
TaskPrivilege privilege)
|
||||
{
|
||||
Task *t = NULL;
|
||||
UINTN i;
|
||||
@@ -130,6 +135,14 @@ Task *task_create(const CHAR16 *name, TaskEntryFn entry, void *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Subsystem-level privilege enforcement: prevent privilege escalation. */
|
||||
{
|
||||
Task *caller = task_current();
|
||||
if (caller != NULL && privilege > task_get_privilege(caller)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Find a free PCB slot */
|
||||
for (i = 0; i < TASK_MAX; i++) {
|
||||
if (tasks[i].state == TASK_STATE_FREE) {
|
||||
@@ -150,6 +163,7 @@ Task *task_create(const CHAR16 *name, TaskEntryFn entry, void *arg)
|
||||
/* Fill in the PCB */
|
||||
t->pid = next_pid++;
|
||||
t->state = TASK_STATE_READY;
|
||||
t->privilege = privilege;
|
||||
t->entry = entry;
|
||||
t->arg = arg;
|
||||
t->switches = 0;
|
||||
@@ -196,6 +210,15 @@ Task *task_create(const CHAR16 *name, TaskEntryFn entry, void *arg)
|
||||
return t;
|
||||
}
|
||||
|
||||
Task *task_create(const CHAR16 *name, TaskEntryFn entry, void *arg)
|
||||
{
|
||||
/* Inherit privilege from the calling task (kernel if no task context). */
|
||||
Task *caller = task_current();
|
||||
TaskPrivilege priv = (caller != NULL) ? task_get_privilege(caller)
|
||||
: TASK_PRIV_KERNEL;
|
||||
return task_create_with_priv(name, entry, arg, priv);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Schedule – pick the next READY task (round-robin)
|
||||
* ---------------------------------------------------------------- */
|
||||
@@ -318,6 +341,22 @@ Task *task_current(void)
|
||||
return current_task;
|
||||
}
|
||||
|
||||
TaskPrivilege task_get_privilege(Task *t)
|
||||
{
|
||||
if (t == NULL) {
|
||||
return TASK_PRIV_KERNEL;
|
||||
}
|
||||
return t->privilege;
|
||||
}
|
||||
|
||||
void task_set_privilege(Task *t, TaskPrivilege privilege)
|
||||
{
|
||||
if (t == NULL) {
|
||||
return;
|
||||
}
|
||||
t->privilege = privilege;
|
||||
}
|
||||
|
||||
UINTN task_count(void)
|
||||
{
|
||||
UINTN i, count = 0;
|
||||
@@ -366,19 +405,28 @@ static const CHAR16 *state_str(TaskState s)
|
||||
void task_print_list(BootInfo *Boot)
|
||||
{
|
||||
UINTN i;
|
||||
Task *caller;
|
||||
|
||||
/* Subsystem-level privilege enforcement: task list requires DRIVER. */
|
||||
caller = task_current();
|
||||
if (caller != NULL && task_get_privilege(caller) < TASK_PRIV_DRIVER) {
|
||||
SAFE_PRINT(Boot, L"Permission denied: task list requires driver privilege.\n\r");
|
||||
return;
|
||||
}
|
||||
|
||||
SAFE_PRINT(Boot, L"\n\r");
|
||||
SAFE_PRINT(Boot, L" PID STATE SWITCHES NAME\n\r");
|
||||
SAFE_PRINT(Boot, L" --- ---------- -------- ----\n\r");
|
||||
SAFE_PRINT(Boot, L" PID STATE PRIV SWITCHES NAME\n\r");
|
||||
SAFE_PRINT(Boot, L" --- ---------- ---- -------- ----\n\r");
|
||||
|
||||
for (i = 0; i < TASK_MAX; i++) {
|
||||
if (tasks[i].state == TASK_STATE_FREE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SAFE_PRINT(Boot, L" %3d %-10s %8d %s\n\r",
|
||||
SAFE_PRINT(Boot, L" %3d %-10s %4d %8d %s\n\r",
|
||||
tasks[i].pid,
|
||||
state_str(tasks[i].state),
|
||||
(INT32)tasks[i].privilege,
|
||||
tasks[i].switches,
|
||||
tasks[i].name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user