diff options
| -rw-r--r-- | driver/vesa.c | 3 | ||||
| -rw-r--r-- | grubiso/boot/grub/grub.cfg | 8 | ||||
| -rw-r--r-- | kernel/apic.c | 3 | ||||
| -rw-r--r-- | kernel/kernel.c | 34 | ||||
| -rw-r--r-- | kernel/kernel.h | 5 | ||||
| -rw-r--r-- | kernel/mem.c | 3 | ||||
| -rw-r--r-- | kernel/multiboot.c | 2 | ||||
| -rw-r--r-- | kernel/smp.c | 14 | ||||
| -rw-r--r-- | kernel/syscalls.c | 44 | ||||
| -rw-r--r-- | kernel/vmem.c | 149 |
10 files changed, 138 insertions, 127 deletions
diff --git a/driver/vesa.c b/driver/vesa.c index eb99173..1bd4b7a 100644 --- a/driver/vesa.c +++ b/driver/vesa.c @@ -179,7 +179,8 @@ void PutPixel(int x,int y, int color) if (x<0 || x>VbeModeInfoBlock->Xres|| y<0 || y>VbeModeInfoBlock->Yres) return; if (x) x = (x*(VbeModeInfoBlock->bpp>>3)); // get bytes (divide by 8) if (y) y = (y*VbeModeInfoBlock->pitch); - uint8_t *cTemp=VbeModeInfoBlock->physbase; + //uint8_t *cTemp=VbeModeInfoBlock->physbase; + uint8_t *cTemp=VMEM_FRAMEBUFFER; cTemp[x+y] = (uint8_t)(color & 0xff); cTemp[x+y+1] = (uint8_t)((color>>8) & 0xff); diff --git a/grubiso/boot/grub/grub.cfg b/grubiso/boot/grub/grub.cfg index 48031b3..9c78bfb 100644 --- a/grubiso/boot/grub/grub.cfg +++ b/grubiso/boot/grub/grub.cfg @@ -1,4 +1,4 @@ -set timeout=0 //seconds +set timeout=1 //seconds menuentry "FoolOS (640x480x32)" { multiboot /boot/foolos.bin @@ -18,6 +18,12 @@ menuentry "FoolOS (1920x1080x32)" { module /boot/ext2.img } +menuentry "FoolOS (2560x1600x32)" { + multiboot /boot/foolos.bin + set gfxpayload=2560x1600x32 + module /boot/ext2.img +} + menuentry "FoolOS (Custom Resolution)" { set pager=1 echo "MODES SUPPORTED:" diff --git a/kernel/apic.c b/kernel/apic.c index a90cbf6..7899c82 100644 --- a/kernel/apic.c +++ b/kernel/apic.c @@ -125,7 +125,8 @@ void apic_init(acpi_information *info) fixme("how to support IPI addressing more than 16cpus?"); fixme("check via cpuid if apic exist?"); local_apic_addr=info->local_apic_address; - io_apic_addr=info->io_apic_address; + local_apic_addr=VMEM_LAPIC; + io_apic_addr=VMEM_IOAPIC; bus_speed=apic_get_bus_speed(4); // get bus speed (divisor: 16) } diff --git a/kernel/kernel.c b/kernel/kernel.c index ad09360..6a77fd5 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -56,6 +56,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) klog("Read Multiboot Structures ..."); multiboot_information *cfg_multiboot; cfg_multiboot=multiboot_read(eax, ebx,false); + elf_multiboot_read(cfg_multiboot); // just show kernel section headers klog("Read Advanced Power Configuration Interface (ACPI) Structures ..."); acpi_information cfg_acpi; @@ -63,8 +64,6 @@ void kernel_main(uint32_t eax,uint32_t ebx) fixme("Try to read (legacy) multiprocessor mp strucutres as well (see: xxx/mp.c)"); if(!acpi_found) kpanic("We Currently rely on ACPI Structures Sorry!"); - elf_multiboot_read(cfg_multiboot); - // -- GDT -- // klog("Global Descriptor Table (GDT) init ..."); gdt_init(); @@ -75,13 +74,6 @@ void kernel_main(uint32_t eax,uint32_t ebx) interrupts_install(); fixme("register interrupt callback funcs (instead hardcoded dispatcher)"); - // -- APIC -- // - klog("Advanced Programmable Interrupt Controller (APIC) config ..."); - apic_init(&cfg_acpi); - ioapic_config(); - apic_enable(); - apic_init_timer(3);// freq in HZ - // -- MEMORY MANAGEMENT -- // klog("Memory init ... "); mem_init(cfg_multiboot); @@ -97,15 +89,19 @@ void kernel_main(uint32_t eax,uint32_t ebx) x86_set_page_directory(dir); x86_paging_enable(); - // temporary TODO - uint32_t *cpu_mem=0x8000000; //1024 pages from here on are mapped per cpu for testing! TODO: dynamic! - *cpu_mem=apic_id(); + // -- APIC -- // + klog("Advanced Programmable Interrupt Controller (APIC) config ..."); + apic_init(&cfg_acpi); + ioapic_config(); + apic_enable(); + apic_init_timer(3);// freq in HZ // -- RAM IMAGE -- // klog("Ram Filesystem init ... "); fs_mount(cfg_multiboot); // -- VESA -- // + fixme("tell terminal syscall somehow if we are vga or textmode"); klog("Video Electronics Standards Association (VESA) init ... "); // TODO check if text or fb? uint32_t addr=kballoc(1); fs_content("/binfont.bin",addr,0x100); // copy font (0x100 bytes) to memory. @@ -113,9 +109,17 @@ void kernel_main(uint32_t eax,uint32_t ebx) // -- STDIN/STDOUT -- // klog("stdin/stdout init ..."); - uint32_t sstdin = syscall_open("stdin",0,0); // stdin 0 - uint32_t sstdout = syscall_open("term",0,0); // stdout 1 uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2 + uint32_t sstdin = syscall_open("stdin",0,0); // stdin 0 + uint32_t sstdout; + if(cfg_multiboot->framebuffer_type==2) // EGA-standard text mode + { + sstdout = syscall_open("term",0,0); // stdout 1 + } + else + { + sstdout = syscall_open("xterm",0,0); // stdout 1 + } klog("Keyboard init ..."); keyboard_init(0); @@ -140,7 +144,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) // now just wait until our scheduler kicks in. while(1){ + syscall_write(sstdout,"dupa",4); asm("hlt"); - PutString("pit cnt: %d",10,10,0xff00ff,asm_pit_get_ticks()/25); } } diff --git a/kernel/kernel.h b/kernel/kernel.h index 0949b68..0f73302 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -27,6 +27,11 @@ #define SMP_MAX_PROC 16 // 16 (together with bsp) We can currently only address a maximum of 16 cpus via ipis! +#define VMEM_LAPIC 0xE0000000 +#define VMEM_IOAPIC 0xE0001000 +#define VMEM_FRAMEBUFFER 0xF0000000 +#define VMEM_CPU_PRIVATE 0x08000000 + // __FUNCTION__ ? #ifndef FOOLOS_LOG_OFF #define kpanic(...) {log(FOOLOS_LOG_COLOR,__FILE__,0," \033[41;37m [KERNEL PANIC] \033[37;40m " __VA_ARGS__ ); while(1);} diff --git a/kernel/mem.c b/kernel/mem.c index 8ce5c89..1c4c32a 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -212,7 +212,8 @@ uint32_t mem_init(multiboot_information *info) } // deinitialize kernel simply with this: - pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)+1); + //pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)+1); + pmmngr_deinit_region(0,((uint32_t)kernel_end-(uint32_t)kernel_start)+1); // or better via ELF symbols: (TODO!) if(info->flags&&1<<5) diff --git a/kernel/multiboot.c b/kernel/multiboot.c index 62583b2..7f45093 100644 --- a/kernel/multiboot.c +++ b/kernel/multiboot.c @@ -78,7 +78,7 @@ multiboot_information* multiboot_read(uint32_t eax, uint32_t ebx, bool silent) if(info->flags&&1<<12) { - klog("[12] Framebuffer (w:%d h:%d bpp:%d) at addr=0x%08X",info->framebuffer_width,info->framebuffer_height,info->framebuffer_bpp,info->framebuffer_addr); + klog("[12] Framebuffer (type=%d) (w:%d h:%d bpp:%d) at addr=0x%08X",info->framebuffer_type,info->framebuffer_width,info->framebuffer_height,info->framebuffer_bpp,info->framebuffer_addr); } return info; diff --git a/kernel/smp.c b/kernel/smp.c index 1b1659b..b385681 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -26,7 +26,6 @@ void smp_main() void kernel_ap() { - apic_enable(); klog("Install Interrupt Vector Table (IVT) on CPU with lapic_id=0x%x ...",apic_id()); interrupts_install(); @@ -39,8 +38,11 @@ void kernel_ap() x86_set_page_directory(dir); x86_paging_enable(); - uint32_t *cpu_mem=0x8000000; //1024 pages from here on are mapped per cpu for testing! TODO: dynamic! - *cpu_mem=apic_id(); + apic_enable(); + + //1024 pages from here on are mapped per cpu for testing! TODO: dynamic. + uint32_t *cpu_mem=VMEM_CPU_PRIVATE; + cpu_mem[0]=apic_id(); klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id()); apic_init_timer(1);// freq 1HZ @@ -50,9 +52,10 @@ void kernel_ap() asm_smp_unlock(); -// cpu_mem[1]=0; + cpu_mem[1]=0; + while(1){ - PutString("cpu cnt: %d",10,10+(*cpu_mem)*20,0xff0000,cpu_mem[1]++); + PutString("cpu cnt: %d",10,10+apic_id()*20,0xff0000,cpu_mem[1]++); asm("hlt"); } } @@ -67,7 +70,6 @@ void smp_start_aps(acpi_information *pros) uint8_t dest=pros->local_apic_id[i]; klog("starting cpu %d (destination apic id: 0x%x) ",i,dest); apic_sipi(dest,0x7); // start on 0x7000 - } } diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 8007b1d..782ae86 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -26,13 +26,10 @@ static fifo fifos[MAX_FIFOS]; static uint32_t fifo_data_len[MAX_FIFOS]; static uint32_t next_fifo=0; -extern uint32_t fb_addr; - // screen / terminal term_out screen; terminal_tty tty1; - int syscall_unhandled(int nr) { char msg[256]; @@ -67,13 +64,11 @@ int syscall_lseek(int file,int ptr,int dir) // TODO: /dev/console or /dev/tty1 - /dev/ttyN int syscall_write(int file, char *buf, int len) { - for(int i=0;i<len;i++) { fd_write(&fds[file],buf[i]); fifo_data_len[file]++; } - return len; } @@ -240,35 +235,36 @@ int get_max_fd() // TODO: allow opening existing files/named pipes int syscall_open(char *name, int flags, int mode) { + if( next_fifo>=MAX_FIFOS || next_fd>=MAX_FD)kpanic("we ran out of fd's or fifo's"); - - if(0!=strcmp(name,"term")) - { - fifos[next_fifo]=fifo_create_buffered(1); - fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); - } - else + if(!strcmp(name,"term")) { - - // HERE WE SEE THE GENIUS OF OUR ABSTRACTIONS (I HOPE...) - - if (fb_addr<0x100000) // text-mode - { screen.put_char=console_put_char; screen.update_cursor=update_cursor; - } - else // framebuffer mode - { + + tty1=terminal_init(&screen,NULL); + + fifos[next_fifo].data=&tty1; + fifos[next_fifo].put=terminal_put; + + fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); + } + else if(!strcmp(name,"xterm")) + { screen.put_char=vesa_console_put_char; screen.update_cursor=vesa_update_cursor; - } - tty1=terminal_init(&screen,NULL); + tty1=terminal_init(&screen,NULL); - fifos[next_fifo].data=&tty1; - fifos[next_fifo].put=terminal_put; + fifos[next_fifo].data=&tty1; + fifos[next_fifo].put=terminal_put; + fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); + } + else + { + fifos[next_fifo]=fifo_create_buffered(1); fds[next_fd]=fd_from_fifo(&fifos[next_fifo]); } diff --git a/kernel/vmem.c b/kernel/vmem.c index b12b3b8..3cbda9a 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -42,8 +42,8 @@ typedef struct pdirectory_struct { }pdirectory; static uint32_t kernel_pages; -uint32_t fb_addr; // TODO!??!!? how can we share so ugly with vesa -static uint32_t apic_addr; +static uint32_t fb_addr; +static uint32_t local_apic_addr; static uint32_t io_apic_addr; // TODO : why is the frame not 0xfffff?? @@ -260,87 +260,76 @@ static pdirectory* vmem_clean_dir() return dir; } -static void vmem_add_alloc(pdirectory* dir,uint32_t start,uint32_t pages) +// addresses need to be page aligned. (or will be forced down) +static void vmem_add_generic(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages, bool alloc) { - uint32_t virt_addr=start; - for(int j=0;j<2;j++) - { + fixme("make sure the pages are marked as used in the physical mem manager, really?"); - ptable* table = (ptable*) kballoc (1); - pd_entry *oldentry=NULL; - ptable* oldtable=NULL; - - for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) - { - //klog("i = %d",i); - uint32_t phys_addr=mem_alloc_block(); // get free space from the memory manager + //force align + phys/=4096; + phys*=4096; - uint32_t frame=phys_addr; - - //! create a new page - pt_entry page=0; - pt_entry_add_attrib (&page, I86_PTE_PRESENT); - pt_entry_add_attrib (&page, I86_PTE_WRITABLE); - pt_entry_add_attrib (&page, I86_PTE_USER); - pt_entry_set_frame (&page, frame); - - //! ...and add it to the page table - table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - } - - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - *entry=0; - pd_entry_add_attrib (entry, I86_PDE_PRESENT); - pd_entry_add_attrib (entry, I86_PDE_WRITABLE); - pt_entry_add_attrib (entry, I86_PTE_USER); - pd_entry_set_frame (entry, (physical_addr)table); - - virt_addr+=1024*4096; - } - -} - -static void vmem_add_identity(pdirectory* dir,uint32_t start,uint32_t pages) -{ - fixme("make sure the pages are marked as used in the physical mem manager"); - - uint32_t phys_addr=start; - uint32_t virt_addr=start; + //force align + virt/=4096; + virt*=4096; while(pages>0) { - // each table in our page directory maps 1024*4096 bytes + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt) ]; ptable* table; - table = (ptable*) kballoc(1); - for(int i=0;i<1024;i++)table->m_entries [i]=0; // zero all - //! idenitity mapping - for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096) - { - //! create a new page - pt_entry page=0; - pt_entry_add_attrib (&page, I86_PTE_PRESENT); - pt_entry_add_attrib (&page, I86_PTE_WRITABLE); - pt_entry_add_attrib (&page, I86_PTE_USER); - pt_entry_set_frame (&page, frame); + if(*entry==0){ + // no pagetable here yet. + table = (ptable*) kballoc(1); + for(int i=0;i<1024;i++)table->m_entries [i]=0; // zero all - //! ...and add it to the page table - table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - pages--; - if(pages<=0)break; + pd_entry_add_attrib (entry, I86_PDE_PRESENT); + pd_entry_add_attrib (entry, I86_PDE_WRITABLE); + pd_entry_add_attrib (entry, I86_PDE_USER); + pd_entry_set_frame (entry, table); + } + else{ + // add to existing one. + table= pd_entry_get_frame (entry); } - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - *entry=0; - pd_entry_add_attrib (entry, I86_PDE_PRESENT); - pd_entry_add_attrib (entry, I86_PDE_WRITABLE); - pd_entry_add_attrib (entry, I86_PDE_USER); - pd_entry_set_frame (entry, (physical_addr)table); + if(alloc) + { + phys=mem_alloc_block(); // get free space from the memory manager + klog("allocated physical at 0x%08X",phys); + } - phys_addr+=1024*4096; - virt_addr+=1024*4096; + //create a new page + pt_entry page=0; + pt_entry_add_attrib (&page, I86_PTE_PRESENT); + pt_entry_add_attrib (&page, I86_PTE_WRITABLE); + pt_entry_add_attrib (&page, I86_PTE_USER); + pt_entry_set_frame (&page, phys); + + //and add it to the page table + uint32_t old=table->m_entries [PAGE_TABLE_INDEX (virt) ]; + if(old!=0&&old!=page)kpanic("overwriting existing page data!"); + table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + + virt+=4096; + phys+=4096; + + pages--; } } +static void vmem_add_alloc(pdirectory* dir,uint32_t addr,uint32_t pages) +{ + vmem_add_generic(dir,addr,addr,pages, true); +} + +static void vmem_add_remap(pdirectory* dir,uint32_t phys,uint32_t virt,uint32_t pages) +{ + vmem_add_generic(dir,phys,virt,pages, false); +} +static void vmem_add_identity(pdirectory* dir,uint32_t addr,uint32_t pages) +{ + vmem_add_generic(dir,addr,addr,pages, false); +} pdirectory* vmem_kernel_dir() { @@ -348,12 +337,18 @@ pdirectory* vmem_kernel_dir() fixme("do not waste soo many pages/page tables!"); fixme("align properly!! / merge page tables if required!"); fixme("Is ioapic/lapic really on one page?"); + fixme("kernelspace: kernel/lapic/framebuffer/ext2-ramimage"); + pdirectory* dir = vmem_clean_dir(); - vmem_add_identity(dir,0,1024*8);//first 32 megs - if(fb_addr>0x100000)vmem_add_identity(dir,fb_addr,1024*4);//16megs (?) TODO: dynamic - vmem_add_identity(dir,apic_addr,1024*2); - //vmem_add_identity(dir,io_apic_addr,1024*2); // we do not nee this (ioapic never accessed after paging enabled) - vmem_add_alloc(dir,0x8000000,1024*4); + + vmem_add_identity(dir,0,1024*8);//identity map first 32 megs... + + vmem_add_remap(dir,fb_addr,VMEM_FRAMEBUFFER,1024*8);//32megs should be enough for 4k (think about pitch) + vmem_add_remap(dir,local_apic_addr,VMEM_LAPIC,1); //apic addr should be at pagestart, right? TODO: check. + vmem_add_remap(dir,io_apic_addr,VMEM_IOAPIC,1); + + vmem_add_alloc(dir,VMEM_CPU_PRIVATE,2); + return dir; } @@ -483,8 +478,8 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only) } // 2 pages for apic ( in case on boundary??) - phys_addr=apic_addr; - virt_addr=apic_addr; + phys_addr=local_apic_addr; + virt_addr=local_apic_addr; for(int j=0;j<2;j++) { @@ -720,6 +715,6 @@ void vmem_init(multiboot_information *cfg_multiboot, acpi_information *cfg_acpi) { fixme("do not share fb_addr with syscalls like that!"); fb_addr=cfg_multiboot->framebuffer_addr; - apic_addr=cfg_acpi->local_apic_address; + local_apic_addr=cfg_acpi->local_apic_address; io_apic_addr=cfg_acpi->io_apic_address; } |
