Subversion Repositories Kolibri OS

Rev

Rev 7731 | Go to most recent revision | 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_bin_data_begin
  208.         mov     rdi, KERNEL_BASE
  209.         mov     rcx, (kernel_bin_data_end - kernel_bin_data_begin + 7) / 8
  210.         rep movsq
  211.  
  212.         mov     rsi, kolibri_img_data_begin
  213.         mov     rdi, RAMDISK_BASE
  214.         mov     rcx, (kolibri_img_data_end - kolibri_img_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     word[esi + BOOT_LO.sys_disk], 'r1'   ; boot from /rd/1
  236.  
  237.  
  238.         lgdt    [cs:GDTR]
  239.  
  240.         mov     ax, DATA_32_SELECTOR
  241.         mov     ds, ax
  242.         mov     es, ax
  243.         mov     fs, ax
  244.         mov     gs, ax
  245.         mov     ss, ax
  246.  
  247.         push    CODE_32_SELECTOR
  248.         lea     rax, [.next]
  249.         push    rax
  250. ;        push    .next
  251.         retf
  252. use32
  253. align 16
  254.   .next:
  255.         mov     eax, cr0
  256.         and     eax, not CR0_PG
  257.         mov     cr0, eax
  258.  
  259.         mov     ecx, MSR_AMD_EFER
  260.         rdmsr
  261.         btr     eax, 8                  ; LME
  262.         wrmsr
  263.        
  264.         mov     eax, cr4
  265.         and     eax, not CR4_PAE
  266.         mov     cr4, eax
  267.  
  268.         push    KERNEL_BASE
  269.         retn
  270.  
  271. use64
  272.   .error:
  273.         uefi_call_wrapper ConOut, OutputString, ConOut, msg_error
  274.         jmp     .quit
  275.   .quit:
  276.         mov     rcx, -1
  277.         loop    $
  278.  
  279.  
  280. ; linux/arch/x86/platform/efi/efi.c
  281. ; do_add_efi_memmap
  282. add_uefi_memmap:
  283.         push    rax rbx rcx rdx rsi rdi
  284.  
  285.         mov     r10d, [rsi + 0]
  286.         mov     r11, [rsi + 8]
  287. ;        mov     r12, [rsi + 16]
  288.         mov     r13, [rsi + 24]
  289.         mov     r14, [rsi + 32]
  290.  
  291.         mov     [rdi + e820entry.addr], r11
  292.         mov     rax, r13
  293.         shl     rax, 12
  294.         mov     [rdi + e820entry.size], rax
  295.  
  296.  
  297.         cmp     r10d, EFI_LOADER_CODE
  298.         jz      .case0
  299.         cmp     r10d, EFI_LOADER_DATA
  300.         jz      .case0
  301.         cmp     r10d, EFI_BOOT_SERVICES_CODE
  302.         jz      .case0
  303.         cmp     r10d, EFI_BOOT_SERVICES_DATA
  304.         jz      .case0
  305.         cmp     r10d, EFI_CONVENTIONAL_MEMORY
  306.         jz      .case0
  307.         cmp     r10d, EFI_ACPI_RECLAIM_MEMORY
  308.         jz      .case1
  309.         cmp     r10d, EFI_ACPI_MEMORY_NVS
  310.         jz      .case2
  311.         cmp     r10d, EFI_UNUSABLE_MEMORY
  312.         jz      .case3
  313.         cmp     r10d, EFI_PERSISTENT_MEMORY
  314.         jz      .case4
  315.         jmp     .default
  316.  
  317.   .case0:
  318.         test    r14, EFI_MEMORY_WB
  319.         jz      @f
  320.         mov     eax, E820_RAM
  321.         jmp     .done
  322.     @@:
  323.         mov     eax, E820_RESERVED
  324.         jmp     .done
  325.   .case1:
  326.         mov     eax, E820_ACPI
  327.         jmp     .done
  328.   .case2:
  329.         mov     eax, E820_NVS
  330.         jmp     .done
  331.   .case3:
  332.         mov     eax, E820_UNUSABLE
  333.         jmp     .done
  334.   .case4:
  335.         mov     eax, E820_PMEM
  336.         jmp     .done
  337.   .default:
  338.         mov     eax, E820_RESERVED
  339.         jmp     .done
  340.  
  341.   .done:
  342.         mov     [rdi + e820entry.type], eax
  343.  
  344.         mov     rax, BOOT_LO.memmap_block_cnt
  345.         inc     word[rax]
  346.  
  347.         pop     rdi rsi rdx rcx rbx rax
  348.         ret
  349.  
  350.  
  351. num2dec:
  352.         push    rax rbx rcx rdx rsi rdi
  353.  
  354.         xor     ecx, ecx
  355.         mov     ebx, 10
  356.   .next_digit:
  357.         xor     edx, edx
  358.         div     ebx
  359.         push    rdx
  360.         inc     ecx
  361.         test    eax, eax
  362.         jnz     .next_digit
  363.  
  364.   .next_char:
  365.         pop     rax
  366.         add     eax, '0'
  367.         stosw
  368.         loop    .next_char
  369.  
  370.         pop     rdi rsi rdx rcx rbx rax
  371.         ret
  372.  
  373.  
  374. num2hex:
  375.         push    rax rbx rcx rdx rsi rdi
  376.  
  377.         xchg    rdx, rax
  378.         mov     ecx, 16
  379.   .next_tetra:
  380.         rol     rdx, 4
  381.         movzx   eax, dl
  382.         and     eax, 0x0f
  383.         movzx   eax, byte[hex+eax]
  384.         stosw
  385.         loop    .next_tetra
  386.  
  387.         pop     rdi rsi rdx rcx rbx rax
  388.         ret
  389.  
  390. hex db '0123456789ABCDEF'
  391.  
  392. clearbuf:
  393.         push    rax rbx rcx rdx rsi rdi
  394.         mov     eax, 0x0020
  395.         mov     ecx, 79
  396.         mov     rdi, msg
  397.         rep stosw
  398.         pop     rdi rsi rdx rcx rbx rax
  399.         ret
  400.  
  401. section '.data' data readable writeable
  402.  
  403. GDTR:
  404.         dw 4*8-1
  405.         dq GDT
  406. GDT:
  407.         dw 0, 0, 0, 0
  408.         dw 0FFFFh,0,9A00h,0CFh          ; 32-bit code
  409.         dw 0FFFFh,0,9200h,0CFh          ; flat data
  410.         dw 0FFFFh,0,9A00h,0AFh          ; 64-bit code
  411.  
  412.  
  413. fb_base         dq 0
  414.  
  415. gopuuid         db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID
  416. gop_buffer_size dq GOP_BUFFER_SIZE
  417. gop_handle      dq 0
  418. gop_interface   dq 0
  419. gop_info_size   dq 0
  420. gop_info        dq 0
  421.  
  422. memory_map_key  dq 0
  423. descriptor_size dq 0
  424. descriptor_ver  dq 0
  425. memory_map_size dq MEMORY_MAP_SIZE
  426.  
  427. msg_success     du 'Success!',13,10,0
  428. msg_error       du 'Error!',13,10,0
  429. msg             du 79 dup ' ',13,10,0
  430.  
  431. memory_map      rb MEMORY_MAP_SIZE
  432. gop_buffer      rb GOP_BUFFER_SIZE
  433.  
  434.  
  435. kernel_bin_data_begin:
  436. file '../kernel.bin'
  437. kernel_bin_data_end:
  438.  
  439. kolibri_img_data_begin:
  440. file '../../../data/kolibri.img'
  441. kolibri_img_data_end:
  442.  
  443. align 16
  444. data fixups
  445. end data
  446.