diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-03 22:54:35 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-03 22:54:35 +0100 |
| commit | b5d9da88991592d35d39dcae3829d2498b4e47e4 (patch) | |
| tree | 2be1ec075f489dc045310cace60d4c09340903b9 | |
| parent | 5435237fca6b7ab618bfc955e2973d7b325ff9dc (diff) | |
increased logger grnaularity and working on memory management
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | fs/elf.c | 10 | ||||
| -rw-r--r-- | fs/ext2.c | 17 | ||||
| -rw-r--r-- | kernel/config.h | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 9 | ||||
| -rw-r--r-- | kernel/mem.c | 5 | ||||
| -rw-r--r-- | kernel/syscalls.c | 23 | ||||
| -rw-r--r-- | kernel/task.c | 23 | ||||
| -rw-r--r-- | kernel/task.h | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 128 | ||||
| -rw-r--r-- | kernel/vmem.h | 38 | ||||
| -rw-r--r-- | lib/logger/log.h | 2 |
12 files changed, 120 insertions, 143 deletions
@@ -36,7 +36,7 @@ CFLAGS+=-ffreestanding CFLATS+=-Wall CFLAGS+=-Wextra #CFLAGS+=-O3 -CFLAGS+=-O0 +#CFLAGS+=-O0 #CFLAGS+=-nostdlib CFLAGS+=-std=gnu11 CFLAGS+=-I. @@ -78,10 +78,10 @@ uint32_t load_elf(char *name, uint32_t *alloc) //load binary uint32_t vaddr=0x08048000; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading %s",name); ext2_check(EXT2_RAM_ADDRESS); ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,vaddr,0x100000); // load 1mb; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ELF File loaded to final destination."); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"ELF File loaded to final destination."); Elf32_Ehdr *elf; elf=vaddr; @@ -121,7 +121,7 @@ uint32_t load_elf(char *name, uint32_t *alloc) if(phidx==0) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); } if(phidx==1) @@ -138,8 +138,8 @@ uint32_t load_elf(char *name, uint32_t *alloc) */ - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz); // let's copy the rw- data block uint32_t *data=vaddr+phdr->p_offset; @@ -118,9 +118,10 @@ int ext2_check(uint8_t *ram) ext2_superblock_ext super_ext; uint8_t *ptr=ram+1024; ram_read(ptr,&super,sizeof(super),1); - if(super.ext2_sig!=0xef53)log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"no ext2 signature found, where ram-image expected!"); - //check version and req features. - // + + if(super.ext2_sig!=0xef53){ + panic(FOOLOS_MODULE_NAME,"no ext2 signature found, where ram-image expected!"); + } } ext2_inode ext2_get_inode(uint8_t *ram,int inode_num) @@ -133,7 +134,7 @@ ext2_inode ext2_get_inode(uint8_t *ram,int inode_num) uint8_t *ptr=ram+1024; ram_read(ptr,&super,sizeof(super),1); - if(super.ext2_sig!=0xef53)log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"no ext2 signature found, where ram-image expected!"); + if(super.ext2_sig!=0xef53)panic(FOOLOS_MODULE_NAME,"no ext2 signature found, where ram-image expected!"); int block_group=(inode_num-1)/super.inodes_per_group; @@ -241,7 +242,7 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max) } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Fool Check Sum: 0x%08X for %d bytes",sum,count); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"Fool Check Sum: 0x%08X for %d bytes",sum,count); } @@ -259,7 +260,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) if(*path==0)final=true; else(*path=0); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"looking for %s '%s' in inode: %d",final?"file":"dir",first,inode_start); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"looking for %s '%s' in inode: %d",final?"file":"dir",first,inode_start); fs_dirent dirs[15]; int count= ext2_read_dir(ram, inode_start,dirs,15); // get dir @@ -268,7 +269,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) { if(true==strcmp(first,dirs[i].name,0)) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file"); if(final)return dirs[i].inode; return ext2_filename_to_inode_traverse(ram,last+1,dirs[i].inode); } @@ -299,7 +300,7 @@ int ext2_filename_to_inode(uint8_t *ram, char *path) int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read_dir : max: %d",max); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"read_dir : max: %d",max); ext2_inode inode=ext2_get_inode(ram,inode_nr); char buf[256]; diff --git a/kernel/config.h b/kernel/config.h index fb68dec..17b5f27 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -8,11 +8,11 @@ #define FOOLOS_CONFIG_H #define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line -#define FOOLOS_LOG_OFF // do not log anything +//#define FOOLOS_LOG_OFF // do not log anything #define FOOLOS_CONSOLE // otherwise VESA will be used! #define MEM_PRINT_MEMORYMAP #define LOG_BUF_SIZE 4069 -#define LOG_SYSCALLS +//#define LOG_SYSCALLS #endif diff --git a/kernel/kernel.c b/kernel/kernel.c index 8adbf37..64c87c0 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -45,7 +45,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) // 0x8048000 is where user programms start! - vmem_init(); + pdirectory *dir=vmem_init(); // // init output to screen @@ -93,12 +93,7 @@ void kernel_main(uint32_t initial_stack, int mp) // Initialize Multitasking // - task_init(); //; this will never return! - - - - - + task_init(dir); //; this will never return! } diff --git a/kernel/mem.c b/kernel/mem.c index 68a08d2..bd0d143 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -29,6 +29,11 @@ char *memmap_type_to_string[]= "Bad Memory" }; +uint32_t mem_get_free_blocks_count() +{ + return mem_free_blocks; +} + // bit funcs! void mmap_set(int bit) { diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 44b04bd..ed895b2 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -9,7 +9,6 @@ #include "kernel/config.h" #include <sys/stat.h> -static uint32_t alloc; // TODO: implement on a per process basis! int syscall_unhandled(int nr) { @@ -122,35 +121,45 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) int syscall_execve(char *name, char **argv1, char **env1) { - char *argv[]={"/bin/foolshell",NULL}; - char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL}; #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv,env); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1); #endif + uint32_t alloc; uint32_t entry=load_elf(name,&alloc); + if(!entry) { + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve: bailing out!"); + #endif return -1; // errror loading } + asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. + + char *argv[]={"/bin/foolshell",NULL}; + char *env[]={"PATH=/bin","TERM=xterm","PWD=/home/miguel","PS1=$ ",NULL}; int i=0; do{ + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); + #endif i++; }while(env[i]!=NULL); int argc=0; do{ + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]); + #endif argc++; }while(argv[argc]!=NULL); - asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. - + task_set_brk(alloc); + asm("push %0" :: "r" (argv)); asm("push %0" :: "r" (argc)); asm("push %0" :: "r" (env)); @@ -202,8 +211,10 @@ int syscall_isatty(int file,int none1,int none2) // TODO: per process basis! uint32_t syscall_sbrk(int incr, int none1, int none2) { + uint32_t alloc=task_get_brk(); uint32_t oldalloc=alloc; alloc+=incr; + task_set_brk(alloc); #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d) = 0x%08X", incr,oldalloc); diff --git a/kernel/task.c b/kernel/task.c index ac54dbe..586340b 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -9,6 +9,7 @@ #include "console.h" #include "x86.h" +#include "vmem.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" @@ -24,9 +25,10 @@ static volatile struct task_list_struct int parent; bool active; uint32_t esp; // stack pointer of the task; - uint32_t vmem; // number of virtual memory table to switch to + pdirectory *vmem; // number of virtual memory table to switch to bool waiting; bool skipwait; + uint32_t brk; }volatile task_list[MAX_TASKS]; @@ -44,6 +46,7 @@ int add_task(uint32_t esp, uint32_t vmem) task_list[i].active=true; task_list[i].waiting=false; task_list[i].skipwait=false; + task_list[i].brk=task_list[current_task].brk; return i; } @@ -97,6 +100,7 @@ uint32_t task_exit(uint32_t oldesp) int parent_pid=task_list[current_task].parent; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] exit ", current_task); + if(task_list[parent_pid].active) { if(task_list[parent_pid].waiting) @@ -113,6 +117,8 @@ uint32_t task_exit(uint32_t oldesp) } + vmem_free_dir(task_list[current_task].vmem); + return my_scheduler(oldesp); } @@ -134,18 +140,18 @@ uint32_t task_wait(uint32_t oldesp) uint32_t task_fork(uint32_t oldesp) { int pid=add_task(oldesp,vmem_new_space_dir(task_list[current_task].vmem)); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d]", current_task, pid); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d] (free blocks remaining: %d )", current_task, pid,mem_get_free_blocks_count()); return pid; } // init task (root of all other tasks / processes) // -void task_init() +void task_init(pdirectory *dir) { // this is our main task on slot 0 task_list[0].parent=0; task_list[0].active=true; task_list[0].waiting=false; - task_list[0].vmem=0; + task_list[0].vmem=dir; task_list[0].esp = 0; // will be set by next task_switch_next() call. current_task=0; @@ -160,4 +166,13 @@ int task_get_current_pid() return current_task; } +uint32_t task_get_brk() +{ + return task_list[current_task].brk; +} +void task_set_brk(uint32_t brk) +{ + task_list[current_task].brk=brk; +} + diff --git a/kernel/task.h b/kernel/task.h index 27e0484..c934d6d 100644 --- a/kernel/task.h +++ b/kernel/task.h @@ -1 +1 @@ -void task_init(); +void task_init(pdirectory *dir); diff --git a/kernel/vmem.c b/kernel/vmem.c index 0cea40b..3acb806 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -1,12 +1,14 @@ // http://www.brokenthorn.com/Resources/OSDev18.html +// +#include <stdlib.h> #include "kernel.h" #include "x86.h" #include "mem.h" +#include "vmem.h" #include "lib/logger/log.h" // logger facilities #define FOOLOS_MODULE_NAME "vmem" - // TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS { @@ -40,12 +42,6 @@ enum PAGE_PDE_FLAGS I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000 }; -//! page table entry -typedef uint32_t pt_entry; - -//! a page directery entry -typedef uint32_t pd_entry; - //// //! virtual address @@ -53,41 +49,6 @@ typedef uint32_t virtual_addr; typedef uint32_t physical_addr; typedef uint8_t bool; - -//! i86 architecture defines 1024 entries per table--do not change -#define PAGES_PER_TABLE 1024 -#define PAGES_PER_DIR 1024 - -#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff) -#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff) -#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff) - -//! page table represents 4mb address space -#define PTABLE_ADDR_SPACE_SIZE 0x400000 - -//! directory table represents 4gb address space -#define DTABLE_ADDR_SPACE_SIZE 0x100000000 - -//! page sizes are 4k -#define PAGE_SIZE 4096 - -//! page table -typedef struct ptable_struct { - - pt_entry m_entries[PAGES_PER_TABLE]; -}ptable ; - -//! page directory -typedef struct pdirectory_struct { - - pd_entry m_entries[PAGES_PER_DIR]; -}pdirectory; - -#define MAX_PAGEDIRS 10 -pdirectory *page_dirs[MAX_PAGEDIRS]; -int next_page_dir=0; -int current_dir=0; - //// void pt_entry_add_attrib (pt_entry* e, uint32_t attrib) @@ -210,57 +171,17 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) return 0; } - -// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html -/* -void vmmngr_map_page (void* phys, void* virt) +void vmem_free_dir(pdirectory *dir) { - } - -void show_cr() -{ - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr0: 0x%08x",x86_get_cr0()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr1: 0x%08x",x86_get_cr1()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr2: 0x%08x",x86_get_cr2()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr3: 0x%08x",x86_get_cr3()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr4: 0x%08x",x86_get_cr4()); - -} - -uint32_t vmem_alloc_block_at(uint32_t virt_addr) -{ - - uint32_t phys_addr=pmmngr_alloc_block(); // get free space from the memory manager - if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce"); - pdirectory* dir = page_dirs[current_dir]; - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; - if(entry==0)panic(FOOLOS_MODULE_NAME,"no table present at requested addr :("); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found entry at %08X",entry); - - //! 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_set_frame (&page, phys_addr); - - //! ...and add it to the page table - ptable *table=pt_entry_get_frame(entry); - table->m_entries [PAGE_TABLE_INDEX (virt_addr) ] = page; - return phys_addr; - -} -*/ - // vmem init and also copies all the shit for FORK -volatile int vmem_new_space_dir(int copy_dir) +pdirectory* vmem_new_space_dir(pdirectory *copy_dir) { x86_paging_disable(); pdirectory* dir = (pdirectory*) pmmngr_alloc_block (); if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new pdirectory: 0x%X",dir); for(int i=0;i<1024;i++)dir->m_entries [i]=0; @@ -275,7 +196,7 @@ volatile int vmem_new_space_dir(int copy_dir) ptable* table; // create new tables on init - if(next_page_dir==0) + if(copy_dir==NULL) { // alloc space for our new table table = (ptable*) pmmngr_alloc_block (); @@ -305,7 +226,7 @@ volatile int vmem_new_space_dir(int copy_dir) else { dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]= - page_dirs[0]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]; + copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]; } @@ -319,12 +240,12 @@ volatile int vmem_new_space_dir(int copy_dir) { ptable* table = (ptable*) pmmngr_alloc_block (); - pd_entry *oldentry= &(page_dirs[copy_dir]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]); + pd_entry *oldentry= &(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]); ptable* oldtable=pd_entry_get_frame(oldentry); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"oldtable at: 0x%08X",oldtable); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"oldtable at: 0x%08X",oldtable); if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"alloc table: %08X",table); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"alloc table: %08X",table); for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) { @@ -332,7 +253,7 @@ volatile int vmem_new_space_dir(int copy_dir) if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame"); // if this is not init , copy contents from current space! - if(next_page_dir!=0) + if(copy_dir!=NULL) { uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); @@ -363,33 +284,24 @@ volatile int vmem_new_space_dir(int copy_dir) } - page_dirs[next_page_dir]=dir; - if(next_page_dir!=0)x86_paging_enable(); - return next_page_dir++; + if(copy_dir!=NULL)x86_paging_enable(); + return dir; } -void vmem_set_dir(int dir) +void vmem_set_dir(pdirectory *dir) { - x86_set_pdbr(page_dirs[dir]); - current_dir=dir; + x86_set_pdbr(dir); } -void vmem_init() +pdirectory* vmem_init() { - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging"); - vmem_set_dir(vmem_new_space_dir(0)); + pdirectory *dir=vmem_new_space_dir(0); + vmem_set_dir(dir); x86_paging_enable(); - + return dir; } - - - - - - - diff --git a/kernel/vmem.h b/kernel/vmem.h index 5d35a30..7c7ffd0 100644 --- a/kernel/vmem.h +++ b/kernel/vmem.h @@ -1 +1,37 @@ -void vmem_init(); +//! i86 architecture defines 1024 entries per table--do not change +#define PAGES_PER_TABLE 1024 +#define PAGES_PER_DIR 1024 + +#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff) +#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff) +#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff) + +//! page table represents 4mb address space +#define PTABLE_ADDR_SPACE_SIZE 0x400000 + +//! directory table represents 4gb address space +#define DTABLE_ADDR_SPACE_SIZE 0x100000000 + +//! page sizes are 4k +#define PAGE_SIZE 4096 + +//! page table entry +typedef uint32_t pt_entry; + +//! a page directery entry +typedef uint32_t pd_entry; + + +//! page table +typedef struct ptable_struct { + + pt_entry m_entries[PAGES_PER_TABLE]; +}ptable ; + +//! page directory +typedef struct pdirectory_struct { + + pd_entry m_entries[PAGES_PER_DIR]; +}pdirectory; + +pdirectory* vmem_init(); diff --git a/lib/logger/log.h b/lib/logger/log.h index bbe4c64..da27340 100644 --- a/lib/logger/log.h +++ b/lib/logger/log.h @@ -1,6 +1,8 @@ #ifndef FOOLOS_LOG_H #define FOOLOS_LOG_H +#define FOOLOS_LOG_ERROR 5 +#define FOOLOS_LOG_WARNING 4 #define FOOLOS_LOG_INFO 3 #define FOOLOS_LOG_DEBUG 2 #define FOOLOS_LOG_FINE 1 |
