summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/acpi.c3
-rw-r--r--kernel/gdt.c15
-rw-r--r--kernel/gdt.h3
-rw-r--r--kernel/interrupts.c3
-rw-r--r--kernel/interrupts.h1
-rw-r--r--kernel/kernel.c7
-rw-r--r--kernel/mem.h1
-rw-r--r--kernel/mp.c9
-rw-r--r--kernel/ringbuffer.c1
-rw-r--r--kernel/scheduler.c10
-rw-r--r--kernel/scheduler.h2
-rw-r--r--kernel/smp.c5
-rw-r--r--kernel/smp.h6
-rw-r--r--kernel/syscalls.c3
-rw-r--r--kernel/syscalls.h5
-rw-r--r--kernel/vmem.c4
-rw-r--r--kernel/vmem.h2
17 files changed, 66 insertions, 14 deletions
diff --git a/kernel/acpi.c b/kernel/acpi.c
index 5192c37..8b139bf 100644
--- a/kernel/acpi.c
+++ b/kernel/acpi.c
@@ -1,6 +1,5 @@
#include "kernel.h"
#include <stdint.h>
-#include <stdbool.h>
#include "smp.h"
#include "lib/string/string.h"
@@ -170,7 +169,7 @@ bool acpi_find(smp_processors *procdata)
search++;
- if(search==0xa0000)search=0xe0000;
+ if((uint32_t)search==0xa0000)search=0xe0000;
}
return false;
diff --git a/kernel/gdt.c b/kernel/gdt.c
index bf8f203..48bc284 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -1,6 +1,8 @@
// http://wiki.osdev.org/GDT_Tutorial
-#include "kernel/kernel.h"
-#include "kernel/gdt.h"
+#include "kernel.h"
+#include "gdt.h"
+#include "asm_gdt.h"
+#include "kmalloc.h"
#include <stdint.h>
@@ -50,6 +52,11 @@ struct gdt_entry_bits
unsigned int base_high :8;
} __packed; //or __attribute__((packed))
+void setup_gdt(uint8_t *gdt_struct)
+{
+ asm_setup_gdt(&gdt_struct[0],8*GDT_SIZE);
+}
+
/**
* \param target A pointer to the 8-byte GDT entry
* \param source An arbitrary structure describing the GDT entry
@@ -153,7 +160,3 @@ void gdt_init()
}
-void setup_gdt(uint8_t *gdt_struct)
-{
- asm_setup_gdt(&gdt_struct[0],8*GDT_SIZE);
-}
diff --git a/kernel/gdt.h b/kernel/gdt.h
index a234ea4..314cc99 100644
--- a/kernel/gdt.h
+++ b/kernel/gdt.h
@@ -2,6 +2,8 @@
// http://wiki.osdev.org/TSS
// http://wiki.osdev.org/Global_Descriptor_Table
+#include <stdint.h>
+
typedef volatile struct strtss{
unsigned short link;
unsigned short link_h;
@@ -44,3 +46,4 @@ typedef volatile struct strtss{
}__attribute__((packed)) tss_struct;
void gdt_init();
+void install_tss(uint32_t cpu,uint32_t esp0);
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 992889f..69f5316 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -2,8 +2,11 @@
#include "asm_int.h"
#include "asm_pit.h"
#include "driver/mouse.h"
+#include "driver/keyboard.h"
#include "interrupts.h"
+#include "scheduler.h"
#include "asm_x86.h"
+#include "smp.h"
/** The size of our interrupts table */
#define INT_MAX 256 // 0-255
diff --git a/kernel/interrupts.h b/kernel/interrupts.h
index ab76092..aafd5d4 100644
--- a/kernel/interrupts.h
+++ b/kernel/interrupts.h
@@ -26,4 +26,5 @@
*/
void interrupts_init(uint16_t sel);
+void int_install();
#endif
diff --git a/kernel/kernel.c b/kernel/kernel.c
index bdb34d9..5a17567 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -15,9 +15,16 @@
#include "syscalls.h"
#include "fifo.h"
#include "mp.h"
+#include "asm_mp.h"
+#include "asm_x86.h"
#include "interrupts.h"
#include "ringbuffer.h"
#include "driver/screen.h"
+#include "asm_pic.h"
+
+#include "fs/fs.h"
+#include "kmalloc.h"
+#include "driver/vesa.h"
/* F00L 0S Entry point (called directly from asm/multiboot.asm */
void kernel_main(uint32_t eax,uint32_t ebx)
diff --git a/kernel/mem.h b/kernel/mem.h
index 42bf84d..76d12b0 100644
--- a/kernel/mem.h
+++ b/kernel/mem.h
@@ -3,3 +3,4 @@ typedef uint32_t physical_address;
physical_address* pmmngr_alloc_block ();
void pmmngr_free_block (physical_address* p);
uint32_t mem_init(multiboot_information *info);
+uint32_t mem_get_free_blocks_count();
diff --git a/kernel/mp.c b/kernel/mp.c
index df7549a..ba6a042 100644
--- a/kernel/mp.c
+++ b/kernel/mp.c
@@ -4,6 +4,7 @@
#include "asm_x86.h"
#include "smp.h"
+#include "lib/string/string.h"
typedef struct mp_fps_struct
{
@@ -147,9 +148,9 @@ bool mp_find(smp_processors *procdata)
klog("Looking for Mp Floating Ponter Struct...");
uint8_t *addr=0x8000;
- while(addr<=0xfffff)
+ while((uint32_t)addr<=0xfffff)
{
- if(!strcmp_l("_MP_",addr,4))
+ if(!strcmp_l("_MP_",(char*)addr,4))
{
// klog("Found at 0x%04X",addr);
if(do_mp_fps(addr,procdata))return true;
@@ -158,9 +159,9 @@ bool mp_find(smp_processors *procdata)
}
addr=0x190000-1025;
- while(addr<=0x190000+1024)
+ while((uint32_t)addr<=0x190000+1024)
{
- if(!strcmp_l("_MP_",addr,4))
+ if(!strcmp_l("_MP_",(char*)addr,4))
{
// klog("Found at 0x%04X",addr);
if(do_mp_fps(addr,procdata))return true;
diff --git a/kernel/ringbuffer.c b/kernel/ringbuffer.c
index d6d515d..fd87727 100644
--- a/kernel/ringbuffer.c
+++ b/kernel/ringbuffer.c
@@ -1,5 +1,6 @@
#include "ringbuffer.h"
+#include "kmalloc.h"
// TODO: this is disabled because a kb interrupt can occur anytime
// and the kernel will need to access the ringbuffer while we are accessing!
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 72165f9..20c6f35 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -1,8 +1,12 @@
#include "scheduler.h"
#include "kernel.h"
+#include "gdt.h"
#include "mem.h"
+#include "fs/elf.h"
#include "asm_x86.h"
+#include "asm_task.h"
+#include "asm_usermode.h"
#include "kmalloc.h"
#include "vmem.h"
@@ -32,13 +36,14 @@ static volatile struct task_list_struct
volatile uint32_t ecx;
volatile uint32_t edx;
-}volatile task_list[MAX_TASKS];
+}task_list[MAX_TASKS];
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack)
{
uint32_t *stk=task_list[pid].esp;
stk[14]=entry;
stk[17]=stack;
+ return 1;
}
volatile int add_task(uint32_t parent,uint32_t vmem)
@@ -199,6 +204,7 @@ volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t
task_list[current_task].edx=edx;
task_list[2].wait=false;
+ return 1;
}
//TODO: free vmem too!
@@ -211,6 +217,7 @@ volatile uint32_t task_exit(uint32_t pid)
task_list[parent_pid].wait=false;
klog("[%d] exit", pid);
vmem_free_dir(task_list[pid].vmem);
+ return 1;
}
volatile uint32_t task_wait(uint32_t pid)
@@ -218,6 +225,7 @@ volatile uint32_t task_wait(uint32_t pid)
klog("[%d] wait", pid);
task_list[pid].wait=true;
task_list[pid].eax=SYSCALL_WAIT;
+ return 1;
}
volatile uint32_t task_fork(uint32_t pid)
diff --git a/kernel/scheduler.h b/kernel/scheduler.h
index e89e8a3..a6eacd8 100644
--- a/kernel/scheduler.h
+++ b/kernel/scheduler.h
@@ -10,3 +10,5 @@ volatile uint32_t task_fork(uint32_t pid);
volatile uint32_t task_clone(uint32_t pid);
volatile uint32_t task_wait(uint32_t pid);
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack);
+volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t edx);
+volatile uint32_t my_scheduler(uint32_t oldesp,uint32_t force_pid);
diff --git a/kernel/smp.c b/kernel/smp.c
index 0c8d2dd..c965b2e 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -7,9 +7,14 @@
#include <stdint.h>
#include "smp.h"
+#include "gdt.h"
#include "mem.h"
+#include "interrupts.h"
+#include "kmalloc.h"
#include "spinlock.h"
#include "asm_x86.h"
+#include "asm_pit.h"
+#include "asm_mp.h"
#define APIC_APICID 0x20
#define APIC_APICVER 0x30
diff --git a/kernel/smp.h b/kernel/smp.h
index ef0a660..e99c77b 100644
--- a/kernel/smp.h
+++ b/kernel/smp.h
@@ -3,6 +3,7 @@
#include "kernel.h"
+#include <stdbool.h>
typedef struct
{
@@ -20,4 +21,9 @@ typedef struct
}smp_processors;
+void apicEOI();
+uint32_t apicID();
+bool acpi_find(smp_processors *procdata);
+void smp_start_aps(smp_processors *pros);
+
#endif
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 67ae48d..a49429d 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -95,8 +95,10 @@ int syscall_read(int file, char *buf, int len)
buf++;
l++;
+ return l;
if(l==len)return l;
if(c=='\n')return l;
+
}
//TODO: replace with dirent!
@@ -375,4 +377,5 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint
case SYSCALL_POLL :
return syscall_poll(p1);
}
+ return -1;
}
diff --git a/kernel/syscalls.h b/kernel/syscalls.h
index 56e78a2..7335e2c 100644
--- a/kernel/syscalls.h
+++ b/kernel/syscalls.h
@@ -22,6 +22,11 @@
#define SYSCALL_POLL 80 //shit!?
#define SYSCALL_CLONE 83
+uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid);
+int chk_syscall_read(int file, char *buf, int len);
+int syscall_open(char *name, int flags, int mode);
+int syscall_write(int file, char *buf, int len);
+
// new planned syscalls for graphx
// TODO: split ncurses and our syscalls??
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 0dd896c..3b5be30 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -4,6 +4,8 @@
#include "asm_x86.h"
#include "mem.h"
#include "vmem.h"
+#include "kmalloc.h"
+#include "lib/string/string.h"
static uint32_t kernel_pages;
uint32_t fb_addr;
@@ -100,7 +102,7 @@ physical_addr pd_entry_get_frame (pd_entry* e)
return *e&I86_PDE_FRAME;
}
-boolpd_entry_is_present (pd_entry e)
+bool pd_entry_is_present (pd_entry e)
{
return e&I86_PDE_PRESENT;
}
diff --git a/kernel/vmem.h b/kernel/vmem.h
index 541a84a..2a8e7cc 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -81,3 +81,5 @@ typedef struct pdirectory_struct {
}pdirectory;
pdirectory* vmem_init(uint32_t kernel_blocks,uint32_t fb_addr,uint32_t apic_addr, uint32_t ioapic_addr);
+void vmem_free_dir(pdirectory *dir);
+pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only);