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 | - |