Subversion Repositories Kolibri OS

Rev

Rev 8052 | Rev 8217 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8052 Rev 8111
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 8052 $
8
$Revision: 8111 $
9
 
9
 
10
align 4
10
align 4
11
proc mem_test
11
proc mem_test
Line 408... Line 408...
408
.end_cpuid:
408
.end_cpuid:
409
        mov     eax, [cpu_type]
409
        mov     eax, [cpu_type]
410
        ret
410
        ret
411
endp
411
endp
Line 412... Line -...
412
 
-
 
413
iglobal
-
 
414
align 4
-
 
415
acpi_lapic_base   dd 0xfee00000   ; default local apic base
-
 
416
endg
-
 
417
 
-
 
418
uglobal
-
 
419
align 4
-
 
420
acpi_rsdp         rd 1
-
 
421
acpi_rsdt         rd 1
-
 
422
acpi_madt         rd 1
-
 
423
 
-
 
424
acpi_dev_data     rd 1
-
 
425
acpi_dev_size     rd 1
-
 
426
 
-
 
427
acpi_rsdt_base    rd 1
-
 
428
acpi_fadt_base    rd 1
-
 
429
acpi_dsdt_base    rd 1
-
 
430
acpi_dsdt_size    rd 1
-
 
431
acpi_madt_base    rd 1
-
 
432
acpi_ioapic_base  rd MAX_IOAPICS
-
 
433
acpi_hpet_base    rd 1
-
 
434
hpet_base         rd 1
-
 
435
hpet_period       rd 1
-
 
436
hpet_timers       rd 1
-
 
437
hpet_tsc_start    rd 2
-
 
438
cpu_count         rd 1
-
 
439
smpt              rd 16
-
 
440
endg
-
 
441
 
412
 
442
ACPI_HI_RSDP_WINDOW_START  = 0x000E0000
413
ACPI_HI_RSDP_WINDOW_START  = 0x000E0000
443
ACPI_HI_RSDP_WINDOW_END    = 0x00100000
414
ACPI_HI_RSDP_WINDOW_END    = 0x00100000
Line 444... Line 415...
444
ACPI_RSDP_CHECKSUM_LENGTH  = 20
415
ACPI_RSDP_CHECKSUM_LENGTH  = 20
-
 
416
 
-
 
417
proc acpi_locate_tables uses ebx esi edi
445
 
418
        mov     ebx, [ebx+ACPI_RSDP.RsdtAddress]
446
ACPI_HPET_SIGN             = 'HPET'
419
        mov     [acpi_rsdt_base-OS_BASE], ebx
447
ACPI_MADT_SIGN             = 'APIC'
420
        mov     eax, [ebx+ACPI_RSDT.Length]
-
 
421
        mov     [acpi_rsdt_size-OS_BASE], eax
-
 
422
 
-
 
423
        mov     esi, [acpi_rsdt_base-OS_BASE]
-
 
424
        mov     ecx, [esi+ACPI_RSDT.Length]
-
 
425
        lea     edi, [esi+ecx]
-
 
426
        add     esi, sizeof.ACPI_TABLE
-
 
427
        movi    ecx, 1
-
 
428
.next_table:
-
 
429
        cmp     esi, edi
-
 
430
        jae     .done
-
 
431
        lodsd
-
 
432
        cmp     [eax+ACPI_TABLE.Signature], 'SSDT'      ; skip DSDT if present
-
 
433
        jz      .ssdt                                   ; read it from FADT
-
 
434
        cmp     [eax+ACPI_TABLE.Signature], 'FACP'      ; this is FADT
-
 
435
        jz      .fadt
-
 
436
        cmp     [eax+ACPI_TABLE.Signature], 'APIC'      ; this is MADT
-
 
437
        jz      .madt
-
 
438
        cmp     [eax+ACPI_TABLE.Signature], 'HPET'
-
 
439
        jz      .hpet
-
 
440
        jmp     .next_table
-
 
441
.ssdt:
-
 
442
        mov     [acpi_ssdt_base+ecx*4-OS_BASE], eax
-
 
443
        mov     eax, [eax+ACPI_TABLE.Length]
-
 
444
        mov     [acpi_ssdt_size+ecx*4-OS_BASE], eax
-
 
445
        inc     ecx
-
 
446
        jmp     .next_table
-
 
447
.fadt:
-
 
448
        mov     [acpi_fadt_base-OS_BASE], eax
-
 
449
        cmp     [eax+ACPI_FADT.DSDT], 0
-
 
450
        jz      @f
-
 
451
        mov     edx, [eax+ACPI_FADT.DSDT]
-
 
452
        mov     [acpi_ssdt_base-OS_BASE], edx
-
 
453
        mov     edx, [edx+ACPI_TABLE.Length]
-
 
454
        mov     [acpi_ssdt_size-OS_BASE], edx
-
 
455
@@:
-
 
456
        mov     eax, [eax+ACPI_TABLE.Length]
-
 
457
        mov     [acpi_fadt_size-OS_BASE], eax
-
 
458
        jmp     .next_table
-
 
