summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-11 12:07:07 +0200
committerMiguel <m.i@gmx.at>2018-09-11 12:07:07 +0200
commit892f64ac908a474159fa3a952f13b62004662c70 (patch)
tree9492dacf8a72a5f22232a83fd0b87606b7f61fb1 /kernel
parent75f0977e41004511bd475ee75a24fd04db4ddc39 (diff)
screen checks if video or textmode, cpu private memory pages implemented
Diffstat (limited to 'kernel')
-rw-r--r--kernel/apic.c3
-rw-r--r--kernel/kernel.c34
-rw-r--r--kernel/kernel.h5
-rw-r--r--kernel/mem.c3
-rw-r--r--kernel/multiboot.c2
-rw-r--r--kernel/smp.c14
-rw-r--r--kernel/syscalls.c44
-rw-r--r--kernel/vmem.c149
8 files changed, 129 insertions, 125 deletions
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;
}