diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/acpi.c | 4 | ||||
| -rw-r--r-- | kernel/apic.c | 19 | ||||
| -rw-r--r-- | kernel/interrupts.c | 9 | ||||
| -rw-r--r-- | kernel/interrupts.h | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 13 | ||||
| -rw-r--r-- | kernel/kernel.h | 2 | ||||
| -rw-r--r-- | kernel/scheduler.c | 1 | ||||
| -rw-r--r-- | kernel/vmem.c | 7 | ||||
| -rw-r--r-- | kernel/vmem.h | 2 |
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); |