459
.madt:
-
 
460
        mov     [acpi_madt_base-OS_BASE], eax
-
 
461
        mov     eax, [eax+ACPI_TABLE.Length]
-
 
462
        mov     [acpi_madt_size-OS_BASE], eax
-
 
463
        jmp     .next_table
-
 
464
.hpet:
-
 
465
        mov     [acpi_hpet_base-OS_BASE], eax
-
 
466
        mov     eax, [eax+ACPI_TABLE.Length]
-
 
467
        mov     [acpi_hpet_size-OS_BASE], eax
-
 
468
        jmp     .next_table
-
 
469
.done:
-
 
470
        mov     [acpi_ssdt_cnt-OS_BASE], ecx
Line 448... Line 471...
448
ACPI_FADT_SIGN             = 'FACP'
471
        ret
449
 
472
endp
450
 
473
 
Line 472... Line 495...
472
        mov     ebx, ACPI_HI_RSDP_WINDOW_START
495
        mov     ebx, ACPI_HI_RSDP_WINDOW_START
473
        mov     edi, ACPI_HI_RSDP_WINDOW_END
496
        mov     edi, ACPI_HI_RSDP_WINDOW_END
474
        call    .check
497
        call    .check
475
end if
498
end if
476
.done:
499
.done:
-
 
500
        mov     [acpi_rsdp_base-OS_BASE], ebx
477
        mov     eax, ebx
501
        test    ebx, ebx
-
 
502
        jz      @f
-
 
503
        call    acpi_locate_tables
-
 
504
@@:
478
        pop     edi
505
        pop     edi
479
        pop     ebx
506
        pop     ebx
480
        ret
507
        ret
Line 481... Line 508...
481
 
508
 
Line 500... Line 527...
500
        add     ebx, 16
527
        add     ebx, 16
501
        cmp     ebx, edi
528
        cmp     ebx, edi
502
        jb      .check
529
        jb      .check
503
        xor     ebx, ebx
530
        xor     ebx, ebx
504
        ret
531
        ret
505
 
-
 
506
align 4
-
 
507
rsdt_find:           ;ecx= rsdt edx= SIG
-
 
508
        push    ebx
-
 
509
        push    esi
-
 
510
 
-
 
511
        lea     ebx, [ecx+36]
-
 
512
        mov     esi, [ecx+4]
-
 
513
        add     esi, ecx
-
 
514
align 4
-
 
515
.next:
-
 
516
        mov     eax, [ebx]
-
 
517
        cmp     [eax], edx
-
 
518
        je      .done
-
 
519
 
-
 
520
        add     ebx, 4
-
 
521
        cmp     ebx, esi
-
 
522
        jb      .next
-
 
523
 
-
 
524
        xor     eax, eax
-
 
525
        pop     esi
-
 
526
        pop     ebx
-
 
527
        ret
-
 
528
 
-
 
529
.done:
-
 
530
        mov     eax, [ebx]
-
 
531
        pop     esi
-
 
532
        pop     ebx
-
 
533
        ret
-
 
534
 
-
 
535
align 4
-
 
536
check_acpi:
-
 
537
 
-
 
538
        call    acpi_locate
-
 
539
        test    eax, eax
-
 
540
        jz      .done
-
 
541
 
-
 
542
        mov     [acpi_rsdp-OS_BASE], eax
-
 
543
        mov     ecx, [eax+16]
-
 
544
        mov     edx, ACPI_FADT_SIGN
-
 
545
        mov     [acpi_rsdt_base-OS_BASE], ecx
-
 
546
        call    rsdt_find
-
 
547
        mov     [acpi_fadt_base-OS_BASE], eax
-
 
548
        test    eax, eax
-
 
549
        jz      @f
-
 
550
 
-
 
551
        mov     eax, [eax+40]
-
 
552
        mov     [acpi_dsdt_base-OS_BASE], eax
-
 
553
        mov     eax, [eax+4]
-
 
554
        mov     [acpi_dsdt_size-OS_BASE], eax
-
 
555
@@:
-
 
556
        mov     edx, ACPI_HPET_SIGN
-
 
557
        mov     ecx, [acpi_rsdt_base-OS_BASE]
-
 
558
        call    rsdt_find
-
 
559
        test    eax, eax
-
 
560
        jz      @F
-
 
561
 
-
 
562
        mov     [acpi_hpet_base-OS_BASE], eax
-
 
563
        mov     eax, [eax+44]
-
 
564
        mov     [hpet_base-OS_BASE], eax
-
 
565
@@:
-
 
566
        mov     edx, ACPI_MADT_SIGN
-
 
567
        mov     ecx, [acpi_rsdt_base-OS_BASE]
-
 
568
        call    rsdt_find
-
 
569
        test    eax, eax
-
 
570
        jz      .done
-
 
571
 
-
 
572
        mov     [acpi_madt_base-OS_BASE], eax
-
 
573
        mov     ecx, [eax+36]
-
 
574
        mov     [acpi_lapic_base-OS_BASE], ecx
-
 
575
 
-
 
