From 9076a15f08374ab8f7e6f946fd89014e2b087101 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 1 Sep 2003 22:01:00 -0400 Subject: [PATCH] Import backup from 2003-09-01_2 --- defines.h | 7 +++ io.asm | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++---- io.h | 3 +- kernel.c | 15 ++++- mm.c | 87 +++++++++++++++++++++++---- mm.h | 14 +++-- 6 files changed, 271 insertions(+), 28 deletions(-) create mode 100644 defines.h diff --git a/defines.h b/defines.h new file mode 100644 index 0000000..b69b9f5 --- /dev/null +++ b/defines.h @@ -0,0 +1,7 @@ + +typedef unsigned int dword; +typedef unsigned short word; +typedef unsigned char byte; + + + diff --git a/io.asm b/io.asm index d96abde..c229997 100644 --- a/io.asm +++ b/io.asm @@ -14,6 +14,7 @@ [global _console_cls] [global _putHex] [global _putDec] +[global _putDecu] ; @@ -173,9 +174,9 @@ _printf: push ebp mov ebp, esp pusha - mov ebx, [ebp+8] ;ebx = ptr in format string + mov ebx, [ebp+8] ;ebx = in format string mov esi, ebp - add esi, 12 ;esi = ptr to next variable arg + add esi, 12 ;esi = to next variable arg xor ecx, ecx ;ecx used if we encounter a '%' printf_loop: mov al, [ebx] @@ -196,6 +197,8 @@ printf_special: xor ecx, ecx cmp al, 'd' jz printf_decimal + cmp al, 'u' + jz printf_decimalu cmp al, 'x' jz printf_hex cmp al, '%' @@ -211,6 +214,13 @@ printf_decimal: add esp, 4 jmp printf_special_done +printf_decimalu: + mov eax, [esi] + push eax + call _putDecu + add esp, 4 + jmp printf_special_done + printf_hex: mov eax, [esi] push eax @@ -330,14 +340,6 @@ putHex_loop_end: ret -; -;int putDec(dword number) -; -_putDec: - - ret - - ; ;int puts(char *str) ; @@ -346,7 +348,7 @@ _puts: mov ebp, esp push esi push eax - mov esi, [ebp+8] ;esi = ptr to string + mov esi, [ebp+8] ;esi = to string puts_loop: lodsb cmp al, 0 @@ -367,3 +369,152 @@ puts_done: +_putDecu: + push ebp + mov ebp, esp + sub esp, 24 + mov DWORD [ebp-4], 1 + mov BYTE [ebp-5], 0 +L2: + mov edx, DWORD [ebp+8] + mov eax, -858993459 + mul edx + mov eax, edx + shr eax, 3 + cmp eax, DWORD [ebp-4] + jae L4 + jmp L3 +L4: + mov eax, DWORD [ebp-4] + mov edx, eax + sal edx, 2 + add edx, eax + lea eax, [edx+edx] + mov DWORD [ebp-4], eax + jmp L2 +L3: + nop +L5: + cmp DWORD [ebp-4], 1 + ja L7 + jmp L6 +L7: + mov edx, DWORD [ebp+8] + mov eax, edx + mov edx, 0 + div DWORD [ebp-4] + mov DWORD [ebp-12], eax + mov al, BYTE [ebp-12] + mov BYTE [ebp-5], al + mov eax, 0 + mov al, BYTE [ebp-5] + imul eax, DWORD [ebp-4] + sub DWORD [ebp+8], eax + mov edx, DWORD [ebp-4] + mov eax, -858993459 + mul edx + mov eax, edx + shr eax, 3 + mov DWORD [ebp-4], eax + lea eax, [ebp-5] + add BYTE [eax], 48 + sub esp, 12 + mov eax, 0 + mov al, BYTE [ebp-5] + push eax + call _putc + add esp, 16 + jmp L5 +L6: + sub esp, 12 + mov al, BYTE [ebp+8] + add eax, 48 + and eax, 255 + push eax + call _putc + add esp, 16 + leave + ret + + + + +_putDec: + push ebp + mov ebp, esp + sub esp, 24 + cmp DWORD [ebp+8], 0 + jns L9 + sub esp, 12 + push 45 + call _putc + add esp, 16 + neg DWORD [ebp+8] +L9: + mov DWORD [ebp-4], 1 + mov BYTE [ebp-5], 0 +L10: + mov eax, DWORD [ebp+8] + cmp eax, DWORD [ebp-4] + jae L12 + jmp L11 +L12: + mov eax, DWORD [ebp-4] + mov edx, eax + sal edx, 2 + add edx, eax + lea eax, [edx+edx] + mov DWORD [ebp-4], eax + jmp L10 +L11: + mov edx, DWORD [ebp-4] + mov eax, -858993459 + mul edx + mov eax, edx + shr eax, 3 + mov DWORD [ebp-4], eax +L13: + cmp DWORD [ebp-4], 1 + ja L15 + jmp L14 +L15: + mov edx, DWORD [ebp+8] + mov eax, edx + mov edx, 0 + div DWORD [ebp-4] + mov DWORD [ebp-12], eax + mov al, BYTE [ebp-12] + mov BYTE [ebp-5], al + mov eax, 0 + mov al, BYTE [ebp-5] + imul eax, DWORD [ebp-4] + sub DWORD [ebp+8], eax + mov edx, DWORD [ebp-4] + mov eax, -858993459 + mul edx + mov eax, edx + shr eax, 3 + mov DWORD [ebp-4], eax + lea eax, [ebp-5] + add BYTE [eax], 48 + sub esp, 12 + mov eax, 0 + mov al, BYTE [ebp-5] + push eax + call _putc + add esp, 16 + jmp L13 +L14: + sub esp, 12 + mov al, BYTE [ebp+8] + add eax, 48 + and eax, 255 + push eax + call _putc + add esp, 16 + leave + ret + + + + diff --git a/io.h b/io.h index 581bb73..9a433d3 100644 --- a/io.h +++ b/io.h @@ -8,7 +8,8 @@ word getCursorPosition(); int putc(byte chr); int printf(char *fmt, ...); int puts(char *str); -int putDec(dword number); +int putDec(int number); +int putDecu(dword number); int putHex(dword number); void console_cls(); void console_scroll(); diff --git a/kernel.c b/kernel.c index cf59244..11b58f7 100644 --- a/kernel.c +++ b/kernel.c @@ -29,8 +29,21 @@ void k_init() outportb(0x40, 0x2e); //msb enable_ints(); video_init((ModeInfoBlock *) 0x90306); - console_cls(); mm_init(); + console_cls(); + printf("Memory available to OS: %d MB", mm_totalmem/0x100000); + pageblock *pb = first_pageblock; + for (;;) + { + if (pb->flags == MM_PB_NP) + break; + printf("\nBase: 0x%x; Limit: 0x%x; Flags: 0x%x, Link: 0x%x", pb->base, pb->length, pb->flags, pb->link); + pb = (pageblock *) pb->link; + } + int a; + for (a = -1024; a < 778; a += 98) + printf("\n%u\t%d\t%x", a, a, a); + //printf("\n%d\t%d", -123, -23456); } void isr(dword num) diff --git a/mm.c b/mm.c index 9aad6e6..b9a276f 100644 --- a/mm.c +++ b/mm.c @@ -5,9 +5,9 @@ pageblock *first_pageblock = (pageblock *) 0; -dword totalmem = 0; +dword mm_totalmem = 0x100000; //assume 1mb -void mm_init() +void mm_init() { dword *memmap_entries = (dword *) 0x9040A; memmap_entry *maps = (memmap_entry *) 0x92000; @@ -16,25 +16,90 @@ void mm_init() { if (maps[a].attributes == 1) // (1) mem free to OS { - if ((maps[a].base.lowdword + maps[a].limit.lowdword) > (FREERAM_START+4096)) //goes past where we start freeram + mm_totalmem += maps[a].limit.lowdword; + if ((maps[a].base.lowdword + maps[a].limit.lowdword) > (FREERAM_START+8192)) //goes past where we start freeram { - if (first_pageblock == 0) //no pageblock page set up yet + if (maps[a].base.lowdword < FREERAM_START) { - if (maps[a].base.lowdword < (FREERAM_START+4096)) - { - first_pageblock = (pageblock *) FREERAM_START; - } + maps[a].limit.lowdword = maps[a].limit.lowdword - (FREERAM_START - maps[a].base.lowdword); + maps[a].base.lowdword = FREERAM_START; //block at least 4kb, starts >= FREERAM_START } - else + if (first_pageblock == 0) //no pageblock page set up yet, so set it up here { + first_pageblock = (pageblock *) maps[a].base.lowdword; + maps[a].base.lowdword += 4096; + maps[a].limit.lowdword -= 4096; + mm_init_pageblockpage(first_pageblock); + first_pageblock->base = maps[a].base.lowdword; + first_pageblock->length = maps[a].limit.lowdword / 4096; + first_pageblock->flags = MM_PB_AVAIL; + } + else //first_pageblock already set up, add on segment + { + pageblock *pb = first_pageblock; + for (;;) + { + if (pb->flags == MM_PB_NP) + break; + else + pb++; + } + pb->base = maps[a].base.lowdword; + pb->length = maps[a].limit.lowdword / 4096; + pb->flags = MM_PB_AVAIL; } } - totalmem += maps[a].limit.lowdword; } } - printf("Total memory available to OS: %x", totalmem); + if (first_pageblock == 0) + { + printf("ERROR! NO INITIAL PAGE BLOCK COULD BE CREATED."); + asm("cli"); + asm("hlt"); + } } +void mm_init_pageblockpage(pageblock *pbp) +{ + pageblock *pb = pbp; + int a; + for (a=0; a<512; a++) + { + pb->base = 0; + pb->length = 0; + pb->flags = MM_PB_NP; + if (a<511) + pb->link = (dword)++pb + sizeof(pageblock); + else + pb->link = 0; + } +} + + +void *mm_palloc(dword numpages) +{ + + +} + + +int mm_pfree(void *ptr) +{ + + + +} + + + + + + + + + + + diff --git a/mm.h b/mm.h index 874ce93..e52f12b 100644 --- a/mm.h +++ b/mm.h @@ -1,9 +1,5 @@ -void mm_init(); - - - typedef struct { qword base; qword limit; @@ -19,6 +15,16 @@ typedef struct { } __attribute__ ((packed)) pageblock; //16 byte pageblock entry - 512 entries = 1 page +void mm_init(); +void mm_init_pageblockpage(pageblock *pbp); +void *mm_palloc(dword numpages); +int mm_pfree(void *ptr); + + +#define MM_PB_FLAGMASK 0x03 //00000011 +#define MM_PB_NP 0x00 //00000000 +#define MM_PB_AVAIL 0x01 //00000001 +#define MM_PB_USED 0x02 //00000010