From 3dd1f86eac9ef716a33de34560eb7e35a5736d1d Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Tue, 18 Feb 2014 23:01:02 +0000 Subject: [PATCH] Some reorganization of code: 1) Grouping of code working with IDE drives 2) Moving messages about the SVN revision and CPU counter to the beginning of the log of the message board. git-svn-id: svn://kolibrios.org@4575 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/kernel.asm | 310 ++++++++++++++++++++-------------------- 1 file changed, 157 insertions(+), 153 deletions(-) diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 5d93f1a8b4..311f92df6d 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -776,7 +776,29 @@ no_mode_0x12: call unmask_timer stdcall enable_irq, 2 ; @#$%! PIC stdcall enable_irq, 13 ; co-processor - +;----------------------------------------------------------------------------- +; show SVN version of kernel on the message board +;----------------------------------------------------------------------------- + mov eax, [version_inf.rev] + DEBUGF 1, "K : kernel SVN r%d\n", eax +;----------------------------------------------------------------------------- +; show CPU count on the message board +;----------------------------------------------------------------------------- + mov eax, [cpu_count] + test eax, eax + jnz @F + mov al, 1 ; at least one CPU +@@: + DEBUGF 1, "K : %d CPU detected\n", eax +;----------------------------------------------------------------------------- +; detect Floppy drives +;----------------------------------------------------------------------------- + mov esi, boot_detectfloppy + call boot_log +include 'detect/dev_fd.inc' +;----------------------------------------------------------------------------- +; START of initialisation IDE ATA code +;----------------------------------------------------------------------------- cmp [IDEContrProgrammingInterface], 0 je @f @@ -796,14 +818,15 @@ no_mode_0x12: add dx, 2 ;0x376 out dx, al @@: +; show base variables of IDE controller + DEBUGF 1, "K : BAR0 %x \n", [IDE_BAR0_val]:4 + DEBUGF 1, "K : BAR1 %x \n", [IDE_BAR1_val]:4 + DEBUGF 1, "K : BAR2 %x \n", [IDE_BAR2_val]:4 + DEBUGF 1, "K : BAR3 %x \n", [IDE_BAR3_val]:4 + DEBUGF 1, "K : BAR4 %x \n", [IDEContrRegsBaseAddr]:4 + DEBUGF 1, "K : IDEContrProgrammingInterface %x \n", [IDEContrProgrammingInterface]:4 + DEBUGF 1, "K : IDE_Interrupt %x \n", [IDE_Interrupt]:4 ;----------------------------------------------------------------------------- -;!!!!!!!!!!!!!!!!!!!!!!!!!! -; mov esi, boot_detectdisks -; call boot_log -;include 'detect/disks.inc' - mov esi, boot_detectfloppy - call boot_log -include 'detect/dev_fd.inc' mov esi, boot_detecthdcd call boot_log include 'detect/dev_hdcd.inc' @@ -813,8 +836,132 @@ include 'detect/getcache.inc' mov esi, boot_detectpart call boot_log include 'detect/sear_par.inc' -;!!!!!!!!!!!!!!!!!!!!!!!!!! +;----------------------------------------------------------------------------- + mov dx, [IDEContrRegsBaseAddr] +; test whether it is our interrupt? + add dx, 2 + in al, dx + test al, 100b + jz @f +; clear Bus Master IDE Status register +; clear Interrupt bit + out dx, al +@@: + add dx, 8 +; test whether it is our interrupt? + in al, dx + test al, 100b + jz @f +; clear Bus Master IDE Status register +; clear Interrupt bit + out dx, al +@@: +; read status register and remove the interrupt request + mov dx, [IDE_BAR0_val] ;0x1F0 + add dx, 0x7 ;0x1F7 + in al, dx + mov dx, [IDE_BAR2_val] ;0x170 + add dx, 0x7 ;0x177 + in al, dx +;----------------------------------------------------------------------------- + push eax edx + mov dx, [IDEContrRegsBaseAddr] + xor eax, eax + add dx, 2 + in al, dx + DEBUGF 1, "K : Primary Bus Master IDE Status Register %x\n", eax + add dx, 8 + in al, dx + DEBUGF 1, "K : Secondary Bus Master IDE Status Register %x\n", eax + pop edx eax + + cmp [IDEContrRegsBaseAddr], 0 + setnz [dma_hdd] + + cmp [IDEContrProgrammingInterface], 0 + je set_interrupts_for_IDE_controllers.continue +;----------------------------------------------------------------------------- +; set interrupts for IDE Controller +;----------------------------------------------------------------------------- + mov esi, boot_set_int_IDE + call boot_log +set_interrupts_for_IDE_controllers: + mov ax, [IDEContrProgrammingInterface] + cmp ax, 0x0180 + je .pata_ide + + cmp ax, 0x018a + jne .sata_ide +;-------------------------------------- +.pata_ide: + cmp [IDEContrRegsBaseAddr], 0 + je .end_set_interrupts + + stdcall attach_int_handler, 14, IDE_irq_14_handler, 0 + DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax + stdcall attach_int_handler, 15, IDE_irq_15_handler, 0 + DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax + jmp .enable_IDE_interrupt +;-------------------------------------- +.sata_ide: + cmp ax, 0x0185 + je .sata_ide_1 + + cmp ax, 0x018f + jne .end_set_interrupts +;-------------------------------------- +.sata_ide_1: + cmp [IDEContrRegsBaseAddr], 0 + je .end_set_interrupts + + mov ax, [IDE_Interrupt] + movzx eax, al + stdcall attach_int_handler, eax, IDE_common_irq_handler, 0 + DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [IDE_Interrupt]:1, eax +;-------------------------------------- +.enable_IDE_interrupt: + mov esi, boot_enabling_ide + call boot_log +; Enable interrupts in IDE controller for DMA + mov al, 0 + mov ah, [DRIVE_DATA+1] + test ah, 10100000b + jz @f + + DEBUGF 1, "K : IDE CH1 PIO, because ATAPI drive present\n" + jmp .ch2_check +@@: + mov dx, [IDE_BAR1_val] ;0x3F4 + add dx, 2 ;0x3F6 + out dx, al + DEBUGF 1, "K : IDE CH1 DMA enabled\n" +.ch2_check: + test ah, 1010b + jz @f + + DEBUGF 1, "K : IDE CH2 PIO, because ATAPI drive present\n" + jmp .end_set_interrupts +@@: + mov dx, [IDE_BAR3_val] ;0x374 + add dx, 2 ;0x376 + out dx, al + DEBUGF 1, "K : IDE CH2 DMA enabled\n" +;-------------------------------------- +.end_set_interrupts: +;----------------------------------------------------------------------------- + cmp [dma_hdd], 0 + je .print_pio +.print_dma: + DEBUGF 1, "K : IDE DMA mode\n" + jmp .continue + +.print_pio: + DEBUGF 1, "K : IDE PIO mode\n" +.continue: +;----------------------------------------------------------------------------- +; END of initialisation IDE ATA code +;----------------------------------------------------------------------------- mov esi, boot_init_sys call boot_log call Parser_params @@ -827,7 +974,6 @@ if ~ defined extended_primary_loader include 'boot/rdload.inc' ;!!!!!!!!!!!!!!!!!!!!!!! end if -; mov [dma_hdd],1 if 0 mov ax, [OS_BASE+0x10000+bx_from_load] @@ -881,34 +1027,7 @@ end if mov [pci_access_enabled], 1 call pci_enum -;----------------------------------------------------------------------------- - mov dx, [IDEContrRegsBaseAddr] -; test whether it is our interrupt? - add dx, 2 - in al, dx - test al, 100b - jz @f -; clear Bus Master IDE Status register -; clear Interrupt bit - out dx, al -@@: - add dx, 8 -; test whether it is our interrupt? - in al, dx - test al, 100b - jz @f -; clear Bus Master IDE Status register -; clear Interrupt bit - out dx, al -@@: -; read status register and remove the interrupt request - mov dx, [IDE_BAR0_val] ;0x1F0 - add dx, 0x7 ;0x1F7 - in al, dx - mov dx, [IDE_BAR2_val] ;0x170 - add dx, 0x7 ;0x177 - in al, dx -;----------------------------------------------------------------------------- + include "detect/vortex86.inc" ; Vortex86 SoC detection code stdcall load_driver, szVidintel @@ -1126,25 +1245,6 @@ if defined debug_com_base out dx, al end if - - mov eax, [version_inf.rev] - DEBUGF 1, "K : kernel SVN r%d\n", eax - - mov eax, [cpu_count] - test eax, eax - jnz @F - mov al, 1 ; at least one CPU -@@: - DEBUGF 1, "K : %d CPU detected\n", eax - - DEBUGF 1, "K : BAR0 %x \n", [IDE_BAR0_val]:4 - DEBUGF 1, "K : BAR1 %x \n", [IDE_BAR1_val]:4 - DEBUGF 1, "K : BAR2 %x \n", [IDE_BAR2_val]:4 - DEBUGF 1, "K : BAR3 %x \n", [IDE_BAR3_val]:4 - DEBUGF 1, "K : BAR4 %x \n", [IDEContrRegsBaseAddr]:4 - DEBUGF 1, "K : IDEContrProgrammingInterface %x \n", [IDEContrProgrammingInterface]:4 - DEBUGF 1, "K : IDE_Interrupt %x \n", [IDE_Interrupt]:4 - ; START MULTITASKING ; A 'All set - press ESC to start' messages if need @@ -1157,102 +1257,6 @@ if preboot_blogesc jne .bll1 end if - push eax edx - mov dx, [IDEContrRegsBaseAddr] - xor eax, eax - add dx, 2 - in al, dx - DEBUGF 1, "K : Primary Bus Master IDE Status Register %x\n", eax - - add dx, 8 - in al, dx - DEBUGF 1, "K : Secondary Bus Master IDE Status Register %x\n", eax - pop edx eax - - cmp [IDEContrRegsBaseAddr], 0 - setnz [dma_hdd] - - cmp [IDEContrProgrammingInterface], 0 - je set_interrupts_for_IDE_controllers.continue -;----------------------------------------------------------------------------- -; set interrupts for IDE Controller -;----------------------------------------------------------------------------- - mov esi, boot_set_int_IDE - call boot_log -set_interrupts_for_IDE_controllers: - mov ax, [IDEContrProgrammingInterface] - cmp ax, 0x0180 - je .pata_ide - - cmp ax, 0x018a - jne .sata_ide -;-------------------------------------- -.pata_ide: - cmp [IDEContrRegsBaseAddr], 0 - je .end_set_interrupts - - stdcall attach_int_handler, 14, IDE_irq_14_handler, 0 - DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax - stdcall attach_int_handler, 15, IDE_irq_15_handler, 0 - DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax - jmp .enable_IDE_interrupt -;-------------------------------------- -.sata_ide: - cmp ax, 0x0185 - je .sata_ide_1 - - cmp ax, 0x018f - jne .end_set_interrupts -;-------------------------------------- -.sata_ide_1: - cmp [IDEContrRegsBaseAddr], 0 - je .end_set_interrupts - - mov ax, [IDE_Interrupt] - movzx eax, al - stdcall attach_int_handler, eax, IDE_common_irq_handler, 0 - DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [IDE_Interrupt]:1, eax -;-------------------------------------- -.enable_IDE_interrupt: - mov esi, boot_enabling_ide - call boot_log -; Enable interrupts in IDE controller for DMA - mov al, 0 - mov ah, [DRIVE_DATA+1] - test ah, 10100000b - jz @f - - DEBUGF 1, "K : IDE CH1 PIO, because ATAPI drive present\n" - jmp .ch2_check -@@: - mov dx, [IDE_BAR1_val] ;0x3F4 - add dx, 2 ;0x3F6 - out dx, al - DEBUGF 1, "K : IDE CH1 DMA enabled\n" -.ch2_check: - test ah, 1010b - jz @f - - DEBUGF 1, "K : IDE CH2 PIO, because ATAPI drive present\n" - jmp .end_set_interrupts -@@: - mov dx, [IDE_BAR3_val] ;0x374 - add dx, 2 ;0x376 - out dx, al - DEBUGF 1, "K : IDE CH2 DMA enabled\n" -;-------------------------------------- -.end_set_interrupts: -;----------------------------------------------------------------------------- - cmp [dma_hdd], 0 - je .print_pio -.print_dma: - DEBUGF 1, "K : IDE DMA mode\n" - jmp .continue - -.print_pio: - DEBUGF 1, "K : IDE PIO mode\n" -.continue: - mov [timer_ticks_enable], 1 ; for cd driver sti