576
        mov     edi, smpt-OS_BASE
-
 
577
        mov     ebx, [ecx+0x20]
-
 
578
        shr     ebx, 24              ; read APIC ID
-
 
579
 
-
 
580
        mov     [edi], ebx           ; bootstrap always first
-
 
581
        inc     [cpu_count-OS_BASE]
-
 
582
        add     edi, 4
-
 
583
 
-
 
584
        mov     [ioapic_cnt-OS_BASE], 0
-
 
585
        lea     edx, [eax+44]
-
 
586
        mov     ecx, [eax+4]
-
 
587
        add     ecx, eax
-
 
588
.check:
-
 
589
        mov     eax, [edx]
-
 
590
        cmp     al, 0
-
 
591
        je      .lapic
-
 
592
        cmp     al, 1
-
 
593
        je      .io_apic
-
 
594
        jmp     .next
-
 
595
.lapic:
-
 
596
        shr     eax, 24              ; get APIC ID
-
 
597
        cmp     eax, ebx             ; skip self
-
 
598
        je      .next
-
 
599
 
-
 
600
        test    [edx+4], byte 1      ; is enabled ?
-
 
601
        jz      .next
-
 
602
 
-
 
603
        cmp     [cpu_count-OS_BASE], 16
-
 
604
        jae     .next
-
 
605
 
-
 
606
        stosd                        ; store APIC ID
-
 
607
        inc     [cpu_count-OS_BASE]
-
 
608
.next:
-
 
609
        mov     eax, [edx]
-
 
610
        movzx   eax, ah
-
 
611
        add     edx, eax
-
 
612
        cmp     edx, ecx
-
 
613
        jb      .check
-
 
614
.done:
-
 
615
        ret
-
 
616
 
-
 
617
.io_apic:
-
 
618
        mov     eax, [ioapic_cnt-OS_BASE]
-
 
619
        push    dword[edx+4]
-
 
620
        pop     [acpi_ioapic_base-OS_BASE+eax*4]
-
 
621
        push    dword[edx+8]
-
 
622
        pop     [ioapic_gsi_base-OS_BASE+eax*4]
-
 
623
        inc     [ioapic_cnt-OS_BASE]
-
 
624
        jmp     .next
-
 
625
 
-
 
626
HPET_PERIOD             = 0x0004
-
 
627
HPET_CFG_ENABLE         = 0x0001
-
 
628
HPET_CFG                = 0x0010
-
 
629
HPET_COUNTER            = 0x00f0
-
 
630
HPET_T0_CFG             = 0x0100
-
 
631
 
-
 
632
HPET_TN_LEVEL           = 0x0002
-
 
633
HPET_TN_ENABLE          = 0x0004
-
 
634
HPET_TN_FSB             = 0x4000
-
 
635
 
-
 
636
align 4
-
 
637
init_hpet:
-
 
638
        mov     ebx, [hpet_base-OS_BASE]
-
 
639
        test    ebx, ebx
-
 
640
        jz      .done
-
 
641
 
-
 
642
        mov     eax, [ebx]
-
 
643
        and     ah, 0x1F
-
 
644
        inc     ah
-
 
645
        movzx   eax, ah
-
 
646
        mov     [hpet_timers-OS_BASE], eax
-
 
647
        mov     ecx, eax
-
 
648
 
-
 
649
        mov     eax, [ebx+HPET_PERIOD]
-
 
650
        xor     edx, edx
-
 
651
        shld    edx, eax, 10
-
 
652
        shl     eax, 10
-
 
653
        mov     esi, 1000000
-
 
654
        div     esi
-
 
655
        mov     [hpet_period-OS_BASE], eax
-
 
656
 
-
 
657
        mov     esi, [ebx+HPET_CFG]
-
 
658
        and     esi, not HPET_CFG_ENABLE
-
 
659
        mov     [ebx+HPET_CFG], esi             ;stop main counter
-
 
660
 
-
 
661
        lea     edx, [ebx+HPET_T0_CFG]
-
 
662
@@:
-
 
663
        jcxz    @F
-
 
664
        mov     eax, [edx]
-
 
665
        and     eax, not (HPET_TN_ENABLE+HPET_TN_LEVEL+HPET_TN_FSB)
-
 
666
        mov     [edx], eax
-
 
667
        add     edx, 0x20
-
 
668
        dec     ecx
-
 
669
        jmp     @B
-
 
670
@@:
-
 
671
        mov     [ebx+HPET_COUNTER], ecx         ;reset main counter
-
 
672
        mov     [ebx+HPET_COUNTER+4], ecx
-
 
673
 
-
 
674
        or      esi, HPET_CFG_ENABLE
-
 
675
        mov     [ebx+HPET_CFG], esi             ;and start again
-
 
676
 
-
 
677
.done:
-
 
678
        rdtsc
-
 
679
        mov     [hpet_tsc_start-OS_BASE], eax
-
 
680
        mov     [hpet_tsc_start+4-OS_BASE], edx
-
 
681
 
-
 
682
        ret
-
 
683
-
 
684
-
 
685
-
 
686
-