Subversion Repositories Kolibri OS

Rev

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

  1. format pe64 dll efi at 0
  2. entry main
  3.  
  4.  
  5. section '.text' code executable readable
  6.  
  7. include '../struct.inc'
  8. include '../macros.inc'
  9. include '../const.inc'
  10. include 'uefi.inc'
  11.  
  12. MEMORY_MAP_SIZE = 0x4000
  13. GOP_BUFFER_SIZE = 0x800
  14.  
  15. KERNEL_BASE  =  0x10000
  16. RAMDISK_BASE = 0x100000
  17.  
  18. CODE_32_SELECTOR = 8
  19. DATA_32_SELECTOR = 16
  20. CODE_64_SELECTOR = 24
  21.  
  22. ; linux/arch/x86/include/uapi/asm/e820.h
  23. E820_RAM       = 1
  24. E820_RESERVED  = 2
  25. E820_ACPI      = 3
  26. E820_NVS       = 4
  27. E820_UNUSABLE  = 5
  28. E820_PMEM      = 7
  29. ;E820_MAX       = 128
  30.  
  31. main:
  32.         sub     rsp, 0x38
  33.         ; initialize UEFI library
  34.         InitializeLib
  35.         jc      .error
  36.  
  37. ;        uefi_call_wrapper ConOut, Reset, ConOut, 1
  38. ;        cmp     rax, EFI_SUCCESS
  39. ;        jnz     .error
  40.  
  41.         uefi_call_wrapper ConOut, ClearScreen, ConOut
  42.         cmp     rax, EFI_SUCCESS
  43.         jnz     .error
  44.  
  45. ;        uefi_call_wrapper ConOut, OutputString, ConOut, msg_hello
  46. ;        cmp     eax, EFI_SUCCESS
  47. ;        jnz     .error
  48.  
  49.         uefi_call_wrapper BootServices, LocateHandle, 2, gopuuid, 0, gop_buffer_size, gop_buffer
  50.         cmp     eax, EFI_SUCCESS
  51.         jnz     .error
  52.  
  53.         mov     rsi, gop_buffer
  54.         lodsq
  55.         mov     [gop_handle], rax
  56.         uefi_call_wrapper BootServices, HandleProtocol, qword [gop_handle], gopuuid, gop_interface
  57.         cmp     eax, EFI_SUCCESS
  58.         jnz     .error
  59.  
  60.         mov     rbx, [efi_ptr]
  61.         mov     rdi, [rbx + EFI_SYSTEM_TABLE.ConfigurationTable]
  62.         mov     rcx, [rbx + EFI_SYSTEM_TABLE.NumberOfTableEntries]
  63.         mov     rax, 0x11d3e4f18868e871
  64.         mov     rdx, 0x81883cc7800022bc
  65.   .next_table:
  66.         dec     ecx
  67.         js      .all_tables_done
  68.         cmp     [rdi + 0], rax
  69.         jnz     .not_acpi20
  70.         cmp     [rdi + 8], rdx
  71.         jnz     .not_acpi20
  72.         mov     rax, [rdi + 16]
  73.         mov     rdx, BOOT_LO.acpi_rsdp
  74.         mov     [rdx], eax
  75. ;jmp $
  76.         jmp     .all_tables_done
  77.   .not_acpi20:
  78.         add     rdi, 24
  79.         jmp     .next_table
  80.   .all_tables_done:
  81.  
  82.         xor     ebx, ebx
  83.   .next_mode:
  84.         call    clearbuf
  85.         mov     eax, ebx
  86.         lea     rdi, [msg]
  87.         call    num2dec
  88.  
  89.         push    rbx
  90.         uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info
  91.         cmp     rax, EFI_SUCCESS
  92.         jnz     .error
  93.         mov     rcx, [gop_info]
  94.         cmp     [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1     ; PixelBlueGreenRedReserved8BitPerColor
  95.         jnz     .skip
  96.         mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
  97.         lea     rdi, [msg+4*2]
  98.         call    num2dec
  99.         mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
  100.         lea     rdi, [msg+9*2]
  101.         call    num2dec
  102. ;        mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
  103. ;        lea     rdi, [msg+14*2]
  104. ;        call    num2dec
  105.   .skip:
  106.         uefi_call_wrapper ConOut, OutputString, ConOut, msg
  107.         cmp     rax, EFI_SUCCESS
  108.         jnz     .error
  109.  
  110.         pop     rbx
  111.         inc     rbx
  112.         mov     rcx, [gop_interface]
  113.         mov     rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
  114.         cmp     ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode]
  115.         jnz     .next_mode
  116.  
  117.  
  118.         uefi_call_wrapper ConIn, Reset, ConIn, 1
  119.         cmp     rax, EFI_SUCCESS
  120.         jnz     .error
  121.         xor     ecx, ecx
  122.     @@:
  123.         push    rcx
  124.         uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, msg
  125.         pop     rcx
  126.         mov     rdx, EFI_DEVICE_ERROR
  127.         cmp     rax, rdx
  128.         jz      .error
  129.         mov     rdx, EFI_NOT_READY
  130.         cmp     rax, rdx
  131.         jz      @b
  132. ;        cmp     rax, EFI_SUCCESS
  133.         movzx   eax, word[msg+2]
  134. ;jmp .key_done
  135.         cmp     al, 0x0D
  136.         jz      .key_done
  137.         imul    ecx, 10
  138.         sub     eax, '0'
  139.         add     ecx, eax
  140.         jmp     @b
  141.   .key_done:
  142.  
  143.         uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, [gop_interface], rcx
  144.         cmp     eax, EFI_SUCCESS
  145.         jnz     .error
  146.  
  147.         mov     rcx, [gop_interface]
  148.         mov     rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
  149.         mov     rdi, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase]
  150.         mov     [fb_base], rdi
  151.  
  152.  
  153.         mov     ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode]
  154.         uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info
  155.         cmp     rax, EFI_SUCCESS
  156.         jnz     .error
  157.         mov     rcx, [gop_info]
  158.         mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
  159.         xor     rdx, rdx
  160.         mov     word [rdx + BOOT_LO.x_res], ax
  161.         mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
  162.         mov     word [rdx + BOOT_LO.y_res], ax
  163.         mov     eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
  164.         shl     eax, 2
  165.         mov     word [rdx + BOOT_LO.pitch], ax
  166.  
  167.         mov     byte [rdx + BOOT_LO.pci_data + 0], 1    ; PCI access mechanism
  168.         mov     byte [rdx + BOOT_LO.pci_data + 1], 8    ; last bus, don't know how to count them
  169.         mov     byte [rdx + BOOT_LO.pci_data + 2], 0x10 ; PCI version
  170.         mov     byte [rdx + BOOT_LO.pci_data + 3], 0x02
  171.         mov     dword [rdx + BOOT_LO.pci_data + 4], 0xe3
  172.  
  173.  
  174.         uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver
  175.         cmp     eax, EFI_SUCCESS
  176.         jnz     .error
  177.  
  178.         mov     rdi, BOOT_LO.memmap_block_cnt
  179.         mov     dword[rdi], 0
  180.         mov     rdi, BOOT_LO.memmap_blocks
  181.         mov     rax, [memory_map_size]
  182.         xor     edx, edx
  183.         mov     rcx, [descriptor_size]
  184.         div     ecx
  185.         mov     ecx, eax
  186.         mov     rsi, memory_map
  187.   .next_descr:
  188.         call    add_uefi_memmap
  189.         add     rsi, [descriptor_size]
  190.         add     rdi, sizeof.e820entry
  191.         dec     rcx
  192.         cmp     rcx, 0
  193.         jnz     .next_descr
  194.  
  195.         mov     [memory_map_size], MEMORY_MAP_SIZE
  196.         uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver
  197.         cmp     eax, EFI_SUCCESS
  198.         jnz     .error
  199.  
  200.         uefi_call_wrapper BootServices, ExitBootServices, [efi_handler], [memory_map_key]
  201.         cmp     eax, EFI_SUCCESS
  202.         jnz     .error
  203.  
  204.  
  205.         cli
  206.  
  207.         mov     rsi, kernel_data_begin
  208.         mov     rdi, KERNEL_BASE
  209.         mov     rcx, (kernel_data_end - kernel_data_begin + 7) / 8
  210.         rep movsq
  211.  
  212.         mov     rsi, ramdisk_data_begin
  213.         mov     rdi, RAMDISK_BASE
  214.         mov     rcx, (ramdisk_data_end - ramdisk_data_begin + 7 ) / 8
  215.         rep movsq
  216.  
  217.         xor     esi, esi
  218.         mov     byte[esi + BOOT_LO.bpp], 32
  219.         mov     word[esi + BOOT_LO.vesa_mode], 0
  220.         mov     dword[esi + BOOT_LO.bank_switch], 0
  221.         mov     rdi, [fb_base]
  222.         mov     dword[esi + BOOT_LO.lfb], edi
  223.         mov     byte[esi + BOOT_LO.mtrr], 1
  224.         mov     byte[esi + BOOT_LO.launcher_start], 1
  225.         mov     byte[esi + BOOT_LO.debug_print], 1
  226.         mov     byte[esi + BOOT_LO.dma], 0
  227. ;        mov     qword[esi + BOOT_LO.pci_data], 0
  228.         mov     dword[esi + BOOT_LO.apm_entry], 0
  229.         mov     word[esi + BOOT_LO.apm_version], 0
  230.         mov     dword[esi + BOOT_LO.apm_flags], 0
  231.         mov     word[esi + BOOT_LO.apm_code_32], 0
  232.         mov     word[esi + BOOT_LO.apm_code_16], 0
  233.         mov     word[esi + BOOT_LO.apm_data_16], 0
  234.         mov     byte[esi + BOOT_LO.bios_hd_cnt], 0
  235.         mov     rsi, syspath
  236.         mov     rdi, BOOT_LO.syspath
  237.         mov     ecx, 32
  238.         rep movsb
  239.  
  240.         lgdt    [cs:GDTR]
  241.  
  242.         mov     ax, DATA_32_SELECTOR
  243.         mov     ds, ax
  244.         mov     es, ax
  245.         mov     fs, ax
  246.         mov     gs, ax
  247.         mov     ss, ax
  248.  
  249.         push    CODE_32_SELECTOR
  250.         lea     rax, [.next]
  251.         push    rax
  252. ;        push    .next
  253.         retf
  254. use32
  255. align 16
  256.   .next:
  257.         mov     eax, cr0
  258.         and     eax, not CR0_PG
  259.         mov     cr0, eax
  260.  
  261.         mov     ecx, MSR_AMD_EFER
  262.         rdmsr
  263.         btr     eax, 8                  ; LME
  264.         wrmsr
  265.        
  266.         mov     eax, cr4
  267.         and     eax, not CR4_PAE
  268.         mov     cr4, eax
  269.  
  270.         push    KERNEL_BASE
  271.         retn
  272.  
  273. use64
  274.   .error:
  275.         uefi_call_wrapper ConOut, OutputString, ConOut, msg_error
  276.         jmp     .quit
  277.   .quit:
  278.         mov     rcx, -1
  279.         loop    $
  280.  
  281.  
  282. ; linux/arch/x86/platform/efi/efi.c
  283. ; do_add_efi_memmap
  284. add_uefi_memmap:
  285.         push    rax rbx rcx rdx rsi rdi
  286.  
  287.         mov     r10d, [rsi + 0]
  288.         mov     r11, [rsi + 8]
  289. ;        mov     r12, [rsi + 16]
  290.         mov     r13, [rsi + 24]
  291.         mov     r14, [rsi + 32]
  292.  
  293.         mov     [rdi + e820entry.addr], r11
  294.         mov     rax, r13
  295.         shl     rax, 12
  296.         mov     [rdi + e820entry.size], rax
  297.  
  298.  
  299.         cmp     r10d, EFI_LOADER_CODE
  300.         jz      .case0
  301.         cmp     r10d, EFI_LOADER_DATA
  302.         jz      .case0
  303.         cmp     r10d, EFI_BOOT_SERVICES_CODE
  304.         jz      .case0
  305.         cmp     r10d, EFI_BOOT_SERVICES_DATA
  306.         jz      .case0
  307.         cmp     r10d, EFI_CONVENTIONAL_MEMORY
  308.         jz      .case0
  309.         cmp     r10d, EFI_ACPI_RECLAIM_MEMORY
  310.         jz      .case1
  311.         cmp     r10d, EFI_ACPI_MEMORY_NVS
  312.         jz      .case2
  313.         cmp     r10d, EFI_UNUSABLE_MEMORY
  314.         jz      .case3
  315.         cmp     r10d, EFI_PERSISTENT_MEMORY
  316.         jz      .case4
  317.         jmp     .default
  318.  
  319.   .case0:
  320.         test    r14, EFI_MEMORY_WB
  321.         jz      @f
  322.         mov     eax, E820_RAM
  323.         jmp     .done
  324.     @@:
  325.         mov     eax, E820_RESERVED
  326.         jmp     .done
  327.   .case1:
  328.         mov     eax, E820_ACPI
  329.         jmp     .done
  330.   .case2:
  331.         mov     eax, E820_NVS
  332.         jmp     .done
  333.   .case3:
  334.         mov     eax, E820_UNUSABLE
  335.         jmp     .done
  336.   .case4:
  337.         mov     eax, E820_PMEM
  338.         jmp     .done
  339.   .default:
  340.         mov     eax, E820_RESERVED
  341.         jmp     .done
  342.  
  343.   .done:
  344.         mov     [rdi + e820entry.type], eax
  345.  
  346.         mov     rax, BOOT_LO.memmap_block_cnt
  347.         inc     word[rax]
  348.  
  349.         pop     rdi rsi rdx rcx rbx rax
  350.         ret
  351.  
  352.  
  353. num2dec:
  354.         push    rax rbx rcx rdx rsi rdi
  355.  
  356.         xor     ecx, ecx
  357.         mov     ebx, 10
  358.   .next_digit:
  359.         xor     edx, edx
  360.         div     ebx
  361.         push    rdx
  362.         inc     ecx
  363.         test    eax, eax
  364.         jnz     .next_digit
  365.  
  366.   .next_char:
  367.         pop     rax
  368.         add     eax, '0'
  369.         stosw
  370.         loop    .next_char
  371.  
  372.         pop     rdi rsi rdx rcx rbx rax
  373.         ret
  374.  
  375.  
  376. num2hex:
  377.         push    rax rbx rcx rdx rsi rdi
  378.  
  379.         xchg    rdx, rax
  380.         mov     ecx, 16
  381.   .next_tetra:
  382.         rol     rdx, 4
  383.         movzx   eax, dl
  384.         and     eax, 0x0f
  385.         movzx   eax, byte[hex+eax]
  386.         stosw
  387.         loop    .next_tetra
  388.  
  389.         pop     rdi rsi rdx rcx rbx rax
  390.         ret
  391.  
  392. hex db '0123456789ABCDEF'
  393.  
  394. clearbuf:
  395.         push    rax rbx rcx rdx rsi rdi
  396.         mov     eax, 0x0020
  397.         mov     ecx, 79
  398.         mov     rdi, msg
  399.         rep stosw
  400.         pop     rdi rsi rdx rcx rbx rax
  401.         ret
  402.  
  403. section '.data' data readable writeable
  404.  
  405. GDTR:
  406.         dw 4*8-1
  407.         dq GDT
  408. GDT:
  409.         dw 0, 0, 0, 0
  410.         dw 0FFFFh,0,9A00h,0CFh          ; 32-bit code
  411.         dw 0FFFFh,0,9200h,0CFh          ; flat data
  412.         dw 0FFFFh,0,9A00h,0AFh          ; 64-bit code
  413.  
  414.  
  415. fb_base         dq 0
  416.  
  417. gopuuid         db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID
  418. gop_buffer_size dq GOP_BUFFER_SIZE
  419. gop_handle      dq 0
  420. gop_interface   dq 0
  421. gop_info_size   dq 0
  422. gop_info        dq 0
  423.  
  424. memory_map_key  dq 0
  425. descriptor_size dq 0
  426. descriptor_ver  dq 0
  427. memory_map_size dq MEMORY_MAP_SIZE
  428.  
  429. msg_success     du 'Success!',13,10,0
  430. msg_error       du 'Error!',13,10,0
  431. msg             du 79 dup ' ',13,10,0
  432.  
  433. syspath         db '/RD/1',0
  434.  
  435. memory_map      rb MEMORY_MAP_SIZE
  436. gop_buffer      rb GOP_BUFFER_SIZE
  437.  
  438.  
  439. kernel_data_begin:
  440. file '../kernel.bin.ext_loader'
  441. kernel_data_end:
  442.  
  443. ramdisk_data_begin:
  444. file '../../../data/kolibri.img'
  445. ramdisk_data_end:
  446.  
  447. align 16
  448. data fixups
  449. end data
  450.