summaryrefslogtreecommitdiffstats
path: root/arch/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/hal/obj.c99
-rw-r--r--arch/x86_64/hal/paging.c14
-rw-r--r--arch/x86_64/hal/serial_com.c5
-rw-r--r--arch/x86_64/hal/smp.c18
-rw-r--r--arch/x86_64/lib/printf.c5
-rw-r--r--arch/x86_64/main.c2
-rw-r--r--arch/x86_64/proc/init.c13
-rw-r--r--arch/x86_64/proc/process.c52
-rw-r--r--arch/x86_64/proc/process.h7
-rw-r--r--arch/x86_64/proc/scheduler.c20
-rw-r--r--arch/x86_64/proc/switch.s9
-rw-r--r--arch/x86_64/sys/syscall.c2
12 files changed, 94 insertions, 152 deletions
diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c
index 110351c..b3658b2 100644
--- a/arch/x86_64/hal/obj.c
+++ b/arch/x86_64/hal/obj.c
@@ -28,6 +28,11 @@ obj_trytake(jove_obj_t *obj)
return (jove_owned_obj_t*)obj;
}
+jove_obj_t *obj_asunowned(jove_owned_obj_t *obj)
+{
+ return (jove_obj_t*)obj;
+}
+
jove_obj_t*
obj_release(jove_owned_obj_t *obj)
{
@@ -74,97 +79,3 @@ obj_setvalue(jove_owned_obj_t *obj, uintmax_t value)
obj->locked.value = value & 0x00007FFFFFFFFFFFULL;
}
-jove_obj_t
-objdir_peeklocal(
- jove_owned_obj_t *objdir_obj,
- uint16_t entry)
-{
- if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
- errno = EBADOBJ;
- return (jove_obj_t) { 0 };
- }
- if(entry >= JOVE_OBJDIR_ENTRIES) {
- errno = EBADPATH;
- return (jove_obj_t) { 0 };
- }
-
- jove_objdir_t *objtab = obj_deref(objdir_obj);
- return objtab->entries[entry];
-}
-
-jove_owned_obj_t*
-objdir_getlocal(
- jove_owned_obj_t *objdir_obj,
- uint16_t entry)
-{
- if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
- reterr(EBADOBJ);
- }
- if(entry >= JOVE_OBJDIR_ENTRIES) {
- reterr(EBADPATH);
- }
-
- jove_objdir_t *objtab = obj_deref(objdir_obj);
- return obj_take(&objtab->entries[entry]);
-}
-
-jove_owned_obj_t*
-objdir_trygetlocal(
- jove_owned_obj_t *objdir_obj,
- uint16_t entry)
-{
- if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
- reterr(EBADOBJ);
- }
- if(entry >= JOVE_OBJDIR_ENTRIES) {
- reterr(EBADPATH);
- }
-
- jove_objdir_t *objtab = obj_deref(objdir_obj);
- return obj_trytake(&objtab->entries[entry]);
-}
-
-jove_owned_obj_t*
-objdir_getobj(
- jove_owned_obj_t *objdir_obj,
- const uint16_t *path,
- size_t path_len)
-{
- errno = 0;
- if(path_len == 0) {
- return objdir_obj;
- }
- {
- jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]);
- if(child_objdir == 0) {
- reterr(EBADPATH);
- }
-
- jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1);
- obj_release(child_objdir);
- return target_obj;
- }
-}
-
-jove_owned_obj_t*
-objdir_trygetobj(
- jove_owned_obj_t *objdir_obj,
- const uint16_t *path,
- size_t path_len)
-{
- errno = 0;
- if(path_len == 0) {
- return objdir_obj;
- }
- {
- jove_owned_obj_t *child_objdir = objdir_trygetlocal(objdir_obj, path[0]);
- if(child_objdir == 0) {
- return 0;
- }
-
- jove_owned_obj_t *target_obj = objdir_trygetobj(child_objdir, path + 1, path_len - 1);
- obj_release(child_objdir);
- return target_obj;
- }
-}
-
diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c
index 1587c62..535d5b2 100644
--- a/arch/x86_64/hal/paging.c
+++ b/arch/x86_64/hal/paging.c
@@ -114,6 +114,18 @@ s_pagedir_get_pml1(page_t *pml4, uintptr_t vptr)
return PML_TBL(pml2, pml2i);
}
+int
+pagedir_new(jove_owned_obj_t *untyped_obj)
+{
+ jove_untyped_t *untyped = obj_deref(untyped_obj);
+ if((uintptr_t)untyped & 0xFFF) return -EALIGN;
+ if(untyped->limit != 0x1000) return -EBADSIZE;
+
+ obj_settype(untyped_obj, JOVE_OBJ_PAGEDIR);
+ memcpy(untyped, _kernel_pml4, 0x1000);
+ return 0;
+}
+
uintptr_t *pagedir_get_mapping(jove_owned_obj_t *pagedir, uintptr_t vptr)
{
page_t *pml4 = obj_deref(pagedir);
@@ -440,7 +452,7 @@ paging_pml4_init(void)
paging_pml4_switch(kernel_pml4_pptr);
{
- jove_owned_obj_t *pgdir_o = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I);
+ jove_owned_obj_t *pgdir_o = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PAGEDIR_I);
obj_settype(pgdir_o, JOVE_OBJ_PAGEDIR);
obj_setvalue(pgdir_o, kernel_pml4_pptr);
obj_release(pgdir_o);
diff --git a/arch/x86_64/hal/serial_com.c b/arch/x86_64/hal/serial_com.c
index 343d2ae..372a433 100644
--- a/arch/x86_64/hal/serial_com.c
+++ b/arch/x86_64/hal/serial_com.c
@@ -4,6 +4,7 @@
#include "hal/obj.h"
#include "proc/init.h"
#include "lib/printf.h"
+#include "sys/objdir.h"
static int
serial_com_recv(uint16_t port)
@@ -68,13 +69,13 @@ serial_com_init(void)
}
{
- jove_owned_obj_t *com_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I);
+ jove_owned_obj_t *com_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_SERIAL_COM_I);
obj_settype(com_obj, JOVE_OBJ_SERIAL_COM);
obj_setvalue(com_obj, SERIAL_COM1);
obj_release(com_obj);
}
- kprintf("Initialized COM1 on port %X for obj %X\n", SERIAL_COM1, ROOTDIR_SERIAL_COM_I);
+ kprintf("Initialized COM1 on port %X for obj %X\n", SERIAL_COM1, INIT_ROOTDIR_SERIAL_COM_I);
}
int
diff --git a/arch/x86_64/hal/smp.c b/arch/x86_64/hal/smp.c
index b894eb9..392e68f 100644
--- a/arch/x86_64/hal/smp.c
+++ b/arch/x86_64/hal/smp.c
@@ -8,6 +8,7 @@
#include "proc/process.h"
#include "lib/printf.h"
#include "lib/string.h"
+#include "sys/objdir.h"
processor_t s_processors[SMP_PROCESSORS_MAX];
@@ -43,7 +44,7 @@ smp_init_bsp(void)
processor_t *bsp = &s_processors[0];
{
- jove_owned_obj_t *processor_objdir_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PROCESSORS_I);
+ jove_owned_obj_t *processor_objdir_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PROCESSORS_I);
obj_settype(processor_objdir_obj, JOVE_OBJ_OBJDIR);
obj_setvalue(processor_objdir_obj, (uintptr_t)&s_processor_objdir);
@@ -58,12 +59,23 @@ smp_init_bsp(void)
paging_pml4_init();
}
-processor_t *processor_current(void)
+inline processor_t *processor_current(void)
{
return (processor_t*)msr_get_gs_base();
}
-jove_owned_obj_t *processor_pcb(processor_t *processor)
+inline jove_owned_obj_t *processor_getpcb(processor_t *processor)
{
return processor->pcb_obj;
}
+
+void
+processor_setpcb(processor_t *processor, jove_owned_obj_t *pcb_obj)
+{
+ pcb_t *pcb = obj_deref(pcb_obj);
+ if(processor->pcb) {
+ obj_release(processor_getpcb(processor));
+ }
+ processor->pcb_obj = pcb_obj;
+ processor->pcb = pcb;
+}
diff --git a/arch/x86_64/lib/printf.c b/arch/x86_64/lib/printf.c
index 794a592..db47f6b 100644
--- a/arch/x86_64/lib/printf.c
+++ b/arch/x86_64/lib/printf.c
@@ -2,6 +2,7 @@
#include "lib/printf.h"
#include "lib/virtterm.h"
#include "proc/init.h"
+#include "sys/objdir.h"
int
kvprintf(const char *fmt, va_list ap)
@@ -11,11 +12,11 @@ kvprintf(const char *fmt, va_list ap)
int wlen = (r > 256 ? 256 : r);
{
- jove_owned_obj_t *serial_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_SERIAL_COM_I);
+ jove_owned_obj_t *serial_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_SERIAL_COM_I);
serial_com_write(serial_obj, buffer, wlen);
obj_release(serial_obj);
- jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_VIRTTERM_I);
+ jove_owned_obj_t *vt_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_VIRTTERM_I);
vt_write(vt_obj, buffer, wlen);
obj_release(vt_obj);
}
diff --git a/arch/x86_64/main.c b/arch/x86_64/main.c
index 6e2fcb8..4a40707 100644
--- a/arch/x86_64/main.c
+++ b/arch/x86_64/main.c
@@ -18,7 +18,7 @@
int errno = 0;
PAGEALIGN jove_objdir_t _rootdir;
-void *_rootdir_obj = &_rootdir.entries[ROOTDIR_DIR_I];
+void *_rootdir_obj = &_rootdir.entries[INIT_ROOTDIR_DIR_I];
struct init_payload _init_payload;
diff --git a/arch/x86_64/proc/init.c b/arch/x86_64/proc/init.c
index 3787c7b..155cff6 100644
--- a/arch/x86_64/proc/init.c
+++ b/arch/x86_64/proc/init.c
@@ -5,6 +5,7 @@
#include "jove.h"
#include "hal/obj.h"
#include "lib/string.h"
+#include "sys/objdir.h"
#include "panic/panic.h"
#include "lib/printf.h"
#include "arch/x86_64/lib/elf.h"
@@ -50,7 +51,7 @@ init_setup(void)
kpanic("Kernel commandline is missing 'init' arg.\n");
}
- jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I);
+ jove_owned_obj_t *initrd_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_INITRD_I);
jove_owned_obj_t *init_obj = initrd_seek(initrd_obj, init_path);
if(init_obj == NULL) {
kpanic("init: Cannot find file '%s' in initrd.\n", init_path);
@@ -69,7 +70,7 @@ init_setup(void)
kpanic("init: Either passed file '%s' is not an ELF file or is not loadable.\n", init_path);
}
- jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I);
+ jove_owned_obj_t *init_pagedir = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PAGEDIR_I);
page_t *pml4 = obj_deref(init_pagedir);
size_t last_base = 0;
@@ -133,7 +134,7 @@ init_setup(void)
memcpy((void*)last_base, &_init_payload, sizeof(struct init_payload));
- jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_MESSAGE_I);
+ jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_MESSAGE_I);
obj_settype(message_obj, JOVE_OBJ_MESSAGE);
obj_setvalue(message_obj, last_base | 1);
obj_release(message_obj);
@@ -144,13 +145,9 @@ init_setup(void)
extern void _syscall_entry(void);
msr_set_lstar(_syscall_entry);
- //Setup KSP for syscalls
- jove_owned_obj_t *pcb_obj = process_current();
- pcb_t *pcb = obj_deref(pcb_obj);
-
- obj_release(pcb_obj);
obj_release(_rootdir_obj);
+ //Setup KSP for syscalls
uintptr_t usp = 0x00007FFFFFFFFFF8;
uintptr_t uip = init_ehdr->e_entry;
diff --git a/arch/x86_64/proc/process.c b/arch/x86_64/proc/process.c
index d5513bc..5935303 100644
--- a/arch/x86_64/proc/process.c
+++ b/arch/x86_64/proc/process.c
@@ -1,4 +1,5 @@
#include "process.h"
+#include "hal/memory.h"
#include "proc/process.h"
#include "arch/x86_64/hal/obj.h"
#include "arch/x86_64/hal/smp.h"
@@ -8,51 +9,34 @@
#include "lib/string.h"
#include "proc/init.h"
#include "jove.h"
+#include "proc/scheduler.h"
PAGEALIGN uint8_t s_init_iopb[0x2000];
PAGEALIGN char _init_pcb_bytes[0x1000] = { 0 };
-pcb_t *pcb_tree;
+
+int
+_pcb_new_arch(pcb_t *pcb)
+{
+ return 0;
+}
void
processing_setup(void (*process_main))
{
- pcb_t *init_pcb = (pcb_t*)&_init_pcb_bytes;
- pcb_tree = init_pcb;
-
- memset(s_init_iopb, 0xFF, 0x2000);
- uintptr_t ksp = ((uintptr_t)&_init_pcb_bytes) + 0xFF8;
-
- init_pcb->header.tree_node.get_key = (void*)pcb_getpid;
- init_pcb->header.tree_node.color = 1;
- init_pcb->header.rootdir = _rootdir_obj;
- init_pcb->header.pagedir = obj_release(objdir_getlocal(_rootdir_obj, ROOTDIR_PAGEDIR_I));
+ jove_owned_obj_t *init_pcb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_PCB_I);
+ obj_settype(init_pcb_obj, JOVE_OBJ_PCB);
+ obj_setvalue(init_pcb_obj, phys_fromvirt((uintptr_t)&_init_pcb_bytes));
+
+ pcb_new(init_pcb_obj, sizeof(_init_pcb_bytes), _rootdir_obj);
- init_pcb->header.pid = 1;
- init_pcb->header.state = PCB_STATE_RUNNING;
-
- init_pcb->ksp = (void*)ksp;
-
- jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_IOPB_I);
+ jove_owned_obj_t *iopb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_IOPB_I);
obj_settype(iopb_obj, JOVE_OBJ_IOPB);
obj_setvalue(iopb_obj, (uintptr_t)s_init_iopb);
- init_pcb->iopb = obj_release(iopb_obj);
- processor_t *proc = processor_current();
- proc->tss.rsp[0] = (uintptr_t)init_pcb->ksp;
- memcpy(proc->iopb, s_init_iopb, 0x2000);
-
- {
- jove_owned_obj_t *process_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I);
- obj_settype(process_obj, JOVE_OBJ_PCB);
- obj_setvalue(process_obj, (uintptr_t)init_pcb);
+ memset(s_init_iopb, 0xFF, 0x2000);
+ pcb_t *init_pcb = obj_deref(init_pcb_obj);
- proc->pcb_obj = process_obj;
- proc->pcb = init_pcb;
- }
+ init_pcb->iopb = obj_release(iopb_obj);
- __asm__ volatile("\
- movq %0, %%rsp; \
- xorq %%rbp, %%rbp; \
- jmpq %1"::
- "r"(init_pcb->ksp), "r"(process_main));
+ scheduler_init(init_pcb_obj, process_main);
}
diff --git a/arch/x86_64/proc/process.h b/arch/x86_64/proc/process.h
index 6a0aa96..5004b49 100644
--- a/arch/x86_64/proc/process.h
+++ b/arch/x86_64/proc/process.h
@@ -2,19 +2,14 @@
#define _JOVE_x86_64_HAL_PROCESS_H 1
#include "proc/process.h"
-#include "arch/x86_64/x86_64.h"
#include "lib/rbtree.h"
typedef struct process_control_block
{
- struct pcb_expected_header header;
+ struct pcb_header header;
jove_obj_t *iopb;
-
- int killed;
- struct cpu_context context;
- void *ksp;
char kstack[];
} pcb_t;
diff --git a/arch/x86_64/proc/scheduler.c b/arch/x86_64/proc/scheduler.c
new file mode 100644
index 0000000..23e54af
--- /dev/null
+++ b/arch/x86_64/proc/scheduler.c
@@ -0,0 +1,20 @@
+#include "proc/scheduler.h"
+#include "arch/x86_64/hal/gdt.h"
+#include "process.h"
+#include "../hal/smp.h"
+#include <string.h>
+
+void
+_scheduler_switch_pcb_arch(pcb_t *target)
+{
+ processor_t *proc = processor_current();
+ proc->tss.rsp[0] = (uintptr_t)target->header.ksp;
+
+ if(target->iopb) {
+ proc->tss.iopb = sizeof(struct tss);
+ jove_owned_obj_t *iopb_obj = obj_take(target->iopb);
+ memcpy(proc->iopb, obj_deref(iopb_obj), sizeof(proc->iopb));
+ }else{
+ proc->tss.iopb = 0xff;
+ }
+}
diff --git a/arch/x86_64/proc/switch.s b/arch/x86_64/proc/switch.s
new file mode 100644
index 0000000..d571c66
--- /dev/null
+++ b/arch/x86_64/proc/switch.s
@@ -0,0 +1,9 @@
+.global scheduler_switch
+.type scheduler_switch @function
+
+scheduler_switch:
+ movq %rsp, (%rdi)
+ movq %rsi, %rsp
+ retq
+
+.size scheduler_switch, . - scheduler_switch
diff --git a/arch/x86_64/sys/syscall.c b/arch/x86_64/sys/syscall.c
index b584756..1e06e61 100644
--- a/arch/x86_64/sys/syscall.c
+++ b/arch/x86_64/sys/syscall.c
@@ -50,5 +50,5 @@ void _syscall_entry(void)
sysretq"
::
[pcb] "i"(offsetof(processor_t, pcb)),
- [ksp] "i"(offsetof(pcb_t, ksp)));
+ [ksp] "i"(offsetof(struct pcb_header, ksp)));
}