From e3b35847345aa298cebbb03f2d725d302955c583 Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Tue, 14 Sep 2021 18:54:59 +0300 Subject: [PATCH] [????] BUILD 0.1.1.??? DATE 9/0?/2011 AT ?:?? ?? ==================================================== Mainly changed: Tasking + Implemented multitasking --- ...09-08-11-08-21.095-VirtualBox.exe-4800.log | 4 + ...09-08-11-55-49.039-VirtualBox.exe-2220.log | 4 + Build/loader.o | Bin 1472 -> 1216 bytes Kernel/debug/commands.c | 2 +- Kernel/debug/console-base.c | 2 +- Kernel/drivers/drivers.c | 5 +- Kernel/hal/filesys/initrd/initrd.c | 10 +- Kernel/hal/hal.c | 2 +- Kernel/hal/vfs.c | 4 + Kernel/include/memory-add.h | 45 +- Kernel/include/settings.h | 2 +- Kernel/include/version.h | 2 +- Kernel/library/memory/memory_alloc.c | 3 +- Kernel/library/memory/memory_info.c | 13 +- Kernel/library/memory/memory_init.c | 25 +- Kernel/loader.asm | 40 +- Kernel/memory/mem-heap.c | 20 +- Kernel/memory/mem-paging.c | 142 +++++-- Kernel/memory/mem-phys.c | 78 ++-- bochs/bochs_run.log | 400 +++++++++--------- build/console.o | Bin 11840 -> 11840 bytes build/drivers.o | Bin 1640 -> 1588 bytes build/hal.o | Bin 2136 -> 2020 bytes build/initrd.o | Bin 3000 -> 3264 bytes build/mem-heap.o | Bin 3620 -> 3592 bytes build/mem-paging.o | Bin 2172 -> 2120 bytes build/mem-phys.o | Bin 2720 -> 2364 bytes build/memory_alloc.o | Bin 2888 -> 2876 bytes build/memory_info.o | Bin 1376 -> 1376 bytes build/memory_init.o | Bin 2432 -> 2568 bytes build/vfs.o | Bin 5140 -> 5168 bytes change.log | 13 + kernel.bin | Bin 62598 -> 62557 bytes link.ld | 9 - luxos.img | Bin 1474560 -> 1474560 bytes scripts/version.txt | 2 +- 36 files changed, 427 insertions(+), 400 deletions(-) create mode 100644 2011-09-08-11-08-21.095-VirtualBox.exe-4800.log create mode 100644 2011-09-08-11-55-49.039-VirtualBox.exe-2220.log diff --git a/2011-09-08-11-08-21.095-VirtualBox.exe-4800.log b/2011-09-08-11-08-21.095-VirtualBox.exe-4800.log new file mode 100644 index 0000000..ef8748f --- /dev/null +++ b/2011-09-08-11-08-21.095-VirtualBox.exe-4800.log @@ -0,0 +1,4 @@ +Log created: 2011-09-08T11:08:21.957118500Z +Executable: C:\PROGRA~1\oracle\Virtua~1\VirtualBox.exe +Commandline: C:\PROGRA~1\oracle\Virtua~1\\virtualbox --startvm "lux Testbed" --dbg +fatal error in recompiler cpu: triple fault diff --git a/2011-09-08-11-55-49.039-VirtualBox.exe-2220.log b/2011-09-08-11-55-49.039-VirtualBox.exe-2220.log new file mode 100644 index 0000000..8147f0e --- /dev/null +++ b/2011-09-08-11-55-49.039-VirtualBox.exe-2220.log @@ -0,0 +1,4 @@ +Log created: 2011-09-08T11:55:49.393922000Z +Executable: C:\PROGRA~1\oracle\Virtua~1\VirtualBox.exe +Commandline: C:\PROGRA~1\oracle\Virtua~1\\virtualbox --startvm "lux Testbed" --dbg +fatal error in recompiler cpu: triple fault diff --git a/Build/loader.o b/Build/loader.o index c47ad8b1666814c753ccffa036891f948d395fa2..e5acfcb0cc81e0f07103ba5266b9d6751090166f 100644 GIT binary patch delta 430 zcmX@WeSmX<0W${!%S1=@i2;0*KQOUO%;8~dm{_T~43vN*PznwbfSd%NBpXmf5QtfT7-W$a5W_40G8qm4 zIlDm&D1ez~1mtrvFo?m#85)2lSO9sfK+H7xD5H)HXGrjiKmY&#|Mdk-fr*8!KA{(+2%<6RX{dKI|MK>Y=tqwH1lM8 zmZz-6C5c5PlPy_gyn(FbY={bw9~ptp69v*tK+np6Xdwm$MG!5*z@P?_2l`V7N*jX2 IL7@!=03zKuu>b%7 delta 709 zcmY*XO-lk%6ut9iw6v(e(u}a6g%lwbE^4Q=aTP+VRv|j6C^6``XeAWwoo3f2`UB-U z2;8*IXxYkk{fJ;X_su-U4%|8Ce$0LMao;F5nj7rtaf&#_tW#caEnztAdF{iw%JwH3 z(G7)I3S^<;SkrI5cPv}*l-&W?x8S& zGsI~#2qaLCMfGSf3K99^@iCgRoWL6O83lIZ`qw@wN 4 * blocks / 5) c = 219; diff --git a/Kernel/debug/console-base.c b/Kernel/debug/console-base.c index 1eee06a..cb65186 100644 --- a/Kernel/debug/console-base.c +++ b/Kernel/debug/console-base.c @@ -55,7 +55,7 @@ Point ConsoleGetCursor() return ConsoleCursor; } -extern void ConsoleSetCursor(Point p) +void ConsoleSetCursor(Point p) { ConsoleCursor = p; } diff --git a/Kernel/drivers/drivers.c b/Kernel/drivers/drivers.c index ea27307..c344206 100644 --- a/Kernel/drivers/drivers.c +++ b/Kernel/drivers/drivers.c @@ -29,6 +29,7 @@ void DriversInstall() DriversInstall_Clock(); // Install fdc - IrqInstallHandler(6, FloppyIrqHandler); - FloppyInitialize(); + Error ("Floppy", "Floppy driver is currently disabled.\n"); + //IrqInstallHandler(6, FloppyIrqHandler); + //FloppyInitialize(); } diff --git a/Kernel/hal/filesys/initrd/initrd.c b/Kernel/hal/filesys/initrd/initrd.c index 1c7fbd2..2836d20 100644 --- a/Kernel/hal/filesys/initrd/initrd.c +++ b/Kernel/hal/filesys/initrd/initrd.c @@ -180,13 +180,16 @@ void luxInitrdInstall (MultibootInfo* info) VfsInstallFs(&fs); // Check for multiboot info flags to see if any modules are loaded - if ((info->Flags & 8) == 0) return; + if ((info->Flags & 8) == 0) { + Error("Initrd", "No boot modules found!"); + return; + } // Loop through each module and if it is an initrd image, mount it MultibootModule* modules = (MultibootModule*) info->ModulesAddress; for (i = 0; i < info->ModulesCount; i++) - if ((*(uint32*) modules[i].ModuleStart) == LUXMAGIC) + if (*((uint32*) modules[i].ModuleStart) == LUXMAGIC) { // Mount the device Log("Initrd", "Found initrd image at 0x%x.\n", modules[i].ModuleStart); @@ -196,4 +199,7 @@ void luxInitrdInstall (MultibootInfo* info) mp->FsData[0] = modules[i].ModuleStart; mp->FsData[1] = modules[i].ModuleEnd; } + else { + Log("Initrd", "Found module @ 0x%x, but not initrd image.\n", modules[i].ModuleStart); + } } diff --git a/Kernel/hal/hal.c b/Kernel/hal/hal.c index 0569d3e..a6fd502 100644 --- a/Kernel/hal/hal.c +++ b/Kernel/hal/hal.c @@ -34,7 +34,7 @@ void HalInitialize() KeyboardInstallB(); Log("HAL", "%#[2/2]\n", ColorLightGreen); // Install mouse driver - MouseInstall(); Log("HAL", "Installed mouse driver\n"); + //MouseInstall(); Log("HAL", "Installed mouse driver\n"); // Install VFS VfsInstall(); diff --git a/Kernel/hal/vfs.c b/Kernel/hal/vfs.c index b1f8c0d..82d05eb 100644 --- a/Kernel/hal/vfs.c +++ b/Kernel/hal/vfs.c @@ -228,6 +228,10 @@ DirectoryEntry* VfsReadDirectory (FILE* handle, uint32 index) if (!handle) return NULL; MountPoint* mp = &(mpArray[handle->DeviceId]); + // Don't try to read files as directories + if ((handle->Flags & 0x7) == FileFile) return NULL; + + // Ask FS to make the read if (!fsArray[mp->FsId].ReadDirectory) return NULL; return fsArray[mp->FsId].ReadDirectory(mp, handle, index); } diff --git a/Kernel/include/memory-add.h b/Kernel/include/memory-add.h index 08b99a9..6f66cb7 100644 --- a/Kernel/include/memory-add.h +++ b/Kernel/include/memory-add.h @@ -33,8 +33,6 @@ enum PageFlags PageFrame = 0xFFFFF000 }; - - typedef struct { Page Pages[1024]; } PageTable; @@ -48,25 +46,28 @@ typedef struct { extern PageDirectory* CurrentDirectory; extern PageDirectory* KernelDirectory; -extern void PagingInitialize(uint32 SystemMemory); -extern void PagingSwitchPageDirectory (PageDirectory* dir); -extern Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir); - +extern void PagingEnable (); +extern void PagingDisable (); +extern void PagingSwitchDirectory (PageDirectory* dir); +extern void PagingFlushTlb (); +extern void PagingInitialize (uint32* kernelEnd); +extern void PagingMapPage (uint32 phys, uint32 virt, uint32 flags, PageDirectory* pd); +extern void PagingUnmapPage (uint32 virt, PageDirectory* pd); +extern uint32 PagingGetPhysical (uint32 virt, PageDirectory* pd); /*************************************************** * Physical memory manager * ***************************************************/ -extern uint32 TotalFrames; +extern uint32 TotalBlocks; extern uint32 TotalMemory; -extern uint32 UsedFrames; +extern uint32 UsedBlocks; -void MemPhInitialize(uint32 SystemMemoryKb); -extern void MemPhSetFrame (uint32 frame, uint8 value); -uint32 MemPhGetFrame (uint32 frame); -uint32 MemPhFindFreeFrame(); -void MemPhAllocFrame(Page* page, uint8 isKernel, uint8 isWriteable); -void MemPhFreeFrame(Page* page); -void MemPhReserveFrames (uint32 address, uint32 length); +extern void MemPhInitialize (uint32 SystemMemoryKb); +extern void MemPhSetBlock (uint32 Block, uint8 value); +extern uint32 MemPhGetBlock (uint32 Block); +extern uint32 MemPhAllocateBlock (); +extern void MemPhFreeBlock (uint32 addr); +extern void MemPhReserveBlocks (uint32 address, uint32 length); /*************************************************** @@ -82,12 +83,12 @@ typedef struct extern MemHeap* KernelHeap; -extern uint32 MemHeapFindSmallestHole (uint32 size, uint8 page_align, MemHeap* heap); -extern int32 MemHeapCompare (uint32 a, uint32 b); -extern MemHeap* MemHeapCreate(uint32 start, uint32 end, uint32 max, uint8 flags); -extern void MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd); -extern uint32 MemHeapContract(uint32 newsz, MemHeap* heap, PageDirectory* pd); -extern uint32 MemHeapAlloc (uint32 size, uint8 isPageAligned, MemHeap* heap, PageDirectory* pd); -extern void MemHeapFree (uint32 address, MemHeap* heap, PageDirectory* pd); +extern uint32 MemHeapFindSmallestHole (uint32 size, uint8 page_align, MemHeap* heap); +extern int32 MemHeapCompare (uint32 a, uint32 b); +extern MemHeap* MemHeapCreate (uint32 start, uint32 end, uint32 max, uint8 flags); +extern uint32 MemHeapExpand (uint32 newsz, MemHeap* heap, PageDirectory* pd); +extern uint32 MemHeapContract (uint32 newsz, MemHeap* heap, PageDirectory* pd); +extern uint32 MemHeapAlloc (uint32 size, uint8 isPageAligned, MemHeap* heap, PageDirectory* pd); +extern void MemHeapFree (uint32 address, MemHeap* heap, PageDirectory* pd); #endif /* MEMORY_ADD_H_ */ diff --git a/Kernel/include/settings.h b/Kernel/include/settings.h index bf7b528..5de2003 100644 --- a/Kernel/include/settings.h +++ b/Kernel/include/settings.h @@ -32,7 +32,7 @@ // Memory manager #define KERNEL_HEAP_START 0xC0000000 #define KERNEL_HEAP_INITIAL_SIZE 0x100000 -#define KERNEL_HEAP_END (KERNEL_HEAP_START + KERNEL_HEAP_INITIAL_SIZE) +#define KERNEL_HEAP_END (KERNEL_HEAP_START + KERNEL_HEAP_INITIAL_SIZE) #endif /* SETTINGS_H_ */ diff --git a/Kernel/include/version.h b/Kernel/include/version.h index 45df4f7..f4ab084 100644 --- a/Kernel/include/version.h +++ b/Kernel/include/version.h @@ -1 +1 @@ -#define OS_BUILD "0.1.0.601" +#define OS_BUILD "0.1.0.629" diff --git a/Kernel/library/memory/memory_alloc.c b/Kernel/library/memory/memory_alloc.c index 4b7c4ea..3ab91f8 100644 --- a/Kernel/library/memory/memory_alloc.c +++ b/Kernel/library/memory/memory_alloc.c @@ -28,8 +28,7 @@ uint32 _malloc_init2 (uint32 size, uint8 page_aligned, uint32* phys) if (phys) { - Page *pg = PagingGetPage(ret, 0, KernelDirectory); - *phys = (*pg & PageFrame) + (ret & 0xFFF); + *phys = PagingGetPhysical(ret, KernelDirectory) + (ret & 0xFFF); Log("Mem","%#Allocated %u bytes (%spage aligned) at address 0x%x (phys=%x).\n", ColorLightMagenta, size, ((page_aligned) ? "" : "not "), ret, *phys); } diff --git a/Kernel/library/memory/memory_info.c b/Kernel/library/memory/memory_info.c index fbcf54a..001d8c6 100644 --- a/Kernel/library/memory/memory_info.c +++ b/Kernel/library/memory/memory_info.c @@ -6,7 +6,6 @@ */ #include -// MemoryGetFree(), MemoryGetTotal(), MemoryGet blah blah... // Returns total physical memory in bytes uint32 MemoryGetTotal() @@ -17,13 +16,13 @@ uint32 MemoryGetTotal() // Returns total free physical memory in bytes uint32 MemoryGetFree() { - return (TotalFrames - UsedFrames) * 0x4; + return (TotalBlocks - UsedBlocks) * 0x4; } // Total used physical memory in bytes uint32 MemoryGetUsed() { - return UsedFrames * 0x4; + return UsedBlocks * 0x4; } // Same as above functions, but in frames @@ -34,15 +33,15 @@ uint32 MemoryGetFrameSize() uint32 MemoryGetFramesTotal() { - return TotalFrames; + return TotalBlocks; } uint32 MemoryGetFramesUsed() { - return UsedFrames; + return UsedBlocks; } uint32 MemoryGetFramesFree() { - return (TotalFrames - UsedFrames); -} \ No newline at end of file + return (TotalBlocks - UsedBlocks); +} diff --git a/Kernel/library/memory/memory_init.c b/Kernel/library/memory/memory_init.c index cb87d01..dec5ac4 100644 --- a/Kernel/library/memory/memory_init.c +++ b/Kernel/library/memory/memory_init.c @@ -10,7 +10,6 @@ #include "../../drivers/cmos/cmos.h" #include - uint32 mem_kernel_end = 0; uint8 mem_initialized = 0; @@ -42,7 +41,7 @@ void _memory_reserve_system(MultibootInfo* info) while ((uint32)location < (info->MemoryMapAddress + info->MemoryMapLength)) { if (location->Type > 1) - MemPhReserveFrames((uint32)location->Address, (uint32)location->Length); + MemPhReserveBlocks((uint32)location->Address, (uint32)location->Length); location = (MultibootMemoryMapEntry*) ((uint32)location + location->Size + sizeof(uint32)); } @@ -53,29 +52,35 @@ void _memory_reserve_system(MultibootInfo* info) Error("Mem", "%#Missing %#memory map%# info from bootloader.\n", ColorLightRed, ColorWhite, ColorLightRed); // Standard memory hole at 15mb - MemPhReserveFrames(0x00F00000, 0x00100000); + MemPhReserveBlocks(0x00F00000, 0x00100000); } - // Standard reserved memory areas - MemPhReserveFrames(0x0, 0x400 + 256); // Real mode IVT, BDA - MemPhReserveFrames(0x1000, 0x2400); // DMA buffer - MemPhReserveFrames(0x9FC00, 385*1024); // EBDA, Video memory, ROM area } void MemoryInitialize (MultibootInfo* info) { + // Get total system memory uint32 totalSystemMemory = _memory_get_total_mem(info); + // Initialize physical & virtual memory managers + uint32 end = mem_kernel_end + 0x80000; MemPhInitialize(totalSystemMemory); - PagingInitialize(0x200000); + PagingInitialize(&end); + // Reserve physical blocks _memory_reserve_system(info); + uint32 i; + // Allocate some space for the kernel heap + for (i = KERNEL_HEAP_START; i <= KERNEL_HEAP_END; i += 0x1000) + PagingMapPage(MemPhAllocateBlock(), i, PageWriteable, KernelDirectory); + + // Create the kernel heap KernelHeap = MemHeapCreate(KERNEL_HEAP_START, KERNEL_HEAP_START + KERNEL_HEAP_INITIAL_SIZE, 0xCFFFF000, 3); // is kernel, writeable - Log("Mem", "Done initializing memory!"); + Log("Mem", "Done initializing memory!\n"); mem_initialized = 2; } @@ -84,5 +89,5 @@ void MemoryTempInitialize (uint32 kernel_end) { mem_initialized = 1; mem_kernel_end = kernel_end; - Log("Mem", "Initialized temporary memory manager, allocating from %#0x%x.\n", kernel_end); + Log("Mem", "Initialized temporary memory manager, allocating from %#0x%x.\n", ColorWhite, mem_kernel_end); } diff --git a/Kernel/loader.asm b/Kernel/loader.asm index 119b3c7..ca583f6 100644 --- a/Kernel/loader.asm +++ b/Kernel/loader.asm @@ -26,29 +26,22 @@ start: mov ecx, eax -; lgdt [trickgdt] -; mov ax, 0x10; -; mov ds, ax -; mov es, ax -; mov fs, ax -; mov gs, ax -; mov ss, ax - -; jmp 0x08:HigherHalf ; NOTE: Must be absolute jump! - -HigherHalf: - - ; Verify booted with multiboot compliant bootloader + ; setup initial stack mov esp, stack+STACKSIZE + ; Verify booted with multiboot compliant bootloader cmp ecx, 0x2BADB002 jne .bad + push esp push ebx extern k_main call k_main + cli + hlt + ; Show error message, and halt system .bad: @@ -72,27 +65,8 @@ HigherHalf: ErrorString db 0xA, "%#! Fatal error: Not booted with multiboot compliant bootloader (e.g. GRUB).", 0x0 ErrorColor db 0x0C - - -; tells the assembler to include this data in the '.setup' section -section .setup - -trickgdt: - dw gdt_end - gdt - 1 ; size of the GDT - dd gdt ; linear address of GDT - -gdt: - dd 0, 0 ; null gate - db 0xFF, 0xFF, 0, 0, 0, 10011010b, 11001111b, 0x40 ; code selector 0x08: base 0x40000000, limit 0xFFFFFFFF, type 0x9A, granularity 0xCF - db 0xFF, 0xFF, 0, 0, 0, 10010010b, 11001111b, 0x40 ; data selector 0x10: base 0x40000000, limit 0xFFFFFFFF, type 0x92, granularity 0xCF - -gdt_end: - - - - ; stack section .bss align 32 stack: - resb STACKSIZE ; This reserves 64KBytes of memory here + resb STACKSIZE ; This reserves memory for stack diff --git a/Kernel/memory/mem-heap.c b/Kernel/memory/mem-heap.c index eac2d6e..dee88e1 100644 --- a/Kernel/memory/mem-heap.c +++ b/Kernel/memory/mem-heap.c @@ -6,9 +6,6 @@ #define MEMHEAP_INDEX_SIZE 0x20000 #define MEMHEAP_MINIM_SIZE 0x70000 -#define FlagsKernel 1 -#define FlagsWriteable 2 - typedef struct { uint32 Magic; @@ -98,30 +95,31 @@ MemHeap* MemHeapCreate(uint32 start, uint32 end, uint32 max, uint8 flags) } -void MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd) +uint32 MemHeapExpand(uint32 newsz, MemHeap* heap, PageDirectory* pd) { - if (newsz <= heap->EndAddress - heap->StartAddress) return; + if (newsz <= heap->EndAddress - heap->StartAddress) return heap->EndAddress - heap->StartAddress; if (newsz & 0xfff) newsz = (newsz & 0xfffff000) + 0x1000; - if (newsz + heap->StartAddress >= heap->MaxAddress) return; + if (newsz + heap->StartAddress >= heap->MaxAddress) return heap->EndAddress - heap->StartAddress; uint32 i; - for (i = heap->EndAddress - heap->StartAddress; i < heap->StartAddress + newsz; i+=0x1000) - MemPhAllocFrame(PagingGetPage(i, 1, pd), heap->Flags & FlagsKernel, heap->Flags & FlagsWriteable); + for (i = heap->EndAddress; i < heap->StartAddress + newsz; i+=0x1000) + PagingMapPage(MemPhAllocateBlock(), i, heap->Flags, pd); heap->EndAddress = heap->StartAddress + newsz; + return newsz; } uint32 MemHeapContract(uint32 newsz, MemHeap* heap, PageDirectory* pd) { - if (newsz >= heap->EndAddress - heap->StartAddress) return 0; + if (newsz >= heap->EndAddress - heap->StartAddress) return heap->EndAddress - heap->StartAddress; if (newsz & 0xfff) newsz = (newsz & 0xfffff000) + 0x1000; // page align newsz = Max(newsz, MEMHEAP_MINIM_SIZE); uint32 i; - for (i = heap->EndAddress - heap->StartAddress - 0x1000; i > newsz; i-=0x1000) - MemPhFreeFrame(PagingGetPage(i, 0, pd)); + for (i = heap->EndAddress - 0x1000; i > heap->StartAddress + newsz; i-=0x1000) + PagingUnmapPage(i, pd); heap->EndAddress = heap->StartAddress + newsz; return newsz; diff --git a/Kernel/memory/mem-paging.c b/Kernel/memory/mem-paging.c index f9c3904..c7620cc 100644 --- a/Kernel/memory/mem-paging.c +++ b/Kernel/memory/mem-paging.c @@ -6,69 +6,123 @@ */ #include #include + /******************************* * Data * *******************************/ PageDirectory* CurrentDirectory; PageDirectory* KernelDirectory; -/******************************* - * Useful routines * - *******************************/ -void PagingInitialize(uint32 kernel_used) +void PagingEnable() { - Log("Mem", "Virtual memory manager initialization started. End of kernel = 0x%x\n", kernel_used); - PageDirectory* kernelPd = (PageDirectory*) kmalloc_a(sizeof(PageDirectory)); - memset(kernelPd, 0, sizeof(PageDirectory)); - - CurrentDirectory = kernelPd; - KernelDirectory = kernelPd; - - uint32 i; - for (i = 0; i < kernel_used; i+=0x1000) - MemPhAllocFrame(PagingGetPage(i, 1, kernelPd), 0, 0); - - Log("Mem", "Identity mapped first 0x%x bytes.\n", kernel_used); - - for (i = KERNEL_HEAP_START; i < KERNEL_HEAP_END; i+=0x1000) - MemPhAllocFrame(PagingGetPage(i, 1, kernelPd), 1, 1); - - Log("Mem", "Mapped kernel space.\n"); - - PagingSwitchPageDirectory (kernelPd); + uint32 tmp; + asm volatile ("mov %%cr0, %0" : "=r"(tmp)); + tmp |= 0x80000000; + asm volatile ("mov %0, %%cr0" : : "r"(tmp)); } -void PagingSwitchPageDirectory (PageDirectory* dir) +void PagingDisable() +{ + uint32 tmp; + asm volatile ("mov %%cr0, %0" : "=r"(tmp)); + tmp &= 0x7FFFFFFF; + asm volatile ("mov %0, %%cr0" : : "r"(tmp)); +} + +void PagingSwitchDirectory(PageDirectory* dir) { CurrentDirectory = dir; - asm volatile ("mov %0, %%cr3":: "r"(&dir->TablesPhysical)); - - uint32 cr0; - asm volatile ("mov %%cr0, %0": "=r"(cr0)); - cr0 |= 0x80000000; - asm volatile ("mov %0, %%cr0":: "r"(cr0)); - - Log("Mem", "Enabled paging.\n"); + asm volatile ("mov %0, %%cr3" : : "r"(dir->PhysicalAddr)); } -Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir) +void PagingFlushTlb () { - addr >>= 12; + uint32 tmp; + asm volatile ("mov %%cr3, %0" : "=r"(tmp)); + asm volatile ("mov %0, %%cr3" : : "r" (tmp)); +} - uint32 tableIndex = addr >> 10; +void PagingInitialize(uint32* kernelEnd) +{ + // Create the kernel page directory + PageDirectory* kdir = kmalloc_a(sizeof(PageDirectory)); + memset(kdir, 0, sizeof(PageDirectory)); - if (dir->Tables[tableIndex]) - return &dir->Tables[tableIndex]->Pages[addr&0x3ff]; + KernelDirectory = kdir; - else if (make) + // Set up physical address of PDEs. + kdir->PhysicalAddr = (uint32) kdir->TablesPhysical; + + // Identity map the kernel + uint32 i = 0; + while (i <= *kernelEnd + 1024) { - uint32 temp; - dir->Tables[tableIndex] = (PageTable*)kmalloc_ap(sizeof(PageTable), &temp); - memset (dir->Tables[tableIndex], 0, 0x1000); - dir->TablesPhysical[tableIndex] = temp | 0x7; - return &dir->Tables[tableIndex]->Pages[addr&0x3ff]; + PagingMapPage(i, i, PageWriteable, kdir); + i += 0x1000; } - else return 0; + // Reserve the identity mapped blocks + MemPhReserveBlocks(0x0, *kernelEnd); + + PagingSwitchDirectory(kdir); + PagingEnable(); } +void PagingMapPage (uint32 phys, uint32 virt, uint32 flags, PageDirectory* pd) +{ + // Calculate pde and pte + uint32 pde = virt >> 22; + uint32 pte = (virt >> 12) & 0x3ff; + + phys &= 0xFFFFF000; // Make sure address is page aligned + flags &= 0xFFF; // Make sure flags don't overflow + + // See if page table exists + if (!pd->Tables[pde]) + { + // No? allocate it + uint32 ph; + PageTable* pt = kmalloc_ap(sizeof(PageTable), &ph); + memset(pt, 0, sizeof(PageTable)); + + pd->Tables[pde] = pt; + pd->TablesPhysical[pde] = ph | 0x7; + } + + // Set up the page + pd->Tables[pde]->Pages[pte] = phys | flags | 0x1; // Present, and flags + + // If it is the current directory, flush the tlb to notice the change + if (pd == CurrentDirectory) PagingFlushTlb(); +} + +void PagingUnmapPage (uint32 virt, PageDirectory* pd) +{ + // Calculate pde and pte + uint32 pde = virt >> 22; + uint32 pte = (virt >> 12) & 0x3ff; + + if (!pd->Tables[pde] || !pd->Tables[pde]->Pages[pte]) return; + + // Get physical address + uint32 phys = pd->Tables[pde]->Pages[pte] & PageFrame; + + // Free page + pd->Tables[pde]->Pages[pte] = 0; + MemPhFreeBlock(phys); + + // If it is the current directory, flush the tlb to notice the change + if (pd == CurrentDirectory) PagingFlushTlb(); +} + +uint32 PagingGetPhysical (uint32 virt, PageDirectory* pd) +{ + // Calculate pde and pte + uint32 pde = virt >> 22; + uint32 pte = (virt >> 12) & 0x3ff; + + // Not mapped + if (!pd->Tables[pde] || !pd->Tables[pde]->Pages[pte]) return NULL; + + return (pd->Tables[pde]->Pages[pte] & PageFrame); +} diff --git a/Kernel/memory/mem-phys.c b/Kernel/memory/mem-phys.c index 6f7b47a..974c694 100644 --- a/Kernel/memory/mem-phys.c +++ b/Kernel/memory/mem-phys.c @@ -6,103 +6,89 @@ */ #include -uint32* FrameMap; -uint32 TotalFrames; +uint32* BlockMap; +uint32 TotalBlocks; uint32 TotalMemory; -uint32 UsedFrames; +uint32 UsedBlocks; -inline void ConvertIndexToFrame (uint32 index, uint32* address, uint32* offset) +inline void ConvertIndexToBlock (uint32 index, uint32* address, uint32* offset) { *address = (index >> 5); *offset = index & 0x1f; } -inline uint32 ConvertFrameToIndex (uint32 address, uint32 offset) +inline uint32 ConvertBlockToIndex (uint32 address, uint32 offset) { return (address<<5) | offset; } -void MemPhSetFrame (uint32 frame, uint8 value) +void MemPhSetBlock (uint32 Block, uint8 value) { uint32 addr, off; - ConvertIndexToFrame(frame, &addr, &off); + ConvertIndexToBlock(Block, &addr, &off); if (value) { - if ((FrameMap[addr] & (1<> 5; addr++) - if (FrameMap[addr] != 0xffffffff) + for (addr = 0; addr < TotalBlocks >> 5; addr++) + if (BlockMap[addr] != 0xffffffff) { - for (pos = 0; (FrameMap[addr] & (1<> 12; + if (!Block) return; - uint32 free = MemPhFindFreeFrame(); - if (free == 0xffffffff) { - Panic("Mem", "%#Failed allocation free=0x%x page=0x%x\n", ColorRed, free, *page); - return; - } - - MemPhSetFrame(free, 1); - *page |= PagePresent; - *page |= (isKernel) ? 0 : PageUser; - *page |= (isWriteable) ? PageWriteable : 0; - *page |= (free<<12) & PageFrame; -} - -void MemPhFreeFrame(Page* page) -{ - uint32 frame = *page & PageFrame; - if (!frame) return; - - MemPhSetFrame(frame, 0); - *page &= ~PageFrame; + MemPhSetBlock(Block, 0); } void MemPhInitialize(uint32 SystemMemoryKb) { - TotalFrames = SystemMemoryKb >> 2; + TotalBlocks = SystemMemoryKb >> 2; TotalMemory = SystemMemoryKb; - FrameMap = (uint32*) kmalloc(sizeof(uint32) * (1 + (TotalFrames>>5))); - memset(FrameMap, 0, sizeof(uint32) * (1 + (TotalFrames>>5))); + BlockMap = (uint32*) kmalloc(sizeof(uint32) * (1 + (TotalBlocks>>5))); + memset(BlockMap, 0, sizeof(uint32) * (1 + (TotalBlocks>>5))); Log("Mem", "%#Started physical memory manager ok!, found %ukb\n", ColorLightGreen, SystemMemoryKb); } -void MemPhReserveFrames (uint32 address, uint32 length) +void MemPhReserveBlocks (uint32 address, uint32 length) { address >>= 12; length = (length>>12) + ((length & 0xfff) > 0); uint32 end = address + length; for (; address < end ; address++) - MemPhSetFrame(address, 1); + MemPhSetBlock(address, 1); } diff --git a/bochs/bochs_run.log b/bochs/bochs_run.log index 16cd2dd..da76dfd 100644 --- a/bochs/bochs_run.log +++ b/bochs/bochs_run.log @@ -1,206 +1,194 @@ -00000000000i[ ] Bochs x86 Emulator 2.4.6 -00000000000i[ ] Build from CVS snapshot, on February 22, 2011 -00000000000i[ ] Compiled at Aug 28 2011, 16:32:50 -00000000000i[ ] System configuration -00000000000i[ ] processors: 1 (cores=1, HT threads=1) -00000000000i[ ] A20 line support: yes -00000000000i[ ] CPU configuration -00000000000i[ ] level: 6 -00000000000i[ ] SMP support: yes, quantum=5 -00000000000i[ ] APIC support: yes -00000000000i[ ] FPU support: yes -00000000000i[ ] MMX support: yes -00000000000i[ ] 3dnow! support: yes -00000000000i[ ] SEP support: yes -00000000000i[ ] SSE support: sse2 -00000000000i[ ] XSAVE support: no -00000000000i[ ] AES support: no -00000000000i[ ] MOVBE support: no -00000000000i[ ] x86-64 support: yes -00000000000i[ ] 1G paging support: no -00000000000i[ ] VMX support: 1 -00000000000i[ ] Optimization configuration -00000000000i[ ] RepeatSpeedups support: yes -00000000000i[ ] Trace cache support: yes -00000000000i[ ] Fast function calls: yes -00000000000i[ ] Devices configuration -00000000000i[ ] ACPI support: yes -00000000000i[ ] NE2000 support: no -00000000000i[ ] PCI support: yes, enabled=yes -00000000000i[ ] SB16 support: yes -00000000000i[ ] USB support: no -00000000000i[ ] VGA extension support: vbe -00000000000i[MEM0 ] allocated memory at 0xb4116008. after alignment, vector=0xb4117000 -00000000000i[MEM0 ] 32.00MB -00000000000i[MEM0 ] mem block size = 0x00100000, blocks=32 -00000000000i[MEM0 ] rom at 0xfffe0000/131072 ('/usr/local/share/bochs/BIOS-bochs-latest') -00000000000i[MEM0 ] rom at 0xc0000/40448 ('/usr/local/share/bochs/VGABIOS-lgpl-latest') -00000000000i[CMOS ] Using local time for initial clock -00000000000i[CMOS ] Setting initial clock to: Mon Aug 29 10:21:59 2011 (time0=1314602519) -00000000000i[DMA ] channel 4 used by cascade -00000000000i[DMA ] channel 2 used by Floppy Drive -00000000000i[FDD ] fd0: '../luxos.img' ro=0, h=2,t=80,spt=18 -00000000000i[PCI ] 440FX Host bridge present at device 0, function 0 -00000000000i[PCI ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 -00000000000i[VGA ] interval=50000 -00000000000i[MEM0 ] Register memory access handlers: 0x00000000000a0000 - 0x00000000000bffff -00000000000i[XGUI ] test_alloc_colors: 16 colors available out of 16 colors tried -00000000000i[XGUI ] font 8 wide x 16 high, display depth = 24 -00000000000i[MEM0 ] Register memory access handlers: 0x00000000e0000000 - 0x00000000e0ffffff -00000000000i[VGA ] VBE Bochs Display Extension Enabled -00000000000i[ ] init_dev of 'unmapped' plugin device by virtual method -00000000000i[ ] init_dev of 'biosdev' plugin device by virtual method -00000000000i[ ] init_dev of 'speaker' plugin device by virtual method -00000000000i[SPEAK] Failed to open /dev/console: Resource temporarily unavailable -00000000000i[SPEAK] Deactivating beep on console -00000000000i[ ] init_dev of 'extfpuirq' plugin device by virtual method -00000000000i[ ] init_dev of 'gameport' plugin device by virtual method -00000000000i[ ] init_dev of 'iodebug' plugin device by virtual method -00000000000i[ ] init_dev of 'pci_ide' plugin device by virtual method -00000000000i[PCI ] PIIX3 PCI IDE controller present at device 1, function 1 -00000000000i[ ] init_dev of 'acpi' plugin device by virtual method -00000000000i[PCI ] ACPI Controller present at device 1, function 3 -00000000000i[ ] init_dev of 'ioapic' plugin device by virtual method -00000000000i[IOAP ] initializing I/O APIC -00000000000i[MEM0 ] Register memory access handlers: 0x00000000fec00000 - 0x00000000fec00fff -00000000000i[ ] init_dev of 'keyboard' plugin device by virtual method -00000000000i[KBD ] will paste characters every 1000 keyboard ticks -00000000000i[ ] init_dev of 'harddrv' plugin device by virtual method -00000000000i[HD ] Using boot sequence floppy, none, none -00000000000i[HD ] Floppy boot signature check is enabled -00000000000i[ ] init_dev of 'serial' plugin device by virtual method -00000000000i[SER ] com1 at 0x03f8 irq 4 -00000000000i[ ] init_dev of 'parallel' plugin device by virtual method -00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 -00000000000i[ ] register state of 'unmapped' plugin device by virtual method -00000000000i[ ] register state of 'biosdev' plugin device by virtual method -00000000000i[ ] register state of 'speaker' plugin device by virtual method -00000000000i[ ] register state of 'extfpuirq' plugin device by virtual method -00000000000i[ ] register state of 'gameport' plugin device by virtual method -00000000000i[ ] register state of 'iodebug' plugin device by virtual method -00000000000i[ ] register state of 'pci_ide' plugin device by virtual method -00000000000i[ ] register state of 'acpi' plugin device by virtual method -00000000000i[ ] register state of 'ioapic' plugin device by virtual method -00000000000i[ ] register state of 'keyboard' plugin device by virtual method -00000000000i[ ] register state of 'harddrv' plugin device by virtual method -00000000000i[ ] register state of 'serial' plugin device by virtual method -00000000000i[ ] register state of 'parallel' plugin device by virtual method -00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called -00000000000i[CPU0 ] cpu hardware reset -00000000000i[APIC0] allocate APIC id=0 (MMIO enabled) to 0x00000000fee00000 -00000000000i[CPU0 ] CPU[0] is the bootstrap processor -00000000000i[CPU0 ] CPUID[0x00000000]: 00000003 68747541 444d4163 69746e65 -00000000000i[CPU0 ] CPUID[0x00000001]: 00000f23 00000800 00002020 07cbfbff -00000000000i[CPU0 ] CPUID[0x00000002]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x00000007]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 68747541 444d4163 69746e65 -00000000000i[CPU0 ] CPUID[0x80000001]: 00000f23 00000000 00000001 ebd3fbff -00000000000i[CPU0 ] CPUID[0x80000002]: 20444d41 6c687441 74286e6f 7020296d -00000000000i[CPU0 ] CPUID[0x80000003]: 65636f72 726f7373 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000004]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000005]: 01ff01ff 01ff01ff 40020140 40020140 -00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 -00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 -00000000000i[CPU0 ] CPUID[0x80000008]: 00003028 00000000 00000000 00000000 -00000000000i[ ] reset of 'unmapped' plugin device by virtual method -00000000000i[ ] reset of 'biosdev' plugin device by virtual method -00000000000i[ ] reset of 'speaker' plugin device by virtual method -00000000000i[ ] reset of 'extfpuirq' plugin device by virtual method -00000000000i[ ] reset of 'gameport' plugin device by virtual method -00000000000i[ ] reset of 'iodebug' plugin device by virtual method -00000000000i[ ] reset of 'pci_ide' plugin device by virtual method -00000000000i[ ] reset of 'acpi' plugin device by virtual method -00000000000i[ ] reset of 'ioapic' plugin device by virtual method -00000000000i[ ] reset of 'keyboard' plugin device by virtual method -00000000000i[ ] reset of 'harddrv' plugin device by virtual method -00000000000i[ ] reset of 'serial' plugin device by virtual method -00000000000i[ ] reset of 'parallel' plugin device by virtual method -00000000000i[XGUI ] [x] Mouse off -00000003305i[BIOS ] $Revision: 1.257 $ $Date: 2011/01/26 09:52:02 $ -00000318072i[KBD ] reset-disable command received -00000444792i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ -00000444863i[VGA ] VBE known Display Interface b0c0 -00000444895i[VGA ] VBE known Display Interface b0c5 -00000447820i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ -00000600000i[XGUI ] charmap update. Font Height is 16 -00000760509i[BIOS ] Starting rombios32 -00000761006i[BIOS ] Shutdown flag 0 -00000761687i[BIOS ] ram_size=0x02000000 -00000762165i[BIOS ] ram_end=32MB -00000802749i[BIOS ] Found 1 cpu(s) -00000821736i[BIOS ] bios_table_addr: 0x000fb928 end=0x000fcc00 -00000821839i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001149536i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001477464i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b -00001477485i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 -00001477506i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b -00001477527i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 -00001477537i[P2I ] write: ELCR2 = 0x0a -00001478422i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a -00001486380i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 -00001488942i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 -00001491343i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 -00001491573i[PIDE ] new BM-DMA address: 0xc000 -00001492277i[BIOS ] region 4: 0x0000c000 -00001494587i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 -00001494825i[ACPI ] new irq line = 11 -00001494839i[ACPI ] new irq line = 9 -00001494869i[ACPI ] new PM base address: 0xb000 -00001494883i[ACPI ] new SM base address: 0xb100 -00001494911i[PCI ] setting SMRAM control register to 0x4a -00001659005i[CPU0 ] Enter to System Management Mode -00001659005i[CPU0 ] enter_system_management_mode: temporary disable VMX while in SMM mode -00001659015i[CPU0 ] RSM: Resuming from System Management Mode -00001823035i[PCI ] setting SMRAM control register to 0x0a -00001832206i[BIOS ] MP table addr=0x000fba00 MPC table addr=0x000fb930 size=0xd0 -00001834265i[BIOS ] SMBIOS table addr=0x000fba10 -00001836653i[BIOS ] ACPI tables: RSDP addr=0x000fbb30 ACPI DATA addr=0x01ff0000 size=0x988 -00001839891i[BIOS ] Firmware waking vector 0x1ff00cc -00001851004i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) -00001851848i[BIOS ] bios_table_cur_addr: 0x000fbb54 -00014041552i[BIOS ] Booting from 0000:7c00 -00023137422i[BIOS ] int13_harddisk: function 41, unmapped device for ELDL=80 -00023142203i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=80 -00023146854i[BIOS ] *** int 15h function AX=00c0, BX=0000 not yet supported! -00037427421i[CPU0 ] [37427421] Stopped on MAGIC BREAKPOINT -00037475097i[KBD ] setting typematic info -00037475122i[KBD ] setting delay to 500 mS (unused) -00037475122i[KBD ] setting repeat rate to 10.9 cps (unused) -00037475183i[KBD ] Switched to scancode set 2 -00037475271i[KBD ] keyboard: scan convert turned off -00037475895i[KBD ] keyboard: scan convert turned off -00037491918i[FDD ] controller reset in software -00039078683i[FDD ] io_write: config control register: 0x00 -00055400059i[CPU0 ] [55400059] Stopped on MAGIC BREAKPOINT -00165600000i[ ] dbg: Quit -00165600000i[CPU0 ] CPU is in protected mode (active) -00165600000i[CPU0 ] CS.d_b = 32 bit -00165600000i[CPU0 ] SS.d_b = 32 bit -00165600000i[CPU0 ] EFER = 0x00000000 -00165600000i[CPU0 ] | RAX=00000000000000ff RBX=000000000010d78c -00165600000i[CPU0 ] | RCX=00000000000003d4 RDX=000000000010d6ca -00165600000i[CPU0 ] | RSP=000000000010d68c RBP=000000000010d6a4 -00165600000i[CPU0 ] | RSI=000000000010d6ca RDI=0000000000000002 -00165600000i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 -00165600000i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 -00165600000i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 -00165600000i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 -00165600000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df IF tf sf ZF af PF cf -00165600000i[CPU0 ] | SEG selector base limit G D -00165600000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D -00165600000i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00165600000i[CPU0 ] | MSR_FS_BASE:0000000000000000 -00165600000i[CPU0 ] | MSR_GS_BASE:0000000000000000 -00165600000i[CPU0 ] | RIP=0000000000105eb4 (0000000000105eb4) -00165600000i[CPU0 ] | CR0=0xe0000011 CR2=0x0000000000000000 -00165600000i[CPU0 ] | CR3=0x00110000 CR4=0x00000000 -00165600000i[CMOS ] Last time is 1314602560 (Mon Aug 29 10:22:40 2011) -00165600000i[XGUI ] Exit -00165600000i[CTRL ] quit_sim called with exit code 0 +00000000000i[ ] Bochs x86 Emulator 2.4.6 +00000000000i[ ] Build from CVS snapshot, on February 22, 2011 +00000000000i[ ] Compiled at Feb 22 2011, 19:57:47 +00000000000i[ ] System configuration +00000000000i[ ] processors: 1 (cores=1, HT threads=1) +00000000000i[ ] A20 line support: yes +00000000000i[ ] CPU configuration +00000000000i[ ] level: 6 +00000000000i[ ] SMP support: no +00000000000i[ ] APIC support: yes +00000000000i[ ] FPU support: yes +00000000000i[ ] MMX support: yes +00000000000i[ ] 3dnow! support: no +00000000000i[ ] SEP support: yes +00000000000i[ ] SSE support: sse2 +00000000000i[ ] XSAVE support: no +00000000000i[ ] AES support: no +00000000000i[ ] MOVBE support: no +00000000000i[ ] x86-64 support: yes +00000000000i[ ] 1G paging support: no +00000000000i[ ] VMX support: no +00000000000i[ ] Optimization configuration +00000000000i[ ] RepeatSpeedups support: yes +00000000000i[ ] Trace cache support: yes +00000000000i[ ] Fast function calls: yes +00000000000i[ ] Devices configuration +00000000000i[ ] ACPI support: yes +00000000000i[ ] NE2000 support: yes +00000000000i[ ] PCI support: yes, enabled=yes +00000000000i[ ] SB16 support: yes +00000000000i[ ] USB support: yes +00000000000i[ ] VGA extension support: vbe cirrus +00000000000i[MEM0 ] allocated memory at 028A0020. after alignment, vector=028A1000 +00000000000i[MEM0 ] 32.00MB +00000000000i[MEM0 ] mem block size = 0x00100000, blocks=32 +00000000000i[MEM0 ] rom at 0xfffe0000/131072 ('C:\Program Files\Bochs-2.4.6\BIOS-bochs-latest') +00000000000i[MEM0 ] rom at 0xc0000/40448 ('C:\Program Files\Bochs-2.4.6\VGABIOS-lgpl-latest') +00000000000i[CMOS ] Using local time for initial clock +00000000000i[CMOS ] Setting initial clock to: Thu Sep 08 15:41:40 2011 (time0=1315485700) +00000000000i[DMA ] channel 4 used by cascade +00000000000i[DMA ] channel 2 used by Floppy Drive +00000000000i[FDD ] fd0: 'a:' ro=0, h=2,t=80,spt=18 +00000000000i[PCI ] 440FX Host bridge present at device 0, function 0 +00000000000i[PCI ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 +00000000000i[MEM0 ] Register memory access handlers: 0x00000000000a0000 - 0x00000000000bffff +00000000000i[WGUI ] Desktop Window dimensions: 1366 x 768 +00000000000i[WGUI ] Number of Mouse Buttons = 5 +00000000000i[WGUI ] IME disabled +00000000000i[MEM0 ] Register memory access handlers: 0x00000000e0000000 - 0x00000000e0ffffff +00000000000i[CLVGA] VBE Bochs Display Extension Enabled +00000000000i[CLVGA] interval=50000 +00000000000i[ ] init_dev of 'unmapped' plugin device by virtual method +00000000000i[ ] init_dev of 'biosdev' plugin device by virtual method +00000000000i[ ] init_dev of 'speaker' plugin device by virtual method +00000000000i[ ] init_dev of 'extfpuirq' plugin device by virtual method +00000000000i[ ] init_dev of 'gameport' plugin device by virtual method +00000000000i[ ] init_dev of 'pci_ide' plugin device by virtual method +00000000000i[PCI ] PIIX3 PCI IDE controller present at device 1, function 1 +00000000000i[ ] init_dev of 'acpi' plugin device by virtual method +00000000000i[PCI ] ACPI Controller present at device 1, function 3 +00000000000i[ ] init_dev of 'ioapic' plugin device by virtual method +00000000000i[IOAP ] initializing I/O APIC +00000000000i[MEM0 ] Register memory access handlers: 0x00000000fec00000 - 0x00000000fec00fff +00000000000i[ ] init_dev of 'keyboard' plugin device by virtual method +00000000000i[KBD ] will paste characters every 1000 keyboard ticks +00000000000i[ ] init_dev of 'harddrv' plugin device by virtual method +00000000000i[HD ] Using boot sequence floppy, none, none +00000000000i[HD ] Floppy boot signature check is enabled +00000000000i[ ] init_dev of 'serial' plugin device by virtual method +00000000000i[SER ] com1 at 0x03f8 irq 4 +00000000000i[ ] init_dev of 'parallel' plugin device by virtual method +00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 +00000000000i[ ] register state of 'unmapped' plugin device by virtual method +00000000000i[ ] register state of 'biosdev' plugin device by virtual method +00000000000i[ ] register state of 'speaker' plugin device by virtual method +00000000000i[ ] register state of 'extfpuirq' plugin device by virtual method +00000000000i[ ] register state of 'gameport' plugin device by virtual method +00000000000i[ ] register state of 'pci_ide' plugin device by virtual method +00000000000i[ ] register state of 'acpi' plugin device by virtual method +00000000000i[ ] register state of 'ioapic' plugin device by virtual method +00000000000i[ ] register state of 'keyboard' plugin device by virtual method +00000000000i[ ] register state of 'harddrv' plugin device by virtual method +00000000000i[ ] register state of 'serial' plugin device by virtual method +00000000000i[ ] register state of 'parallel' plugin device by virtual method +00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called +00000000000i[CPU0 ] cpu hardware reset +00000000000i[APIC0] allocate APIC id=0 (MMIO enabled) to 0x00000000fee00000 +00000000000i[CPU0 ] CPUID[0x00000000]: 00000003 756e6547 6c65746e 49656e69 +00000000000i[CPU0 ] CPUID[0x00000001]: 00000f23 00000800 00002000 07cbfbff +00000000000i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000007]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000001 2a100800 +00000000000i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 +00000000000i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 +00000000000i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 +00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 +00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000008]: 00003028 00000000 00000000 00000000 +00000000000i[ ] reset of 'unmapped' plugin device by virtual method +00000000000i[ ] reset of 'biosdev' plugin device by virtual method +00000000000i[ ] reset of 'speaker' plugin device by virtual method +00000000000i[ ] reset of 'extfpuirq' plugin device by virtual method +00000000000i[ ] reset of 'gameport' plugin device by virtual method +00000000000i[ ] reset of 'pci_ide' plugin device by virtual method +00000000000i[ ] reset of 'acpi' plugin device by virtual method +00000000000i[ ] reset of 'ioapic' plugin device by virtual method +00000000000i[ ] reset of 'keyboard' plugin device by virtual method +00000000000i[ ] reset of 'harddrv' plugin device by virtual method +00000000000i[ ] reset of 'serial' plugin device by virtual method +00000000000i[ ] reset of 'parallel' plugin device by virtual method +00000003305i[BIOS ] $Revision: 1.257 $ $Date: 2011/01/26 09:52:02 $ +00000200000i[WGUI ] dimension update x=720 y=400 fontheight=16 fontwidth=9 bpp=8 +00000318042i[KBD ] reset-disable command received +00000444800i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ +00000444871i[CLVGA] VBE known Display Interface b0c0 +00000444903i[CLVGA] VBE known Display Interface b0c5 +00000447828i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ +00000760517i[BIOS ] Starting rombios32 +00000761014i[BIOS ] Shutdown flag 0 +00000761695i[BIOS ] ram_size=0x02000000 +00000762173i[BIOS ] ram_end=32MB +00000802745i[BIOS ] Found 1 cpu(s) +00000821732i[BIOS ] bios_table_addr: 0x000fb928 end=0x000fcc00 +00000821835i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001149532i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001477460i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b +00001477481i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 +00001477502i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b +00001477523i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 +00001477533i[P2I ] write: ELCR2 = 0x0a +00001478418i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a +00001486376i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 +00001488938i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 +00001491339i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 +00001491569i[PIDE ] new BM-DMA address: 0xc000 +00001492273i[BIOS ] region 4: 0x0000c000 +00001494583i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 +00001494821i[ACPI ] new irq line = 11 +00001494835i[ACPI ] new irq line = 9 +00001494865i[ACPI ] new PM base address: 0xb000 +00001494879i[ACPI ] new SM base address: 0xb100 +00001494907i[PCI ] setting SMRAM control register to 0x4a +00001659001i[CPU0 ] Enter to System Management Mode +00001659011i[CPU0 ] RSM: Resuming from System Management Mode +00001823031i[PCI ] setting SMRAM control register to 0x0a +00001832202i[BIOS ] MP table addr=0x000fba00 MPC table addr=0x000fb930 size=0xd0 +00001834261i[BIOS ] SMBIOS table addr=0x000fba10 +00001836649i[BIOS ] ACPI tables: RSDP addr=0x000fbb30 ACPI DATA addr=0x01ff0000 size=0x988 +00001839887i[BIOS ] Firmware waking vector 0x1ff00cc +00001851000i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001851844i[BIOS ] bios_table_cur_addr: 0x000fbb54 +00014041548i[BIOS ] Booting from 0000:7c00 +00023137418i[BIOS ] int13_harddisk: function 41, unmapped device for ELDL=80 +00023142199i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=80 +00023146850i[BIOS ] *** int 15h function AX=00c0, BX=0000 not yet supported! +00043965427i[KBD ] setting typematic info +00043965445i[KBD ] setting delay to 500 mS (unused) +00043965445i[KBD ] setting repeat rate to 10.9 cps (unused) +00043965488i[KBD ] Switched to scancode set 2 +00043965551i[KBD ] keyboard: scan convert turned off +01748376000p[WGUI ] >>PANIC<< POWER button turned off. +01748376000i[CPU0 ] CPU is in protected mode (active) +01748376000i[CPU0 ] CS.d_b = 32 bit +01748376000i[CPU0 ] SS.d_b = 32 bit +01748376000i[CPU0 ] EFER = 0x00000000 +01748376000i[CPU0 ] | RAX=00000000001108ff RBX=0000000000000066 +01748376000i[CPU0 ] | RCX=00000000000003d4 RDX=0000000000000308 +01748376000i[CPU0 ] | RSP=00000000001107c8 RBP=0000000000000018 +01748376000i[CPU0 ] | RSI=0000000000110806 RDI=0000000000000002 +01748376000i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 +01748376000i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 +01748376000i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 +01748376000i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 +01748376000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df IF tf sf ZF af PF cf +01748376000i[CPU0 ] | SEG selector base limit G D +01748376000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D +01748376000i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +01748376000i[CPU0 ] | MSR_FS_BASE:0000000000000000 +01748376000i[CPU0 ] | MSR_GS_BASE:0000000000000000 +01748376000i[CPU0 ] | RIP=0000000000108a0a (0000000000108a0a) +01748376000i[CPU0 ] | CR0=0xe0000011 CR2=0x0000000000000000 +01748376000i[CPU0 ] | CR3=0x0011a000 CR4=0x00000000 +01748376000i[CPU0 ] 0x0000000000108a0a>> mov al, byte ptr ds:0x10c9dd : A0DDC91000 +01748376000i[CMOS ] Last time is 1315486137 (Thu Sep 08 15:48:57 2011) +01748376000i[ ] restoring default signal behavior +01748376000i[CTRL ] quit_sim called with exit code 1 diff --git a/build/console.o b/build/console.o index 68a618de492336559cf7c97e2414b979abbbc63f..c3c8fecfbfa5d0356827f2aa914e9f1cc45fa5fd 100644 GIT binary patch delta 57 zcmX>Qb0B5|r;wtNC4;K6Q)y;Sij{(@vTCscgQ2OFiJ_H|DMN5-fr5g?W-X!b0<2Cs M`N`Rv)s&^U0nB9&ZvX%Q delta 57 zcmX>Qb0B5|r;wt7A%m*2Q)y;Sij{(@vTCscgMp=$k*Srb1w(LZfr5hBW-X!b0<3OD MiMgqp)s&^U0n3pOZU6uP diff --git a/build/drivers.o b/build/drivers.o index acdaecab7ef129a1525e42bc7074a10d49a73fa4..90974ec65055affb3e95510145b0e0356f1ddda2 100644 GIT binary patch delta 305 zcmaFCvxR4Z0;9`B#V2wc8Vn2!$6ZudI6yRu3L}tu@#p{l|IJ5a4l_)aXVh?KaLdUr zD5z9ODatHMEmFuVR!A-_DoV{O$pMOG7AGdZg6uScyOP#F9B0TvF zvjD3P3(&gB51G{&>w#k8lNDILu!Ec+#K1V&o3&x`e^xhTRtAP!Kp{pp28L%qnu(8r NK>#id_?B(WMxJTc9){evecsD$qkGm zlP59SajJrpJM$?dPQJ;wobmPKMkZw@2DZt|nA8{*CZA5syx&y^ICKoabPmW<0VDz7y%dF0t0u=KAt6c*Wi?3R;XP*CYv zROpeImy(lO!~kS^<`tJD=H$Rcpi1&GOEMF4GOJQ2pJH`a2AX#dXdIIu1H)qwEyTc} M0HT=~7%ZSP0N*-K+yDRo diff --git a/build/hal.o b/build/hal.o index 024b8e1e8616e1b2b6c66d23c67cf903caa78e8b..b86d4f9471675af1691267d6e8cd2c974f8d54c9 100644 GIT binary patch delta 171 zcmca1@PvPY0^^2_ib0I5%|~PoGfbYrm_J#bDUi#Vk%581nNNY)esUGlDn{qYs?5r) zXV@4R1Sb13D>GJ1E@V~*lj4&%Fbl9&0F`GWm_jEm_o= z?yyfzVo_uCnB2*t&botzfgxe?Ru*Me37~14C*NgR4K%%z_4wojwiVoAX~mv-#U+V3 UISiZS*##Ln6oAfPVq#zb0D7q`VE_OC delta 245 zcmaFDe?wq`0^^H~ib0I5$6Zu7GA268urwc$IXt<7F`qv*MIkr8v^Z5Er6{v3wP^A^ z#we~7Mg|53XFdhygvm}!s~A%zzhzQpRbXdeFqkaLtjsuLaw4<%cAi$#sGVR9ggI_n1(28M#kwJgf432Y1u z2PW@j5udz=WeU)SK-S}oTPJg}Z5Q_ixyCcExFj(rhaoJj7|PsynoW>V!x?B5BP#=g aHDjDbM`=x`<`1_l7gN7qig^d`E9x(NyDs_3qZKp5KdoSmQpJD>CYKF@jHJ?EU4;nl`P zBk)NDK4N_C057a7XJ_Z8_KtX;G0`O@dkfT zvE7X?zG!=Io}N#&d#FG&y1W4UYCAA-3>DvB3Cs_lsf;M|!{>h)|8l9qe;*^slLyOd z{-b8lci+M6I-U{2>+;pFsWshDF2mFB@ozQiJf z6cUL>ztL^&wYrQkvt&%;{#uqXna^GwkGcSclF2@!V<>%gzY&WbiT14Im0n3dj%8xl zy~hR+m)MfMslnDI>A{5VUrXqo^@Q%&Na)HtOkiB0L!Q$ zIi;|oy2m-;2JmAsH+!zONEUmo?&EWqRaL*;QUC^6ofbKK2&>U}g-%y($!C;6H<1?X z<}Mx<2I_HVAe0diSwyNBxxunpVD~w6oWdno9)J@_{7c|q54DJW3LnHcTh`jVn|S@J z)HKGN?3)&mpSjq!HrFbi4B9koz@JG?aIG=s*plPY$^)k+&3XYIp)LCWmWY0U&%}Cw zKS(J+Q;jacPQf0*KEYc^ISBBPi2J`2LjaGlQMnF4!RsL=k&+H@3OOt70vI6!Z#P54 zel8R7QC}xw?>CWhBfveV^7H(pn!%8mto4{X$WXO(iM% zv)$=*8g6~;Vq;vbk6j+FwVV@GZ}E9;?P~Gb^-_y!hVNGAZ~8OyGnECxoyqAbf3o6d zmJTnaO`Hv6>|}wFLLuk(jf`G8>Sxo()BRX&s{@ifNY`W~z*2xMh@7_1lQ(TIZ#%8L zZGFny#(LgXKZ-f+lz2zqw&uxgMa1=k(WVJ(P`fEk>IbBZDCtK6pAgSKy%3z3P%CAxTXUZqUhH<+~C;h)E(8O%CEpK7lm&5)^({ULK9?-6Ae_{OCE-%Jm9N)yWtpwhOP1)>xK&Jic1J-|2%^v^{m ojd6py7no(z*o#ED8+gGn&AuG+4eLF?SB_~5-$VVUA{MOCe^|2*u%_h5PO4oM%YgVv!CH5dj5i#~4+DH@(7PRJ|ZCFZd#cf)fV0);> zrI$=sq%bEBLJ#&@C`Is8YLy~_Qb9vO5n53MJwy){L|DJs-3-h;^L{@w?=1U7uj;e= z$%Dm?N2D@k9Cs|^q%)y8IhEGC*1OY2vSe=K>b3xsHRqy{v^Sydy7qHW0VrzmijnNj z?J1o~)k;T>ew@kc-~YL;OD!WtuNyKg8zCApyqLYln;dKqb871M#5x6OA4e zkqW>KPW<5}1HH((6JRaSC(xX*3t)y5>-r@m_TA^i_yT7ezT1ySp(X4m4zUl-m;M9A CZ@%9E delta 762 zcmZXSPiWI{6vtoM#HQ_<#VuOF9Hz}IqDTijv~)$QThzmJ;B<)Vq>Qi$T{qgeU1X*7 z;?E!qeme9j6V!tsLzoCEc3a%RlNZ_i1KUM#2mc)GVG!RhZ7&*l@AG@V@B6*qHz7CG z1$C~2TX=ThK36ieZY!t7EnT)|mBV)Oh88PM{prbk%K{=q#fg$;hv9G9;?gLyuiwflg*ga2?qx z03Q?uZ1F+)JKIZqEgm9f-4i=V)P|>~helUnJwR&SKAH3>q_+6P^OWcA(#t-zgGfqR zlB;Q{Wi>5{c3R?B;y7mqqum2gVNL4H|4lvE5XY}DPv85Fb4xTNzT`4=O^gU?2;dF< zDMq+EH02M|qkh?4MKK%xDEElo#{7vs$2?3wyIBZCh3z1~vBj>yeh#hm2gBJaUeSE; zRpA4M>j~Kg9Beg3B-4Lk%%kUn7)*Em(ZgtWi3fOyWO{_I1ecQo*|BT+vD1c$3j_L% ziGlHSE;l)<7qSy>ea6U6otn&>h3u$V*Y$#7Fqyt<882<%G|z5;-;8YldAyy~(~Jth zM@A9A??s}`6r&$tmJ$EFxkkOlxCh`%qdtdDJ$nHjFk;_z0g31CG2;FzV>`Zxw5u*e M8BsVvUxd#81*BBK?f?J) diff --git a/build/mem-paging.o b/build/mem-paging.o index 042d5e930c23f3f8ab17a6120608b9086b3609c4..470c39a1c29cbd1dd7765d3ca434376dd1427539 100644 GIT binary patch literal 2120 zcmah~Z)jUp6hBE{ZM5+aE3XmIIY;)v~{>?*jg>Dv!?O6guSFC?^V}P z=t69_=cAA>1M!o?56Td~^n(Kt8lsB|gP|Zp{NRLP9WwuX7US>t@~(~jvI{4_`#a~{ zbM8I&o|l!eBjce^NYn^Pn`|?Y3vErypbvYcQzFt8-@G66Tvz{Q4fBCUqp`xdmo&5w z=;xi2xJXz34VZ5bre1mZc=@*>Z`qjiW{es4pX!~S>hICgFAaqEEF)FAC4V#;2rxa+ z=n`?0MsIm&Ll(!@lg559t*#jo6WRJ3$-w*SNh3l9P-9A0GkhCD^tsvwV1N0m4)^U1 zI(gbg`C6#cGJ4(pSDt=|{)_Ftd-;o@6R*ymtoi$kVSjNX(&8%7Ri+``nZ|vbLDtt8 z-Cg5pKcm8Rj3}3cIiE2!x39UYQqA8+$9hGu+e1It->Wmhv3aJ!rf0CL7 zBaV_8?)BjNG(oNRTjWz@AIA-sOns)>n`lfoj z2gQka-IXg`wEC^{VD;B%>82mA`yKEO_xb=M)nsCH^r`sXi5I8##Rn5lBp!o*Hy2@q z&K{G{awN1Ts%aPSU{D9?^DQFL0I53wA#c?s!FwSOKse|(4S5980pWNOVnGfqXmjb~(`^|l9`ABKFa?&*1F7g_b_hHVr$9TMF z=4_4kK9b#mP7M`LafPjVP5x{sJ@NlvR`S*ivf}NcH>Z9-?M5Ye&#J%3 z_kpY4B7YW~Q7OCRuSN=}`i%BjaMfevd2lsY2fi6K$X6h$ujpST;WtABPo9}R!GlTW_ObIh{{i)_i6*y}-1#=>+z}g`AU1Te-6>F7kp| zEST1Ia2dk$F`5?aUGF~*B_P{)0I;rfEoy(;8z2l!#2#;|Y z7{MC&cFioC$Ctz>fp`DL{?u;r}mM{(Hdy literal 2172 zcma)7U1%It6h51sn%JhBP4N%1;-yZYA`YoUZ7U)%NnZ*w=!g_PiZ6?!%*MtI=X&y z$nKyEXmt}Uo9a)0HJi=GR&I0R!g%A3T6x3nThaE34_>qT!|jbWy)w;GbevOgK-|AOZhwNO4giMBtQL@lli)ukV3>f)P|tyN@K7Ht(S+MWNlW|Xv)DS3lTs{1R3&qVd3-z!c1{Fjlc?G6&z z(Jz$)%p$zVx+O(93W$dVdp{dOf^HYL>cNa!=}|KSi?ZbI}eSyhrM= zzqQE5R+dc?8LqffC9j}r?u=iVaSqB^uPkTXS`D^YFQ|AWRj;{u4<5PT2YSvesj^qD z1`Dd}R@@mcP=3YNzFYDyyV|c-R9(A)_6m*~t`t;t+GKe__09LrBa6tHf>+VLW`?NF zv>()UrbeD=UL}C;~wA-Bz5_`q!v3;J)M^IKKem>F7k-H zNF2qu|XN5|DN2KNlnOQoaE1NNXDX zntT_bac-7>3zLr$JhP7p*phuIU{jC4#=dZWrZ2p=X0Mn^0ZQ^iu@)s+llpfDMEYRt z#GG}Q4^KlhPv*1mJwArrh{hTN%F^lM(F2vGD3X{<2nZKBl&gX1k(RD zMzY@OKEL3>dMbY4@-h~^bmNzNoiAeU4f%nW*Lcuma4raN@pcWP)tQOF*Ipbm;%NrR zY}qZ9s`*K`#>{n3$Nn?sAxu!@)#wr3&58GQtT@2<)8<~Yqba<3j}y^;-UZ@wz&0GZ zWg`B4KOv&ox9P{_-X?;#LpylC6VZ@v^ohKOfz10T5r_2@?KpJjiMSv|+L5P5M4m<3 ik>^7qc%Ku&+l>9+#CV%_@V1FKz>0Nomrlf3it%rB4|s(D diff --git a/build/mem-phys.o b/build/mem-phys.o index 3d7efca1ebdae50d1ee8e9cccd2968b60df5d02a..2d1f7d7404f060b5b3fd521bea0e1e1bf3555328 100644 GIT binary patch delta 814 zcmZ8fO=uHQ5T1S6w@u=@rZu%%3lwITU+40l-KAc@wb;N_`NGYy(r)6V)90|VgM(^dmdmJCboGGyTwGO(!=jzTowaLfY-4$Boa!1m0e;EB~Son#WG5>EdU?I zj?y9O$`5Hqd}}#)wK-WENH9ke;iPvEi9bf9>mX}|?Z$J&=JKJl&?Jb&m;d8<0d%hW z?qKe8JT-O$!l`7|NShWJNev~(jcJG&iF4P64Lb;y6p7u0XvP?~NXE_>Y-U*bdK~-3 zOv7$Fk}_lQf0NIo4M(!FhmzugC)jy5HF+_8-8Afm=Z%b!&f00BY5 z#wC!5CiY+L6!FJBHT9~CwR-JPt?ovwN8A)GUWh?BnM#Gu zeE5UqBXR3TDpVOcq%V!v>Kb)~m@i=sM1`s%k_mB1r_%N|`;*v4A@W5e-S$L_&z{!Z z!m8KSyoA~&Vb$oulr_h!Ng?uc?0tS@*73^m%TX~E$+5=E+uD!Buumm=NY|p`I>4^X z<=JZ4lmo8RVmy>_rH%IsT|yb36*@N7d41hRr_`Fk`Lf` z^*kiI*pS4pVCY83hcaljb0CO6Vu6riWJ^t1u&|a=<9E4}TlakTJLlYY@4MHL(?~AH^Bc{@(9{lLWV#b7)0lYs zE+2*2v5uluapn){P>o!YG1U;AW1>FY*%gdgJwa8EoGX_H{+?8g_frD>%Axr8;6-gI7ifi!IC(b7fuMhL_<(p!Pj*(E9gdcplzv>SthO z=QQzoA?`F+hWQ9;uu Jx)iUv^9NmkRbBu9 delta 554 zcmYk2Pbh<79LImZ*Sq)K(At)4SlQaET{t;$Aepq4iz6pWa#3~V3w|z2NlGq4 zJNb7Y%MK#7tC|}{IXF1bd>@{br=I8Y`+T40d7oeJd3~XNHNx|2(TC>g9l}^nIPRN- zWB%4*=lQE#F0W7vz2^+Jjhws6Vg8afGtBRjG8-G_m?)_Z_j)5npVzEIxq+FNv>9Zt zoS02=WV(46RgCxL(Y)s;IdH|eBoD4Qha_qR#b^0`E9FTm&W=oBEy*U<54ptZlNYQZ z@!N4;k`6oW3VDbMlD2~~XJ4bI9(R9c7B5#i3J}u*yfS QRMAg#s~99I%6E154_|dx$^ZZW diff --git a/build/memory_info.o b/build/memory_info.o index 844fad999d3c1cdf98b6cc1624b862c606237e58..e5020796d861cb2f80e81319119ea444ebb57ec9 100644 GIT binary patch delta 28 gcmaFB^?++bDT{zpPJVKBF+*r^Y6_S+xs~NM0Gi(l-v9sr delta 28 gcmaFB^?++bDT{zxQDSatF+*r^Y6_S+xs~NM0Gj^_-v9sr diff --git a/build/memory_init.o b/build/memory_init.o index cd123a834e49f6926aa38c4a30b23024bb42bef8..d0fd266286b20adeccf3c1f0e23234f7664cc483 100644 GIT binary patch delta 852 zcmZ8f-)mBF6hGhlL$4)w-nk{QvE00*ftZ7e7(|)U7_p(Wf>IP&mnBm-%mw`b6Cn~A zEWXbpsE77Y4-4w01}m4Nhq0ii_7c&{2L1;v>>Rrmc;Wl~oX`EPf$?@+l> zJ534g+-gy`Z$)%PKu0y9OP$Wi~KE{@agenz0&m8B6_ePQx*1{ z_G(0Tkf;Z3D!0JDGnZJ|^z*aA7v~{>@o;#|?HixEdcu7wa3(Oy2gDd#;W^P22QMGUJ!VO_PO1LaZ!pbx{VxOP!{p0udA&$q=F z>?mK9JTlnuoP0&{uqgi^d2!!w@0#qDTX^PU{G9AzLp+T5n(Spw{tdke z3&1j$EgnnL3ZO9_u> z(tquW{{Zm+bCIBFG8_a@0|$tmsbGWrsWpE5Vs?IJ?lw#sx%tA~iF~G*NoO@4@ nQ~WT%4sjR2PZReEd%y|5$-u`cV@H&z3H*j_NO_495zzGqF+8_% delta 795 zcmZ9KPiPZS5XNUW?`=02*R-i5NC+Dfs2*CWh>DbANNFk5LJ&_;lYn~&CJ|FXDwd?? zV(3MgvrzwlAYK$NLeWD)b5UDQ(nCRSmiAEZmH55Q2BZtKznyR9y?HZl9}m|_t|tC+%i5=`L@I z9^EbNUTQyvtph&P0ZrQPZtxdv@1>}_PMe1W8=hUd>L(vmwn;c4J(+k0s3W=B+`?^H*q_&>SupAr2TpdD$S!bKFSC)d5wbV1zkuv};>9 z#1LsTuTJAVxBx1^`kknFwI2jk{Lvww5Bbjz`ENZRjng0rS_3hKh&u*V;5!8284`GR zARC^p7Rt^7U2)2Hs*AIg;=N*_RD9rY$vnxQ%}J~5lykS8YQ-t#oXRcknweS*1@xmt zXFX1PyrJmFL==w^-Bm;*i;4lFXNrSFFF>H`b^f@*<{o^)Kk0^^U3ipA_EVZqIBM7l#%6k0EpM0cAq06{lbcN9>2T!Z zXk&8Z<7sAg=2KwG=Hmeh9CqYmImW;s0F+Jus=YiplY2emugQ`;%8VJ4ZF$rg4JP;U zh)=HJ5dgD5{H;JypUHQ5)R}lWC$sUYu_|yfFceHSF-2p70^^;HipA_a!Od?Zx1+W&;idW?cma z1_l!*28IN728Ki+o57KfqnXK>Pk||#kHe9VYDG@Sqd diff --git a/change.log b/change.log index 38afb4a..2478d61 100644 --- a/change.log +++ b/change.log @@ -1,3 +1,16 @@ +[????] BUILD 0.1.1.??? DATE 9/0?/2011 AT ?:?? ?? +==================================================== +Mainly changed: Tasking ++ Implemented multitasking + +[GOOD] BUILD 0.1.0.601 DATE 9/06/2011 AT 5:20 PM +==================================================== +Mainly changed: bugfixes ++ Added feature: shell automatic completion ++ Fixed 'pink text' bug ++ Fixed 'dir' bug where it tries to read files as directories +? TODO: Fix Vfs bug which allows files to be read as directories + [GOOD] BUILD 0.1.0.590 DATE 9/05/2011 AT 2:40 PM ==================================================== Mainly changed: FS.Initrd diff --git a/kernel.bin b/kernel.bin index 6d578740e586e1f911d96c95ef08a4cac216e07f..2186404102eb5c15b5306e20d0b7d1829a6b5193 100644 GIT binary patch delta 19429 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 delta 19703 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 vH!4_ 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 delta 53501 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 I#ruc-4|eHD9smFU diff --git a/scripts/version.txt b/scripts/version.txt index 75a2e0d..f075110 100644 --- a/scripts/version.txt +++ b/scripts/version.txt @@ -1 +1 @@ -601 +629