Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. format pe64 dll efi
  2. entry main
  3.  
  4. section '.text' code executable readable
  5.  
  6. include '../../struct.inc'
  7. include '../../macros.inc'
  8. include '../../const.inc'
  9. include 'uefi.inc'
  10.  
  11. MEMORY_MAP_SIZE = 0x4000
  12. GOP_BUFFER_SIZE = 0x100
  13. LIP_BUFFER_SIZE = 0x100
  14. FILE_BUFFER_SIZE = 0x1000
  15.  
  16. KERNEL_BASE  =  0x10000
  17. RAMDISK_BASE = 0x100000
  18.  
  19. CODE_32_SELECTOR = 8
  20. DATA_32_SELECTOR = 16
  21. CODE_64_SELECTOR = 24
  22.  
  23. ; linux/arch/x86/include/uapi/asm/e820.h
  24. E820_RAM       = 1
  25. E820_RESERVED  = 2
  26. E820_ACPI      = 3
  27. E820_NVS       = 4
  28. E820_UNUSABLE  = 5
  29. E820_PMEM      = 7
  30.  
  31. load_file:
  32. virtual at rsp+8
  33.   .root   dq ?
  34.   .name   dq ?
  35.   .buffer dq ?
  36.   .size   dq ?
  37.   .fatal  dq ?
  38. end virtual
  39.  
  40.         eficall [.root], EFI_FILE_PROTOCOL.Open, [.root], file_handle, \
  41.                 [.name], EFI_FILE_MODE_READ, 0
  42.         cmp     rax, EFI_SUCCESS
  43.         jz      @f
  44.         xor     eax, eax
  45.         cmp     [.fatal], 1
  46.         jnz     .done
  47.         eficall ConOut, OutputString, ConOut, msg_error_open_file
  48.         eficall ConOut, OutputString, ConOut, [.name]
  49.         jmp     $
  50. @@:
  51.  
  52.         lea     rax, [.size]
  53.         eficall [file_handle], EFI_FILE_PROTOCOL.Read, [file_handle], rax, \
  54.                 [.buffer]
  55.         eficall [file_handle], EFI_FILE_PROTOCOL.Close, [file_handle]
  56.         mov     rax, [.size]
  57. .done:
  58.         ret     8*5
  59.  
  60. skip_whitespace:
  61. .next_char:
  62.         cmp     byte[rsi], 0
  63.         jz      .done
  64.         cmp     byte[rsi], 0x20 ; ' '
  65.         jz      .whitespace
  66.         cmp     byte[rsi], 9    ; '\t'
  67.         jz      .whitespace
  68.         jmp     .done
  69. .whitespace:
  70.         inc     rsi
  71.         jmp     .next_char
  72. .done:
  73.         ret
  74.  
  75. skip_until_newline:
  76. .next_char:
  77.         cmp     byte[rsi], 0
  78.         jz      .done
  79.         cmp     byte[rsi], 0xd  ; '\r'
  80.         jz      .done
  81.         cmp     byte[rsi], 0xa  ; '\n'
  82.         jz      .done
  83.         inc     rsi
  84.         jmp     .next_char
  85. .done:
  86.         ret
  87.  
  88. skip_newline:
  89. .next_char:
  90.         cmp     byte[rsi], 0xd  ; '\r'
  91.         jz      .newline
  92.         cmp     byte[rsi], 0xa  ; '\n'
  93.         jz      .newline
  94.         jmp     .done
  95. .newline:
  96.         inc     rsi
  97.         jmp     .next_char
  98. .done:
  99.         ret
  100.  
  101. skip_line:
  102.         call    skip_until_newline
  103.         call    skip_newline
  104. .done:
  105.         ret
  106.  
  107. dec2bin:
  108.         mov     edx, 0
  109. .next_char:
  110.         movzx   eax, byte[rsi]
  111.         test    eax, eax
  112.         jz      .done
  113.         sub     eax, '0'
  114.         jb      .done
  115.         cmp     eax, 9
  116.         ja      .done
  117.         inc     rsi
  118.         imul    edx, 10
  119.         add     edx, eax
  120.         jmp     .next_char
  121. .done:
  122.         mov     eax, edx
  123.         ret
  124.  
  125. parse_option:
  126.         mov     rbx, config_options-3*8
  127. .try_next_option:
  128.         add     rbx, 3*8
  129.         mov     rdi, rsi
  130.         mov     rdx, [rbx]      ; option name
  131.         test    rdx, rdx
  132.         jz      .done
  133. .next_char:
  134.         cmp     byte[rdx], 0
  135.         jnz     @f
  136.         cmp     byte[rdi], '='
  137.         jz      .opt_name_ok
  138. @@:
  139.         cmp     byte[rdi], 0
  140.         jz      .done
  141.         movzx   eax, byte[rdi]
  142.         cmp     [rdx], al
  143.         jnz     .try_next_option
  144.         inc     rdi
  145.         inc     rdx
  146.         jmp     .next_char
  147. .opt_name_ok:
  148.         inc     rdi
  149.         mov     rsi, rdi
  150.         call    qword[rbx+8]
  151. .done:
  152.         ret
  153.  
  154. parse_line:
  155. .next_line:
  156.         cmp     byte[rsi], 0
  157.         jz      .done
  158.         cmp     byte[rsi], 0xd  ; '\r'
  159.         jz      .skip
  160.         cmp     byte[rsi], 0xa  ; '\n'
  161.         jz      .skip
  162.         cmp     byte[rsi], '#'
  163.         jz      .skip
  164.         call    parse_option
  165.         call    skip_line
  166.         jmp     .next_line
  167. .skip:
  168.         call    skip_line
  169.         jmp     .next_line
  170. .done:
  171.         ret
  172.  
  173. cfg_opt_func_resolution:
  174.         call    dec2bin
  175.         xor     edx, edx
  176.         mov     [rdx+BOOT_LO.x_res], ax
  177.         cmp     byte[rsi], 'x'
  178.         jz      @f
  179.         cmp     byte[rsi], '*'
  180.         jz      @f
  181.         jmp     .done
  182. @@:
  183.         inc     rsi
  184.         call    dec2bin
  185.         xor     edx, edx
  186.         mov     [rdx+BOOT_LO.y_res], ax
  187.         mov     [cfg_opt_used_resolution], 1
  188. .done:
  189.         ret
  190.  
  191. cfg_opt_func_acpi:
  192.         call    dec2bin
  193.         mov     [cfg_opt_used_acpi], 1
  194.         mov     [cfg_opt_value_acpi], al
  195.         ret
  196.  
  197. cfg_opt_func_debug_print:
  198.         call    dec2bin
  199.         mov     [cfg_opt_used_debug_print], 1
  200.         mov     [cfg_opt_value_debug_print], al
  201.         ret
  202.  
  203. cfg_opt_func_launcher_start:
  204.         call    dec2bin
  205.         mov     [cfg_opt_used_launcher_start], 1
  206.         mov     [cfg_opt_value_launcher_start], al
  207.         ret
  208.  
  209. cfg_opt_func_mtrr:
  210.         call    dec2bin
  211.         mov     [cfg_opt_used_mtrr], 1
  212.         mov     [cfg_opt_value_mtrr], al
  213.         ret
  214.  
  215. cfg_opt_func_ask_params:
  216.         call    dec2bin
  217.         mov     [cfg_opt_used_ask_params], 1
  218.         mov     [cfg_opt_value_ask_params], al
  219.         ret
  220.  
  221. cfg_opt_func_imgfrom:
  222.         call    dec2bin
  223.         mov     [cfg_opt_used_imgfrom], 1
  224.         mov     [cfg_opt_value_imgfrom], al
  225.         ret
  226.  
  227. cfg_opt_func_syspath:
  228.         mov     rdi, cfg_opt_value_syspath
  229. .next_char:
  230.         movzx   eax, byte[rsi]
  231.         cmp     al, 0xd ; \r
  232.         jz      .done
  233.         cmp     al, 0xa ; \n
  234.         jz      .done
  235.         inc     rsi
  236.         stosb
  237.         jmp     .next_char
  238. .done:
  239.         mov     byte[rdi], 0
  240.         ret
  241.  
  242. parse_config:
  243. virtual at rsp+8
  244.   .buffer      dq ?
  245. end virtual
  246. ;        mov     rsi, [.buffer]
  247.         mov     rsi, KERNEL_BASE
  248. .next_line:
  249.         call    parse_line
  250.         cmp     byte[rsi], 0
  251.         jnz     .next_line
  252.         ret     1*8
  253.  
  254. read_options_from_config:
  255.         eficall BootServices, HandleProtocol, qword[efi_handler], lipuuid, \
  256.                 lip_interface
  257.         cmp     eax, EFI_SUCCESS
  258.         jnz     .error
  259.         mov     rax, [lip_interface]
  260.  
  261.         eficall BootServices, HandleProtocol, \
  262.                 [rax+EFI_LOADED_IMAGE_PROTOCOL.DeviceHandle], sfspguid, \
  263.                 sfsp_interface
  264.         cmp     rax, EFI_SUCCESS
  265.         jnz     .error
  266.  
  267.         eficall [sfsp_interface], EFI_SIMPLE_FILE_SYSTEM_PROTOCOL.OpenVolume, \
  268.                 [sfsp_interface], esp_root
  269.         cmp     rax, EFI_SUCCESS
  270.         jnz     .error
  271.  
  272.         push    0 ; not fatal, i.e. it's ok to not find this file
  273.         push    FILE_BUFFER_SIZE
  274.         push    KERNEL_BASE
  275.         push    file_name
  276.         push    [esp_root]
  277.         call    load_file
  278.  
  279.         test    eax, eax
  280.         jz      @f
  281.         push    KERNEL_BASE
  282.         call    parse_config
  283. @@:
  284.  
  285. .error:
  286.         ret
  287.  
  288. find_vmode_index_by_resolution:
  289.         mov     [cfg_opt_used_resolution], 1
  290.         mov     [cfg_opt_value_vmode], 0
  291.   .next_mode:
  292.         movzx   eax, [cfg_opt_value_vmode]
  293.         eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, \
  294.                 [gop_interface], rax, gop_info_size, gop_info
  295.         cmp     rax, EFI_SUCCESS
  296.         jnz     .error
  297.         mov     rcx, [gop_info]
  298.         ; PixelBlueGreenRedReserved8BitPerColor
  299.         cmp     [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1
  300.         jnz     .skip_mode
  301.         xor     edx, edx
  302.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
  303.         cmp     ax, [rdx+BOOT_LO.x_res]
  304.         jnz     .skip_mode
  305.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
  306.         cmp     ax, [rdx+BOOT_LO.y_res]
  307.         jnz     .skip_mode
  308.         jmp     .done
  309.  .skip_mode:
  310.         inc     [cfg_opt_value_vmode]
  311.         movzx   eax, [cfg_opt_value_vmode]
  312.         mov     rcx, [gop_interface]
  313.         mov     rdx, [rcx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
  314.         cmp     eax, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode]
  315.         jnz     .next_mode
  316.         mov     [cfg_opt_used_resolution], 0
  317.         mov     [cfg_opt_value_ask_params], 1
  318. .error:
  319. .done:
  320.         ret
  321.  
  322. ask_for_params:
  323.         xor     ebx, ebx
  324.   .next_mode:
  325.         call    clearbuf
  326.         mov     eax, ebx
  327.         lea     rdi, [msg]
  328.         call    num2dec
  329.  
  330.         push    rbx
  331.         eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, \
  332.                 [gop_interface], rbx, gop_info_size, gop_info
  333.         cmp     rax, EFI_SUCCESS
  334.         jnz     .error
  335.         mov     rcx, [gop_info]
  336.         ; PixelBlueGreenRedReserved8BitPerColor
  337.         cmp     [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1
  338.         jnz     .skip
  339.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
  340.         lea     rdi, [msg+4*2]
  341.         call    num2dec
  342.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
  343.         lea     rdi, [msg+9*2]
  344.         call    num2dec
  345. ;        mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
  346. ;        lea     rdi, [msg+14*2]
  347. ;        call    num2dec
  348.   .skip:
  349.         eficall ConOut, OutputString, ConOut, msg
  350.         cmp     rax, EFI_SUCCESS
  351.         jnz     .error
  352.  
  353.         pop     rbx
  354.         inc     rbx
  355.         mov     rcx, [gop_interface]
  356.         mov     rdx, [rcx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
  357.         cmp     ebx, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode]
  358.         jnz     .next_mode
  359.  
  360.  
  361.         eficall ConIn, Reset, ConIn, 1
  362.         cmp     rax, EFI_SUCCESS
  363.         jnz     .error
  364.         xor     ecx, ecx
  365.     @@:
  366.         push    rcx
  367.         eficall ConIn, ReadKeyStroke, ConIn, msg
  368.         pop     rcx
  369.         mov     rdx, EFI_DEVICE_ERROR
  370.         cmp     rax, rdx
  371.         jz      .error
  372.         mov     rdx, EFI_NOT_READY
  373.         cmp     rax, rdx
  374.         jz      @b
  375. ;        cmp     rax, EFI_SUCCESS
  376.         movzx   eax, word[msg+2]
  377. ;jmp .key_done
  378.         cmp     al, 0x0D
  379.         jz      .key_done
  380.         imul    ecx, 10
  381.         sub     eax, '0'
  382.         add     ecx, eax
  383.         jmp     @b
  384.   .key_done:
  385.         mov     [cfg_opt_value_vmode], cl
  386. .error:
  387. .done:
  388.         ret
  389.  
  390. main:
  391.         sub     rsp, 0x38
  392.  
  393.         ; initialize UEFI library
  394.         InitializeLib
  395.         jc      .error
  396.  
  397. ;        eficall ConOut, Reset, ConOut, 1
  398. ;        cmp     rax, EFI_SUCCESS
  399. ;        jnz     .error
  400.  
  401.         eficall ConOut, ClearScreen, ConOut
  402.         cmp     rax, EFI_SUCCESS
  403.         jnz     .error
  404.  
  405.         call    read_options_from_config
  406.  
  407.         ; read kernel file
  408.         push    1
  409.         push    -1
  410.         push    KERNEL_BASE
  411.         push    kernel_name
  412.         push    [esp_root]
  413.         call    load_file
  414.  
  415.         ; read ramdisk image
  416.         push    1
  417.         push    -1
  418.         push    RAMDISK_BASE
  419.         push    ramdisk_name
  420.         push    [esp_root]
  421.         call    load_file
  422.  
  423.         ; alloc buffer for devices.dat
  424.         eficall BootServices, AllocatePages, EFI_ALLOCATE_MAX_ADDRESS, \
  425.                 EFI_RESERVED_MEMORY_TYPE, 1, devicesdat_data
  426.         cmp     eax, EFI_SUCCESS
  427.         jnz     .error
  428.  
  429.         ; read devices.dat
  430.         push    0 ; not fatal
  431.         push    [devicesdat_size]
  432.         push    [devicesdat_data]
  433.         push    devicesdat_name
  434.         push    [esp_root]
  435.         call    load_file
  436.         mov     [devicesdat_size], rax
  437.  
  438.         eficall BootServices, LocateHandle, 2, gopuuid, 0, gop_buffer_size, \
  439.                 gop_buffer
  440.         cmp     eax, EFI_SUCCESS
  441.         jnz     .error
  442.         mov     rsi, gop_buffer
  443.         lodsq
  444.         mov     [gop_handle], rax
  445.         eficall BootServices, HandleProtocol, qword[gop_handle], gopuuid, \
  446.                 gop_interface
  447.         cmp     eax, EFI_SUCCESS
  448.         jnz     .error
  449.  
  450.         mov     rbx, [efi_ptr]
  451.         mov     rdi, [rbx+EFI_SYSTEM_TABLE.ConfigurationTable]
  452.         mov     rcx, [rbx+EFI_SYSTEM_TABLE.NumberOfTableEntries]
  453.         mov     rax, 0x11d3e4f18868e871
  454.         mov     rdx, 0x81883cc7800022bc
  455.   .next_table:
  456.         dec     ecx
  457.         js      .all_tables_done
  458.         cmp     [rdi+0], rax
  459.         jnz     .not_acpi20
  460.         cmp     [rdi+8], rdx
  461.         jnz     .not_acpi20
  462.         mov     rax, [rdi+16]
  463.         mov     rdx, BOOT_LO.acpi_rsdp
  464.         mov     [rdx], eax
  465.         jmp     .all_tables_done
  466.   .not_acpi20:
  467.         add     rdi, 24
  468.         jmp     .next_table
  469.   .all_tables_done:
  470.  
  471.         cmp     [cfg_opt_used_resolution], 0
  472.         jz      .not_used_resolution
  473.         call    find_vmode_index_by_resolution
  474. .not_used_resolution:
  475.         cmp     [cfg_opt_used_debug_print], 0
  476.         jz      .not_used_debug_print
  477.         movzx   eax, [cfg_opt_value_debug_print]
  478.         xor     edx, edx
  479.         mov     [rdx+BOOT_LO.debug_print], al
  480. .not_used_debug_print:
  481.  
  482.         cmp     [cfg_opt_value_ask_params], 0
  483.         jz      @f
  484.         call    ask_for_params
  485. @@:
  486.  
  487.         movzx   ecx, [cfg_opt_value_vmode]
  488.         eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, \
  489.                 [gop_interface], rcx
  490.         cmp     eax, EFI_SUCCESS
  491.         jnz     .error
  492.  
  493.         mov     rcx, [gop_interface]
  494.         mov     rdx, [rcx+EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode]
  495.         mov     rdi, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase]
  496.         mov     [fb_base], rdi
  497.  
  498.  
  499.         mov     ebx, [rdx+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode]
  500.         eficall [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, \
  501.                 [gop_interface], rbx, gop_info_size, gop_info
  502.         cmp     rax, EFI_SUCCESS
  503.         jnz     .error
  504.         mov     rcx, [gop_info]
  505.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution]
  506.         xor     rdx, rdx
  507.         mov     [rdx+BOOT_LO.x_res], ax
  508.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution]
  509.         mov     [rdx+BOOT_LO.y_res], ax
  510.         mov     eax, [rcx+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine]
  511.         shl     eax, 2
  512.         mov     [rdx+BOOT_LO.pitch], ax
  513.  
  514.         mov     byte[rdx+BOOT_LO.pci_data+0], 1    ; PCI access mechanism
  515.         mov     byte[rdx+BOOT_LO.pci_data+1], 8    ; last bus, don't know how to count them
  516.         mov     byte[rdx+BOOT_LO.pci_data+2], 0x10 ; PCI version
  517.         mov     byte[rdx+BOOT_LO.pci_data+3], 0x02
  518.         mov     dword[rdx+BOOT_LO.pci_data+4], 0xe3
  519.  
  520.  
  521.         eficall BootServices, AllocatePages, EFI_ALLOCATE_ANY_PAGES, \
  522.                 EFI_RESERVED_MEMORY_TYPE, MEMORY_MAP_SIZE/0x1000, memory_map
  523.         cmp     eax, EFI_SUCCESS
  524.         jnz     .error
  525.  
  526.         eficall BootServices, GetMemoryMap, memory_map_size, [memory_map], \
  527.                 memory_map_key, descriptor_size, descriptor_ver
  528.         cmp     eax, EFI_SUCCESS
  529.         jnz     .error
  530.  
  531.         mov     rdi, BOOT_LO.memmap_block_cnt
  532.         mov     dword[rdi], 0
  533.         mov     rdi, BOOT_LO.memmap_blocks
  534.         mov     rax, [memory_map_size]
  535.         xor     edx, edx
  536.         mov     rcx, [descriptor_size]
  537.         div     ecx
  538.         mov     ecx, eax
  539.         mov     rsi, [memory_map]
  540.   .next_descr:
  541.         call    add_uefi_memmap
  542.         add     rsi, [descriptor_size]
  543.         add     rdi, sizeof.e820entry
  544.         dec     ecx
  545.         test    ecx, ecx
  546.         jnz     .next_descr
  547.  
  548.         ; kernel
  549. ;        eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
  550. ;                450000/0x1000, EFI_ALLOCATE_ADDRESS
  551.  
  552.         ; ramdisk
  553. ;        eficall BootServices, AllocatePages, EFI_RESERVED_MEMORY_TYPE, \
  554. ;                2880*512/0x1000, EFI_ALLOCATE_ADDRESS
  555.  
  556.         eficall BootServices, ExitBootServices, [efi_handler], [memory_map_key]
  557.         cmp     eax, EFI_SUCCESS
  558.         jnz     .error
  559.  
  560.  
  561.         cli
  562.  
  563.         xor     edx, edx
  564.         xor     esi, esi
  565.         mov     [esi+BOOT_LO.bpp], 32
  566.         mov     [esi+BOOT_LO.vesa_mode], dx
  567.         mov     [esi+BOOT_LO.bank_switch], edx
  568.         mov     rdi, [fb_base]
  569.         mov     [esi+BOOT_LO.lfb], edi
  570.  
  571.         movzx   eax, [cfg_opt_value_mtrr]
  572.         mov     [esi+BOOT_LO.mtrr], al
  573.  
  574.         movzx   eax, [cfg_opt_value_launcher_start]
  575.         mov     [esi+BOOT_LO.launcher_start], al
  576.  
  577.         movzx   eax, [cfg_opt_value_debug_print]
  578.         mov     [esi+BOOT_LO.debug_print], al
  579.  
  580.         mov     [esi+BOOT_LO.dma], dl
  581. ;        mov     qword[esi+BOOT_LO.pci_data], 0
  582.         mov     [esi+BOOT_LO.apm_entry], edx
  583.         mov     [esi+BOOT_LO.apm_version], dx
  584.         mov     [esi+BOOT_LO.apm_flags], dx
  585.         mov     [esi+BOOT_LO.apm_code_32], dx
  586.         mov     [esi+BOOT_LO.apm_code_16], dx
  587.         mov     [esi+BOOT_LO.apm_data_16], dx
  588.         mov     [esi+BOOT_LO.bios_hd_cnt], dl
  589.  
  590.         movzx   eax, [cfg_opt_value_imgfrom]
  591.         mov     [esi+BOOT_LO.rd_load_from], al
  592.  
  593.         mov     eax, dword[devicesdat_size]
  594.         mov     [rdx+BOOT_LO.devicesdat_size], eax
  595.         mov     eax, dword[devicesdat_data]
  596.         mov     [rdx+BOOT_LO.devicesdat_data], eax
  597.  
  598.         mov     rsi, cfg_opt_value_syspath
  599.         mov     rdi, BOOT_LO.syspath
  600.         mov     ecx, 0x17
  601.         rep movsb
  602.  
  603.         lgdt    [cs:GDTR]
  604.  
  605.         mov     ax, DATA_32_SELECTOR
  606.         mov     ds, ax
  607.         mov     es, ax
  608.         mov     fs, ax
  609.         mov     gs, ax
  610.         mov     ss, ax
  611.  
  612.         push    CODE_32_SELECTOR
  613.         lea     rax, [.next]
  614.         push    rax
  615. ;        push    .next
  616.         retf
  617. use32
  618. align 16
  619.   .next:
  620.         mov     eax, cr0
  621.         and     eax, not CR0_PG
  622.         mov     cr0, eax
  623.  
  624.         mov     ecx, MSR_AMD_EFER
  625.         rdmsr
  626.         btr     eax, 8                  ; LME
  627.         wrmsr
  628.  
  629.         mov     eax, cr4
  630.         and     eax, not CR4_PAE
  631.         mov     cr4, eax
  632.  
  633.         push    KERNEL_BASE
  634.         retn
  635.  
  636. use64
  637.   .error:
  638.         eficall ConOut, OutputString, ConOut, msg_error
  639.         jmp     .quit
  640.   .quit:
  641.         mov     rcx, -1
  642.         loop    $
  643.  
  644.  
  645. ; linux/arch/x86/platform/efi/efi.c
  646. ; do_add_efi_memmap
  647. add_uefi_memmap:
  648.         push    rax rbx rcx rdx rsi rdi
  649.  
  650.         mov     r10d, [rsi+0]
  651.         mov     r11, [rsi+8]
  652. ;        mov     r12, [rsi+16]
  653.         mov     r13, [rsi+24]
  654.         mov     r14, [rsi+32]
  655.  
  656.         mov     [rdi+e820entry.addr], r11
  657.         mov     rax, r13
  658.         shl     rax, 12
  659.         mov     [rdi+e820entry.size], rax
  660.  
  661.  
  662.         cmp     r10d, EFI_LOADER_CODE
  663.         jz      .case0
  664.         cmp     r10d, EFI_LOADER_DATA
  665.         jz      .case0
  666.         cmp     r10d, EFI_BOOT_SERVICES_CODE
  667.         jz      .case0
  668.         cmp     r10d, EFI_BOOT_SERVICES_DATA
  669.         jz      .case0
  670.         cmp     r10d, EFI_CONVENTIONAL_MEMORY
  671.         jz      .case0
  672.         cmp     r10d, EFI_ACPI_RECLAIM_MEMORY
  673.         jz      .case1
  674.         cmp     r10d, EFI_ACPI_MEMORY_NVS
  675.         jz      .case2
  676.         cmp     r10d, EFI_UNUSABLE_MEMORY
  677.         jz      .case3
  678.         cmp     r10d, EFI_PERSISTENT_MEMORY
  679.         jz      .case4
  680.         jmp     .default
  681.  
  682.   .case0:
  683.         test    r14, EFI_MEMORY_WB
  684.         jz      @f
  685.         mov     eax, E820_RAM
  686.         jmp     .done
  687.     @@:
  688.         mov     eax, E820_RESERVED
  689.         jmp     .done
  690.   .case1:
  691.         mov     eax, E820_ACPI
  692.         jmp     .done
  693.   .case2:
  694.         mov     eax, E820_NVS
  695.         jmp     .done
  696.   .case3:
  697.         mov     eax, E820_UNUSABLE
  698.         jmp     .done
  699.   .case4:
  700.         mov     eax, E820_PMEM
  701.         jmp     .done
  702.   .default:
  703.         mov     eax, E820_RESERVED
  704.         jmp     .done
  705.  
  706.   .done:
  707.         mov     [rdi+e820entry.type], eax
  708.  
  709.         mov     rax, BOOT_LO.memmap_block_cnt
  710.         inc     word[rax]
  711.  
  712.         pop     rdi rsi rdx rcx rbx rax
  713.         ret
  714.  
  715.  
  716. num2dec:
  717.         push    rax rbx rcx rdx rsi rdi
  718.  
  719.         xor     ecx, ecx
  720.         mov     ebx, 10
  721.   .next_digit:
  722.         xor     edx, edx
  723.         div     ebx
  724.         push    rdx
  725.         inc     ecx
  726.         test    eax, eax
  727.         jnz     .next_digit
  728.  
  729.   .next_char:
  730.         pop     rax
  731.         add     eax, '0'
  732.         stosw
  733.         loop    .next_char
  734.  
  735.         pop     rdi rsi rdx rcx rbx rax
  736.         ret
  737.  
  738.  
  739. num2hex:
  740.         push    rax rbx rcx rdx rsi rdi
  741.  
  742.         xchg    rdx, rax
  743.         mov     ecx, 16
  744.   .next_tetra:
  745.         rol     rdx, 4
  746.         movzx   eax, dl
  747.         and     eax, 0x0f
  748.         movzx   eax, byte[hex+eax]
  749.         stosw
  750.         loop    .next_tetra
  751.  
  752.         pop     rdi rsi rdx rcx rbx rax
  753.         ret
  754.  
  755. hex db '0123456789ABCDEF'
  756.  
  757. clearbuf:
  758.         push    rax rbx rcx rdx rsi rdi
  759.         mov     eax, 0x0020
  760.         mov     ecx, 79
  761.         mov     rdi, msg
  762.         rep stosw
  763.         pop     rdi rsi rdx rcx rbx rax
  764.         ret
  765.  
  766. section '.data' data readable writeable
  767.  
  768. GDTR:
  769.         dw 4*8-1
  770.         dq GDT
  771. GDT:
  772.         dw 0, 0, 0, 0
  773.         dw 0FFFFh,0,9A00h,0CFh          ; 32-bit code
  774.         dw 0FFFFh,0,9200h,0CFh          ; flat data
  775.         dw 0FFFFh,0,9A00h,0AFh          ; 64-bit code
  776.  
  777.  
  778. fb_base         dq 0
  779.  
  780. gopuuid         db EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID
  781. gop_buffer_size dq GOP_BUFFER_SIZE
  782. gop_handle      dq 0
  783. gop_interface   dq 0
  784. gop_info_size   dq 0
  785. gop_info        dq 0
  786.  
  787. lipuuid         db EFI_LOADED_IMAGE_PROTOCOL_GUID
  788. lip_buffer_size dq LIP_BUFFER_SIZE
  789. lip_handle      dq 0
  790. lip_interface   dq 0
  791.  
  792. sfspguid        db EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID
  793. sfsp_interface  dq 0
  794.  
  795. esp_root        dq ?
  796. file_handle     dq ?
  797. file_name       du '\EFI\BOOT\KOLIBRI.INI',0
  798. kernel_name     du '\EFI\BOOT\KOLIBRI.KRN',0
  799. ramdisk_name    du '\EFI\BOOT\KOLIBRI.IMG',0
  800. devicesdat_name du '\EFI\BOOT\DEVICES.DAT',0
  801. file_buffer_size dq FILE_BUFFER_SIZE-1  ; leave the last byte for \0
  802.  
  803. config_options  dq cfg_opt_name_resolution, cfg_opt_func_resolution, \
  804.                    cfg_opt_cmnt_resolution, \
  805.                    cfg_opt_name_acpi,  cfg_opt_func_acpi, cfg_opt_cmnt_acpi, \
  806.                    cfg_opt_name_debug_print, cfg_opt_func_debug_print, \
  807.                    cfg_opt_cmnt_debug_print, \
  808.                    cfg_opt_name_launcher_start, cfg_opt_func_launcher_start, \
  809.                    cfg_opt_cmnt_launcher_start, \
  810.                    cfg_opt_name_mtrr,  cfg_opt_func_mtrr, cfg_opt_cmnt_mtrr, \
  811.                    cfg_opt_name_ask_params,  cfg_opt_func_ask_params, \
  812.                    cfg_opt_cmnt_ask_params, \
  813.                    cfg_opt_name_imgfrom, cfg_opt_func_imgfrom, \
  814.                    cfg_opt_cmnt_imgfrom, \
  815.                    cfg_opt_name_syspath, cfg_opt_func_syspath, \
  816.                    cfg_opt_cmnt_syspath, \
  817.                    0
  818.  
  819. cfg_opt_name_resolution db 'resolution',0
  820. cfg_opt_name_acpi db 'acpi',0
  821. cfg_opt_name_debug_print db 'debug_print',0
  822. cfg_opt_name_launcher_start db 'launcher_start',0
  823. cfg_opt_name_mtrr db 'mtrr',0
  824. cfg_opt_name_ask_params db 'ask_params',0
  825. cfg_opt_name_imgfrom db 'imgfrom',0
  826. cfg_opt_name_syspath db 'syspath',0
  827.  
  828. cfg_opt_cmnt_resolution db "# Graphic mode",0
  829. cfg_opt_cmnt_acpi db "# ACPI settings",0xa, \
  830.                      "#   0: don't use",0xa, \
  831.                      "#   1: parse ACPI tables",0xa, \
  832.                      "#   2: + call _PIC method",0xa, \
  833.                      "#   3: + get APIC interrupts",0xa,0
  834. cfg_opt_cmnt_debug_print db "# Duplicate debug output to the screen",0
  835. cfg_opt_cmnt_launcher_start db "# Start LAUNCHER app after kernel is loaded",0
  836. cfg_opt_cmnt_mtrr db "# Configure MTRR's",0
  837. cfg_opt_cmnt_ask_params db "# Interrupt booting to ask the user for boot params",0
  838. cfg_opt_cmnt_imgfrom db "# Where to load ramdisk image from",0
  839. cfg_opt_cmnt_syspath db "# Path to /sys directory",0
  840.  
  841. cfg_opt_used_resolution db 0
  842. cfg_opt_used_acpi db 0
  843. cfg_opt_used_debug_print db 0
  844. cfg_opt_used_launcher_start db 0
  845. cfg_opt_used_mtrr db 0
  846. cfg_opt_used_ask_params db 0
  847. cfg_opt_used_imgfrom db 0
  848. cfg_opt_used_syspath db 0
  849.  
  850. cfg_opt_value_vmode db 0
  851. cfg_opt_value_acpi db 0
  852. cfg_opt_value_debug_print db 0
  853. cfg_opt_value_launcher_start db 1
  854. cfg_opt_value_mtrr db 0
  855. cfg_opt_value_ask_params db 1
  856. cfg_opt_value_imgfrom db RD_LOAD_FROM_MEMORY
  857. cfg_opt_value_syspath db '/RD/1',0
  858.                       rb 20
  859.  
  860. memory_map_key  dq 0
  861. descriptor_size dq 0
  862. descriptor_ver  dq 0
  863. memory_map_size dq MEMORY_MAP_SIZE
  864.  
  865. msg_success     du 'Success!',13,10,0
  866. msg_error       du 'Error!',13,10,0
  867. msg             du 79 dup ' ',13,10,0
  868. msg_error_open_file du "Error: can't open file ",0
  869.  
  870. efi_fs_info_id db EFI_FILE_SYSTEM_INFO_ID
  871. efi_fs_info_size dq sizeof.EFI_FILE_SYSTEM_INFO
  872. efi_fs_info EFI_FILE_SYSTEM_INFO
  873.  
  874. ;section '.bss' data readable writeable
  875.  
  876. memory_map      dq ?
  877. gop_buffer      rb GOP_BUFFER_SIZE
  878. lip_buffer      rb LIP_BUFFER_SIZE
  879. devicesdat_data dq 0xffffffff
  880. devicesdat_size dq 0x1000
  881.  
  882. section '.reloc' fixups data discardable
  883.