user_space #4
@ -52,7 +52,7 @@ void print_handler(struct cpu_state *frame, ulong intr)
|
|||||||
void pagefault_handler(struct cpu_state *frame, ulong intr)
|
void pagefault_handler(struct cpu_state *frame, ulong intr)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct kthread *current = getCurrentThread();
|
struct thread *current = getCurrentThread();
|
||||||
printf("page fault while in thread %s code at 0x%x when trying to access 0x%x err_code 0x%x\n", current->name,
|
printf("page fault while in thread %s code at 0x%x when trying to access 0x%x err_code 0x%x\n", current->name,
|
||||||
cpu_context_get_PC(frame), cpu_context_get_EX_faulting_vaddr(frame), cpu_context_get_EX_err(frame));
|
cpu_context_get_PC(frame), cpu_context_get_EX_faulting_vaddr(frame), cpu_context_get_EX_err(frame));
|
||||||
VGAPrintf(RED, BLACK, 0, VGA_HEIGHT - 1, "PAGE FAULT %d", intr);
|
VGAPrintf(RED, BLACK, 0, VGA_HEIGHT - 1, "PAGE FAULT %d", intr);
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include "time.h"
|
#include "time.h"
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
|
|
||||||
static struct kthread *currentThread;
|
static struct thread *currentThread;
|
||||||
static struct kthread *threadWithTimeout;
|
static struct thread *threadWithTimeout;
|
||||||
|
|
||||||
void kthreadExit()
|
void kthreadExit()
|
||||||
{
|
{
|
||||||
@ -16,8 +16,8 @@ void kthreadExit()
|
|||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
|
|
||||||
struct kthread *current = currentThread;
|
struct thread *current = currentThread;
|
||||||
struct kthread *next = kthreadSelectNext();
|
struct thread *next = kthreadSelectNext();
|
||||||
|
|
||||||
if (next == current)
|
if (next == current)
|
||||||
assert("cannot exit thread");
|
assert("cannot exit thread");
|
||||||
@ -35,7 +35,7 @@ void kthreadExit()
|
|||||||
|
|
||||||
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize)
|
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize)
|
||||||
{
|
{
|
||||||
struct kthread *current = (struct kthread *)malloc(sizeof(struct kthread));
|
struct thread *current = (struct thread *)malloc(sizeof(struct thread));
|
||||||
strzcpy(current->name, "[KINIT]", KTHREAD_NAME_MAX_LENGTH);
|
strzcpy(current->name, "[KINIT]", KTHREAD_NAME_MAX_LENGTH);
|
||||||
current->stackAddr = mainStack;
|
current->stackAddr = mainStack;
|
||||||
current->stackSize = mainStackSize;
|
current->stackSize = mainStackSize;
|
||||||
@ -48,9 +48,9 @@ int kthreadSetup(vaddr_t mainStack, size_t mainStackSize)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args)
|
struct thread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args)
|
||||||
{
|
{
|
||||||
struct kthread *thread = (struct kthread *)malloc(sizeof(struct kthread));
|
struct thread *thread = (struct thread *)malloc(sizeof(struct thread));
|
||||||
if (!thread)
|
if (!thread)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ free_mem:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kthreadDelete(struct kthread *thread)
|
void kthreadDelete(struct thread *thread)
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
@ -101,9 +101,9 @@ void kthreadDelete(struct kthread *thread)
|
|||||||
restore_IRQs(flags);
|
restore_IRQs(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kthread *kthreadSelectNext()
|
struct thread *kthreadSelectNext()
|
||||||
{
|
{
|
||||||
struct kthread *nextThread;
|
struct thread *nextThread;
|
||||||
int idx;
|
int idx;
|
||||||
list_foreach(currentThread->next, nextThread, idx)
|
list_foreach(currentThread->next, nextThread, idx)
|
||||||
{
|
{
|
||||||
@ -117,7 +117,7 @@ struct kthread *kthreadSelectNext()
|
|||||||
struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu)
|
struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu)
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
struct kthread *nextThread;
|
struct thread *nextThread;
|
||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu)
|
|||||||
|
|
||||||
int kthreadOnJieffiesTick()
|
int kthreadOnJieffiesTick()
|
||||||
{
|
{
|
||||||
struct kthread *nextThread;
|
struct thread *nextThread;
|
||||||
int idx;
|
int idx;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
@ -162,7 +162,7 @@ int kthreadOnJieffiesTick()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kthreadUnsched(struct kthread *th)
|
int kthreadUnsched(struct thread *th)
|
||||||
{
|
{
|
||||||
list_delete(currentThread, th);
|
list_delete(currentThread, th);
|
||||||
|
|
||||||
@ -170,7 +170,7 @@ int kthreadUnsched(struct kthread *th)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Must be called with IRQ disabled
|
// Must be called with IRQ disabled
|
||||||
int kthreadWait(struct kthread *current, struct kthread *next, unsigned long msec)
|
int kthreadWait(struct thread *current, struct thread *next, unsigned long msec)
|
||||||
{
|
{
|
||||||
if (current == next) {
|
if (current == next) {
|
||||||
assertmsg(0, "Cannot yield from %s to %s\n", current->name, next->name);
|
assertmsg(0, "Cannot yield from %s to %s\n", current->name, next->name);
|
||||||
@ -197,8 +197,8 @@ int kthreadYield()
|
|||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
struct kthread *next = kthreadSelectNext();
|
struct thread *next = kthreadSelectNext();
|
||||||
struct kthread *current = currentThread;
|
struct thread *current = currentThread;
|
||||||
|
|
||||||
if (current == next) {
|
if (current == next) {
|
||||||
restore_IRQs(flags);
|
restore_IRQs(flags);
|
||||||
@ -222,7 +222,7 @@ int kthreadYield()
|
|||||||
int kthreadMsleep(unsigned long msec)
|
int kthreadMsleep(unsigned long msec)
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
struct kthread *next, *current;
|
struct thread *next, *current;
|
||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
|
|
||||||
@ -245,12 +245,12 @@ int kthreadMsleep(unsigned long msec)
|
|||||||
return current->sleepHaveTimeouted == 1;
|
return current->sleepHaveTimeouted == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kthread *getCurrentThread()
|
struct thread *getCurrentThread()
|
||||||
{
|
{
|
||||||
return currentThread;
|
return currentThread;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kthreadAddThread(struct kthread *th)
|
int kthreadAddThread(struct thread *th)
|
||||||
{
|
{
|
||||||
if (th->state == READY)
|
if (th->state == READY)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -15,7 +15,7 @@ typedef enum {
|
|||||||
EXITING
|
EXITING
|
||||||
} kthread_state;
|
} kthread_state;
|
||||||
|
|
||||||
struct kthread {
|
struct thread {
|
||||||
char name[KTHREAD_NAME_MAX_LENGTH];
|
char name[KTHREAD_NAME_MAX_LENGTH];
|
||||||
struct cpu_state *cpuState;
|
struct cpu_state *cpuState;
|
||||||
kthread_state state;
|
kthread_state state;
|
||||||
@ -23,25 +23,25 @@ struct kthread {
|
|||||||
size_t stackSize;
|
size_t stackSize;
|
||||||
unsigned long jiffiesSleeping;
|
unsigned long jiffiesSleeping;
|
||||||
int sleepHaveTimeouted;
|
int sleepHaveTimeouted;
|
||||||
struct kthread *next;
|
struct thread *next;
|
||||||
struct kthread *prev;
|
struct thread *prev;
|
||||||
struct kthread *timeNext;
|
struct thread*timeNext;
|
||||||
struct kthread *timePrev;
|
struct thread *timePrev;
|
||||||
};
|
};
|
||||||
|
|
||||||
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize);
|
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize);
|
||||||
void kthreadExit();
|
void kthreadExit();
|
||||||
|
|
||||||
struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args);
|
struct thread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args);
|
||||||
void kthreadDelete(struct kthread *thread);
|
void kthreadDelete(struct thread *thread);
|
||||||
|
|
||||||
struct kthread *kthreadSelectNext();
|
struct thread *kthreadSelectNext();
|
||||||
struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu);
|
struct cpu_state *kthreadSwitch(struct cpu_state *prevCpu);
|
||||||
|
|
||||||
int kthreadYield();
|
int kthreadYield();
|
||||||
int kthreadWait(struct kthread *current, struct kthread *next, unsigned long msec);
|
int kthreadWait(struct thread *current, struct thread *next, unsigned long msec);
|
||||||
int kthreadUnsched(struct kthread *th);
|
int kthreadUnsched(struct thread *th);
|
||||||
int kthreadMsleep(unsigned long msec);
|
int kthreadMsleep(unsigned long msec);
|
||||||
int kthreadOnJieffiesTick();
|
int kthreadOnJieffiesTick();
|
||||||
struct kthread *getCurrentThread();
|
struct thread *getCurrentThread();
|
||||||
int kthreadAddThread(struct kthread *th);
|
int kthreadAddThread(struct thread *th);
|
||||||
|
@ -51,7 +51,7 @@ int mutexFree(struct mutex *m)
|
|||||||
int mutexLock(struct mutex *m)
|
int mutexLock(struct mutex *m)
|
||||||
{
|
{
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
struct kthread *current;
|
struct thread *current;
|
||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
current = getCurrentThread();
|
current = getCurrentThread();
|
||||||
|
@ -25,7 +25,7 @@ int waitQueueFree(struct wait_queue *wq)
|
|||||||
|
|
||||||
int wakeUp(struct wait_queue *wq)
|
int wakeUp(struct wait_queue *wq)
|
||||||
{
|
{
|
||||||
struct kthread *th;
|
struct thread *th;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
disable_IRQs(flags);
|
disable_IRQs(flags);
|
||||||
@ -46,7 +46,7 @@ int wait(struct wait_queue *wq)
|
|||||||
|
|
||||||
int waitTimeout(struct wait_queue *wq, unsigned long msec)
|
int waitTimeout(struct wait_queue *wq, unsigned long msec)
|
||||||
{
|
{
|
||||||
struct kthread *current, *next;
|
struct thread *current, *next;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "kthread.h"
|
#include "kthread.h"
|
||||||
|
|
||||||
struct wait_queue {
|
struct wait_queue {
|
||||||
struct kthread *thread;
|
struct thread *thread;
|
||||||
struct wait_queue *next;
|
struct wait_queue *next;
|
||||||
struct wait_queue *prev;
|
struct wait_queue *prev;
|
||||||
};
|
};
|
||||||
@ -35,6 +35,6 @@ struct semaphore {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct mutex {
|
struct mutex {
|
||||||
struct kthread *owner;
|
struct thread *owner;
|
||||||
struct wait_queue *wait;
|
struct wait_queue *wait;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user