Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. format MS COFF
  2.  
  3. extrn  _acpi_rsdt_base
  4.  
  5. public _acpi_locate
  6. public @rsdt_find@8
  7.  
  8. OS_BASE                    equ 0x80000000
  9.  
  10. ACPI_HI_RSDP_WINDOW_START  equ (OS_BASE+0x000E0000)
  11. ACPI_HI_RSDP_WINDOW_END    equ (OS_BASE+0x00100000)
  12. ACPI_RSDP_CHECKSUM_LENGTH  equ 20
  13.  
  14. section '.text' code readable executable align 16
  15.  
  16.  
  17. _acpi_locate:
  18.         push ebx
  19.         mov ebx, ACPI_HI_RSDP_WINDOW_START
  20. .check:
  21.         cmp [ebx], dword 0x20445352
  22.         jne .next
  23.         cmp [ebx+4], dword 0x20525450
  24.         jne .next
  25.  
  26.         mov edx, ebx
  27.         mov ecx, ACPI_RSDP_CHECKSUM_LENGTH
  28.         xor eax, eax
  29. .sum:
  30.         add al, [edx]
  31.         inc edx
  32.         loop .sum
  33.  
  34.         test al, al
  35.         jnz .next
  36.  
  37.         mov eax, ebx
  38.         pop ebx
  39.         ret
  40. .next:
  41.         add ebx, 16
  42.         cmp ebx, ACPI_HI_RSDP_WINDOW_END
  43.         jb .check
  44.  
  45.         pop ebx
  46.         xor eax, eax
  47.         ret
  48.  
  49. align 4
  50. @rsdt_find@8:           ;ecx= rsdt edx= SIG
  51.         push ebx
  52.         push esi
  53.  
  54.         lea ebx, [ecx+36]
  55.         mov esi, [ecx+4]
  56.         add esi, ecx
  57. .next:
  58.         mov eax, [ebx]
  59.         sub eax, [_acpi_rsdt_base]
  60.         add eax, ecx
  61.  
  62.         cmp [eax], edx
  63.         je .done
  64.  
  65.         add ebx, 4
  66.         cmp ebx, esi
  67.         jb .next
  68.  
  69.         xor eax, eax
  70.         pop esi
  71.         pop ebx
  72.         ret
  73.  
  74. .done:
  75.         mov eax, [ebx]
  76.         pop esi
  77.         pop ebx
  78.         ret
  79.  
  80.