diff --git a/kernel/kernel.asm b/kernel/kernel.asm index f9d4ce4..b9bce71 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -39,9 +39,9 @@ kmain: mov [0xC00B8008], dword 0x03640469 mov [0xC00B800C], dword 0x0153024F - mov esi, szMsgKernelAlive + mov eax, szMsgKernelAlive call klog - mov esi, szMsgBuildDate + mov eax, szMsgBuildDate call klog call mm_bootstrap @@ -118,7 +118,7 @@ kmain: call klog jmp .halt - include 'klog.inc' + include 'klog.new.inc' include 'dev/console.inc' include 'dev/dev.inc' include 'mm/bootstrap.inc' diff --git a/kernel/klog.new.inc b/kernel/klog.new.inc new file mode 100644 index 0000000..e76ea7e --- /dev/null +++ b/kernel/klog.new.inc @@ -0,0 +1,292 @@ + ;; File: klog.inc + ;; Kernel logging utilities + ;; + +COM1 = 0x3F8 + + ;; Function: _klog_print + ;; + ;; In: EAX - Null-terminated string to print +_klog_print_str: + push ebp + mov ebp, esp + + push esi + mov dx, COM1 + mov esi, eax +@@: + lodsb + or al, al + jz @f + out dx, al + + pusha + call cga_putc + popa + + jmp @b +@@: + pop esi + leave + ret + + ;; Function: _klog_print_int + ;; + ;; In: + ;; EAX - number +_klog_print_int: + test eax, eax + js .print_minus +.print_minus: + ret + + ;; Function: _klog_print_unsigned + ;; + ;; In: + ;; EAX - number +_klog_print_unsigned: + push ebx + mov ebx, 10 + xor ecx, ecx +@@: + xor edx, edx + div ebx + push edx + inc ecx + or eax, eax + jnz @b + +@@: + pop eax + add al, 0 + mov dx, COM1 + out dx, al + pusha + call cga_putc + popa + + dec ecx + or cl, cl + jnz @b + + pop ebx + + ret + + ;; Function: _klog_print_hex + ;; + ;; In: + ;; EAX - number +_klog_print_hex: + push ebp + mov ebp, esp + + push edi + mov edi, eax + + mov eax, szHexPrefix + call _klog_print_str + + or edi, edi + jz .print_zero + + xor cl, cl +.begin: + cmp cl, 8 + je .print_number + rol edi, 4 + mov eax, edi + and eax, 0xF + mov al, byte [sDigit + eax] + mov [szKlogBuffer + ecx], al + inc cl + jmp .begin + +.print_zero: + mov al, '0' + mov dx, COM1 + out dx, al + pusha + call cga_putc + popa + jmp .end + +.print_number: + mov [szKlogBuffer + ecx], byte 0 + mov eax, szKlogBuffer + call _klog_print_str + +.end: + pop edi + leave + ret + + ;; Function: _klog_print_time + ;; +_klog_print_time: + ; wait CMOS ready +@@: + mov al, 0x0A + out CMOS_COMMAND, al + in al, CMOS_DATA + and al, 0x80 + jnz @b + + mov al, CMOS_REG_HOUR + out CMOS_COMMAND, al + in al, CMOS_DATA + + mov ah, al + shr ah, 4 + and ah, 0xF + and al, 0xF + + add ah, 0x30 + add al, 0x30 + mov [szTime + 1], ah + mov [szTime + 2], al + + mov al, CMOS_REG_MINUTE + out CMOS_COMMAND, al + in al, CMOS_DATA + + mov ah, al + shr ah, 4 + and ah, 0xF + and al, 0xF + + add ah, 0x30 + add al, 0x30 + mov [szTime + 4], ah + mov [szTime + 5], al + + mov al, CMOS_REG_SECOND + out CMOS_COMMAND, al + in al, CMOS_DATA + + mov ah, al + shr ah, 4 + and ah, 0xF + and al, 0xF + + add ah, 0x30 + add al, 0x30 + mov [szTime + 7], ah + mov [szTime + 8], al + + mov eax, szTime + call _klog_print_str + + ret + + ;; Function: klog + ;; + ;; Output kernel log + ;; + ;; In: + ;; EAX - null-terminated string + ;; STACK[X] - var_arg +klog: + push ebp + mov ebp, esp + + push esi + mov esi, eax + + ; display log time + call _klog_print_time + + mov ecx, 4 +.begin: + mov al, [esi] + or al, al + jz .end + ; search for formating + cmp al, '%' + jne .putchar + ; read next char + inc esi + mov al, [esi] + + ; check if another '%' + cmp al, '%' + je .putchar + + ; check if string format + cmp al, 's' + jne @f + ; print string + mov eax, [ebp + ecx] + push ecx + call _klog_print_str + pop ecx + add ecx, 4 + + jmp .next + + ; check if hex format +@@: + cmp al, 'x' + jne @f + + mov eax, [ebp + ecx] + push ecx + call _klog_print_hex + pop ecx + add ecx, 4 + + jmp .next + + ; check if int format +@@: + cmp al, 'd' + jne @f + + mov eax, [ebp + ecx] + push ecx + call _klog_print_int + pop ecx + add ecx, 4 + + jmp .next + + ; check if unsigned +@@: + cmp al, 'u' + jne @f + + mov eax, [ebp + ecx] + push ecx + call _klog_print_unsigned + pop ecx + add ecx, 4 + + jmp .next + + ; unknown format +@@: + mov al, '?' + +.putchar: ; XXX: fix this mess + mov dx, COM1 + out dx, al + pusha + call cga_putc + popa + +.next: + inc esi + jmp .begin + +.end: + mov eax, szCRLF + call _klog_print_str + + leave + ret + +szTime db '[00:00:00] ', 0 +szCRLF db CR, LF, 0 +sDigit db '0123456789ABCDEF' +szHexPrefix db '0x', 0 +szKlogBuffer db '00000000', 0 diff --git a/kernel/mm/bootstrap.inc b/kernel/mm/bootstrap.inc index 6584257..5966a65 100644 --- a/kernel/mm/bootstrap.inc +++ b/kernel/mm/bootstrap.inc @@ -5,7 +5,7 @@ ;; Setup recursive paging. ;; map page dir at 0xFFFFF000 mm_bootstrap: - mov esi, szMsgMmBootstrap + mov eax, szMsgMmBootstrap call klog ; 0x400000 ; PDE entry: 0x7ffc00 phys addr and curr virt addr: 0xc07ffc00