summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-23 00:06:55 +0200
committerMiguel <m.i@gmx.at>2018-09-23 00:06:55 +0200
commite73d89fd48a71a1cff764fc07edd46cb951e9418 (patch)
tree9d71bc8387ac32cfce69df5d3c7d345dc9e59a40 /kernel
parent80f7ccf5f82d8f04f853bde0bdee5b44a5403104 (diff)
struggling with e1000
Diffstat (limited to 'kernel')
-rw-r--r--kernel/acpi.c4
-rw-r--r--kernel/apic.c19
-rw-r--r--kernel/interrupts.c9
-rw-r--r--kernel/interrupts.h1
-rw-r--r--kernel/kernel.c13
-rw-r--r--kernel/kernel.h2
-rw-r--r--kernel/scheduler.c1
-rw-r--r--kernel/vmem.c7
-rw-r--r--kernel/vmem.h2
9 files changed, 46 insertions, 12 deletions
diff --git a/kernel/acpi.c b/kernel/acpi.c
index b6370c3..2ab889b 100644
--- a/kernel/acpi.c
+++ b/kernel/acpi.c
@@ -79,7 +79,9 @@ static uint8_t *apci_get_next_entry(uint8_t *addr,acpi_information *procdata)
fixme("support multiple IO Apics and consider interrupt source overrides during irq config!");
}
else if(*addr==2){
- klog("Type 2: Interrupt Source Override (bus src=%d) (irq src=%d) (global=%d) (flags=%d)",addr[2],addr[3],*((uint32_t*)&addr[4]),*((uint16_t*)&addr[8]));
+ uint16_t flags=*((uint16_t*)&addr[8]);
+ klog("Type 2: Interrupt Source Override (bus src=%d) (irq src=%d) (global=%d) (flags=%d)",addr[2],addr[3],*((uint32_t*)&addr[4]),flags);
+ klog(" Active %s, %s triggered", flags&2?"low":"high", flags&8?"level":"edge");
}
else if(*addr==4){
klog("Type 4: Non-maskable interrupts (proc id=%d) (flags=%d) (LINT#=%d)",addr[2],*((uint16_t*)&addr[3]),addr[5]);
diff --git a/kernel/apic.c b/kernel/apic.c
index 3ec10b9..f78a03a 100644
--- a/kernel/apic.c
+++ b/kernel/apic.c
@@ -146,15 +146,20 @@ void ioapic_config()
{
fixme("use acpi info to setup IOAPIC");
// setup IO APIC
- // PIT irq 00 -> 02 flags 0 -> 0x90
- // kb irq 01 -> 01 flags ? -> 0x91
- // mouse irq 12 -> 12 flags ? -> 0x92
-// ioapic_config_entry(2,0x90|0x2000,0x3<<24); // egde trigger on falling
+ // DEVICE SOURCE OVERRIDE FLAGS FOOL-OS-INTERRUPT
+ // PIT 00 -> 02 0 high/edge 0x90 / 144
+ // kb 01 -> 01 ? 0x91 / 145
+ // mouse 12 -> 12 ? 0x92 / 146
+ // e1000 11 -> 11 13? high/level 0x93 / 147
+// ioapic_config_entry(3,0x90|0x2000,0x3<<24); // egde trigger on falling
// ioapic_config_entry(2,0x90|0x8000,0x3<<24); // level trigger on high
// ioapic_config_entry(2,0x90|0xa000,0x3<<24); // level trigger on low
- ioapic_config_entry(2,0x90,0x0);
- ioapic_config_entry(1,0x91,0x0);
- ioapic_config_entry(12,0x92,0x0);
+
+// CPU
+ ioapic_config_entry(2, 0x90, 0x0<<24); // pit
+ ioapic_config_entry(1, 0x91, 0x0<<24); // kb
+ ioapic_config_entry(12, 0x92, 0x0<<24); // mouse
+ ioapic_config_entry(11, 0x93|0x8000, 0x0<<24); // e1000 (level trigger on high)
}
/** startup other cpus*/
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 94eda2e..10537f7 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -1,5 +1,6 @@
#include "kernel.h"
#include "log.h"
+#include "e1000.h"
#include "asm_int.h"
#include "asm_pit.h"
#include "driver/mouse.h"
@@ -77,6 +78,11 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq)
task_syscall(stack[11],stack[8],stack[10],stack[9]); //eax,ebx,ecx,edx
break;
+ case INTERRUPT_E1000:
+ klog("e1");
+ e1000_irq(INTERRUPT_E1000);
+ break;
+
case INTERRUPT_APIC_TIMER:
case INTERRUPT_IPI:
esp=scheduler_run(esp,0);
@@ -149,6 +155,9 @@ void interrupts_init(uint16_t sel)
// Mouse (IOAPIC)
int_install_ir(0x92, 0b10001110, 0x08,&int146);
+ // E1000
+ int_install_ir(0x93, 0b10001110, 0x08,&int147);
+
// APIC Timer (LAPIC)
int_install_ir(0x8C, 0b10001110, 0x08,&int140);
diff --git a/kernel/interrupts.h b/kernel/interrupts.h
index 3d28dc4..344369d 100644
--- a/kernel/interrupts.h
+++ b/kernel/interrupts.h
@@ -48,6 +48,7 @@
#define INTERRUPT_PIT_TIMER 0x90
#define INTERRUPT_KEYBOARD 0x91
#define INTERRUPT_MOUSE 0x92
+#define INTERRUPT_E1000 0x93
#define INTERRUPT_APIC_TIMER 0x8C
#define INTERRUPT_SYSCALL 0x80
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 6bda4bf..c244b9a 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -13,6 +13,8 @@
//-- clean below headers --//
#include "sysfs.h"
+#include "pci.h"
+#include "e1000.h"
#include "pipe.h"
#include "testing/testing.h"
#include "ext2.h"
@@ -82,6 +84,12 @@ void kernel_main(uint32_t eax,uint32_t ebx)
interrupts_install();
fixme("register interrupt callback funcs (instead hardcoded dispatcher)");
+
+ // -- PCI SCAN --/
+ klog("PCI init ...");
+ uint32_t e1000_addr=pci_init();
+ klog("E1000 addr=0x%08X",e1000_addr);
+
// -- MEMORY MANAGEMENT -- //
klog("Memory init ... ");
mem_init(cfg_multiboot);
@@ -91,7 +99,7 @@ void kernel_main(uint32_t eax,uint32_t ebx)
fixme("write convenneint management funcs as: mapCPU, mapKErnel, map USerspace..");
fixme("move stack and guard with empty pages!");
- vmem_init(cfg_multiboot,&cfg_acpi);
+ vmem_init(cfg_multiboot,&cfg_acpi,e1000_addr);
struct pdirectory_struct *dir=vmem_kernel_dir();
x86_set_page_directory(dir);
@@ -120,6 +128,7 @@ void kernel_main(uint32_t eax,uint32_t ebx)
vesa_init(cfg_multiboot,addr);
// -- STD STREAMS -- //
+ klog("Standard Streams init ...");
fd_init_std_streams(0,cfg_multiboot->framebuffer_type!=2);
// -- KB -- //
@@ -136,6 +145,8 @@ void kernel_main(uint32_t eax,uint32_t ebx)
uint64_t unixtime=timer_init();
klog("Unix Time = %u seconds",unixtime);
+ e1000_init(e1000_addr);
+
klog("Symmetric Multi Processing (SMP) start ... ");
smp_start_aps(&cfg_acpi);
}
diff --git a/kernel/kernel.h b/kernel/kernel.h
index b2bb81b..07e5fda 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -23,7 +23,7 @@ REFERENCES
#define FOOLOS_CONFIG_H
//#define FOOLOS_UNIT_TESTING // Run Unit Tests
-#define FOOLOS_LOG_OFF // Turn off logging (disables serial port alltogether)
+//#define FOOLOS_LOG_OFF // Turn off logging (disables serial port alltogether)
//#define FOOLOS_COLORLESS // Turn off colors in log
#define HIDE_FIXME
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 667abf8..f6067e5 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -10,6 +10,7 @@
#include "asm_task.h"
#include "asm_usermode.h"
#include "kmalloc.h"
+#include "e1000.h"
#include "vmem.h"
#include "spinlock.h"
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 590722d..4f854b6 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -26,6 +26,8 @@
//! page sizes are 4kb
#define PAGE_SIZE 4096
+uint32_t e1000_addr;
+
//! page table entry
typedef uint32_t pt_entry;
@@ -296,6 +298,7 @@ pdirectory* vmem_kernel_dir()
pdirectory* dir = vmem_clean_dir();
vmem_add_identity(dir,0,1024*8,false);//identity map first 32 megs...
+ vmem_add_identity(dir,e1000_addr,32,false);//identity map 32 pages for e1000
vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8,false);//32megs should be enough for 4k (think about pitch)
vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1,false); //apic addr should be at pagestart, right? TODO: check.
@@ -417,8 +420,9 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
return dir;
}
-void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi)
+void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi,uint32_t e1000addr)
{
+ e1000_addr=e1000addr;
fixme("do not share fb_addr with syscalls like that!");
fb_addr=cfg_multiboot->framebuffer_addr;
local_apic_addr=cfg_acpi->local_apic_address;
@@ -427,3 +431,4 @@ void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi)
mod_start=mod->mod_start;
mod_end=mod->mod_end;
}
+
diff --git a/kernel/vmem.h b/kernel/vmem.h
index c85d36b..211b5d3 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -53,7 +53,7 @@
struct pdirectory_struct;
-void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi);
+void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi,uint32_t e1000_addr);
void vmem_free_dir(struct pdirectory_struct *dir);
struct pdirectory_struct* vmem_new_space_dir(struct pdirectory_struct *copy_dir,bool stack_only);
void vmem_free_space_dir(struct pdirectory_struct *dir,bool stack_only);