|
14 | 14 | ;; luego de agregado el payload queda: |
15 | 15 | ;; +--------------------------+-------------------------+------------+ |
16 | 16 | ;; | binario BOOTX64.EFI | payload | padeo de | |
17 | | -;; | | | | UEFI | packed | 0x00 hasta | |
18 | | -;; | Encabez | Codigo | Datos | bootloader | Kernel.bin | el fin | |
| 17 | +;; | | | | bootloader | packed | 0x00 hasta | |
| 18 | +;; | Encabez | Codigo | Datos | | Kernel.bin | el fin | |
19 | 19 | ;; +---------+--------+-------+------------+------------+------------+ |
20 | 20 | ;; |^ |^ |^ |^ |^ |^ ^| |
21 | | -;; 0x0 0x200 0xC00 0x1000 0x2800 0x40000 0xFFFFF |
22 | | -;; 0 512B 3KiB 4KiB 10KiB 256KiB 1MiB-1 |
| 21 | +;; 0x0 0x200 0xC00 0x2000 0x2800 0x40000 0xFFFFF |
| 22 | +;; 0 512B 3KiB 8KiB 10KiB 256KiB 1MiB-1 |
| 23 | + |
23 | 24 | ;;============================================================================== |
24 | 25 |
|
25 | 26 |
|
@@ -226,15 +227,25 @@ EntryPoint: ;; Ubicado en 0x400200 cuando imagen va en 0x400000 |
226 | 227 | call [rcx + EFI_OUT_CLEAR_SCREEN] |
227 | 228 |
|
228 | 229 | ;; -- Modo texto de uefi, imprime en un recuadro centrado en la pantalla ind |
229 | | - ;; ependientemente de la resolucion real. Por defecto 80x25 pero si hay otro |
230 | | - ;; modo soportado lo usa. |
| 230 | + ;; ependientemente de la resolucion real. Por defecto 80x25 (mode = 0) pero |
| 231 | + ;; si hay otro modo soportado lo usa. |
231 | 232 | ;; -- Aqui, hlt unicamente no va a haltear. Debe hacer cli, luego hlt. |
232 | 233 |
|
233 | | -;; Hacer query del modo texto usado e imprimirlo. |
234 | | -;; SIMPLE_TEXT_OUTPUT.QueryMode() |
235 | | - |
236 | | - |
| 234 | + mov rcx, [TXT_OUT_INTERFACE] |
| 235 | + mov rbx, [rcx + EFI_OUT_MODE] |
| 236 | + mov rax, [rbx] |
| 237 | + mov rbx, 0 |
| 238 | + mov ebx, eax |
| 239 | + mov rdx, msg_max_txt_mode |
| 240 | + call print ;; Current video settings del modo texto con el q inicia. |
237 | 241 |
|
| 242 | + mov rcx, [TXT_OUT_INTERFACE] |
| 243 | + mov rbx, [rcx + EFI_OUT_MODE] |
| 244 | + mov rax, [rbx + 4] |
| 245 | + mov rbx, 0 |
| 246 | + mov ebx, eax |
| 247 | + mov rdx, msg_curr_txt_mode |
| 248 | + call print ;; Current video settings del modo texto con el q inicia. |
238 | 249 |
|
239 | 250 |
|
240 | 251 |
|
@@ -317,7 +328,6 @@ nextentry: |
317 | 328 | lodsq ; Load the address of the ACPI table |
318 | 329 | mov [ACPI], rax ; Save the address |
319 | 330 |
|
320 | | - |
321 | 331 | ;; Configurar pantalla. Algunas definiciones: |
322 | 332 | ;; https://www.intel.com/content/dam/doc/guide/uefi-driver-graphics-controll |
323 | 333 | ;; er-guide.pdf |
@@ -764,12 +774,13 @@ get_memmap: |
764 | 774 | jne get_memmap ; Get mem map, then try to exit again. |
765 | 775 | cli ;; Ya afuera. |
766 | 776 |
|
767 | | - ;; Payload al destino. Aqui se estableve el maximo tamano y por eso cuando a |
| 777 | + ;; Payload al destino. Aqui se establece el maximo tamano y por eso cuando a |
768 | 778 | ;; rmamos imagen se deberia revisar que no sea mayor. Un posible payload es |
769 | 779 | ;; uefiBootloader.sys + kernel.bin + modulosUserland.bin |
770 | 780 | mov rsi, PAYLOAD |
771 | 781 | mov rdi, 0x8000 |
772 | | - mov rcx, (60 * 1024) ;; 60KiB a partir de 0x8000 |
| 782 | +;;;;;;;;;;;;;;;;;;;;;;;; mov rcx, (60 * 1024) ;; 60KiB a partir de 0x8000 |
| 783 | + mov rcx, (256 * 1024) ;; 256KiB a partir de 0x8000 |
773 | 784 | rep movsb ;; Ultimo byte escrito = 0x8000 + (60 * 1024) - 1 |
774 | 785 |
|
775 | 786 | ;; Esta info de video la pasamos a la siguiente etapa de bootloader. |
@@ -898,6 +909,81 @@ printhex_loop: |
898 | 909 | ;; ----------------------------------------------------------------------------- |
899 | 910 |
|
900 | 911 |
|
| 912 | +;;============================================================================== |
| 913 | +;; print - impresion con cadena de formato (unicamente 1 solo %: %d, %h, %c) |
| 914 | +;;============================================================================== |
| 915 | +;; Argumentos: |
| 916 | +;; -- rdx = cadena fmt |
| 917 | +;; -- rbx = 2do argumento en caso de haber %. |
| 918 | +;; El comportamiento si la cadena de fmt tiene % y no d, h, o c a continuacion e |
| 919 | +;; s que ignora el % y continua imprimiendo. Si tiene muchos % siempre va a usar |
| 920 | +;; el mismo argumento para la conversion (el unico que recibe en rbx). |
| 921 | +;;============================================================================== |
| 922 | + |
| 923 | +print: |
| 924 | + |
| 925 | +push rbp |
| 926 | +mov rbp, rsp |
| 927 | + |
| 928 | + mov rcx, 0 ;; Ix fmt. |
| 929 | + mov rdi, 0 ;; Ix placeholder. |
| 930 | + |
| 931 | +parse: |
| 932 | + cmp word [rdx + 2 * rcx], 0x0000 |
| 933 | + je .end_placeholder |
| 934 | + cmp word [rdx + 2 * rcx], utf16('%') |
| 935 | + jne .copyChar |
| 936 | + inc rcx |
| 937 | + |
| 938 | + cmp word [rdx + 2 * rcx], utf16('d') |
| 939 | + je .integer |
| 940 | + cmp word [rdx + 2 * rcx], utf16('h') |
| 941 | + je .hexadecimal |
| 942 | + cmp word [rdx + 2 * rcx], utf16('c') |
| 943 | + je .character |
| 944 | + jmp parse |
| 945 | + |
| 946 | +.integer: |
| 947 | + |
| 948 | + lea rax, [print_placeholder + 2 * rdi] |
| 949 | + push rax |
| 950 | + push rbx |
| 951 | + call num2strWord2 |
| 952 | + add rsp, 8 * 2 |
| 953 | + add rdi, rax |
| 954 | + inc rcx |
| 955 | + jmp parse |
| 956 | +.hexadecimal: |
| 957 | + |
| 958 | + inc rcx |
| 959 | + jmp parse |
| 960 | + |
| 961 | +.character: |
| 962 | + |
| 963 | + inc rcx |
| 964 | + jmp parse |
| 965 | + |
| 966 | +.copyChar: |
| 967 | + ;;push word [rdx + 2 * rcx] |
| 968 | + ;;pop word [print_placeholder + 2 * rdi] |
| 969 | + mov ax, [rdx + 2 * rcx] |
| 970 | + mov [print_placeholder + 2 * rdi], ax |
| 971 | + inc rcx |
| 972 | + inc rdi |
| 973 | + jmp parse |
| 974 | + |
| 975 | +.end_placeholder: |
| 976 | + mov word [print_placeholder + 2 * rdi], 0x0000 |
| 977 | + mov rdx, print_placeholder |
| 978 | + mov rcx, [TXT_OUT_INTERFACE] |
| 979 | + call [rcx + EFI_OUT_OUTPUTSTRING] |
| 980 | + |
| 981 | + mov rsp, rbp |
| 982 | + pop rbp |
| 983 | + ret |
| 984 | + |
| 985 | + |
| 986 | + |
901 | 987 |
|
902 | 988 | ;;============================================================================== |
903 | 989 | ;; Parada en el modo step. |
@@ -931,12 +1017,68 @@ parada_step_mode: |
931 | 1017 | ret |
932 | 1018 |
|
933 | 1019 |
|
| 1020 | + |
| 1021 | +;;============================================================================== |
| 1022 | +;; num2strWord2 - convierte un entero en un string no null terminated |
| 1023 | +;;============================================================================== |
| 1024 | +;; Argumentos: |
| 1025 | +;; -- placeholder por stack, 1er push. |
| 1026 | +;; -- el numero entero de 64 bit a convertir, pasado por stack (2do push) |
| 1027 | +;; Retorno: |
| 1028 | +;; -- rax = cantidad de caracteres escritos. |
| 1029 | +;; Altera unicamente rax, restantes registros los devuelve como los recibe. |
| 1030 | +;;============================================================================== |
| 1031 | + |
| 1032 | +num2strWord2: |
| 1033 | + push rbp |
| 1034 | + mov rbp, rsp |
| 1035 | + |
| 1036 | + push rcx |
| 1037 | + push rdx |
| 1038 | + |
| 1039 | +division_init: |
| 1040 | + mov rcx, 10 |
| 1041 | + mov rdx, 0 ;; En cero la parte mas significativa del acum. |
| 1042 | + mov rax, [rbp + 8 * 2] ;; Numero a convertir. |
| 1043 | + push word 0 ;; Marca para dejar de popear durante write. |
| 1044 | + |
| 1045 | +.division: |
| 1046 | + div ecx |
| 1047 | + or dl, 0x30 ;; Convierto el resto menor a 10 a ASCII. |
| 1048 | + push dx |
| 1049 | + cmp eax, 0 |
| 1050 | + jz .write_init |
| 1051 | + mov rdx, 0 |
| 1052 | + jmp .division |
| 1053 | + |
| 1054 | +.write_init: |
| 1055 | + mov rax, 0 ;; Contara chars copiados para valor de retorno. |
| 1056 | + mov rcx, [rbp + 8 * 3] ;; Placeholder. |
| 1057 | + |
| 1058 | +.write: |
| 1059 | + cmp word [rsp], 0 |
| 1060 | + je .end |
| 1061 | + pop word [rcx + 2 * rax] |
| 1062 | + inc rax |
| 1063 | + jmp .write |
| 1064 | + |
| 1065 | +.end: |
| 1066 | + add rsp, 2 ;; El cero que marcaba fin, elimino para popear regs. |
| 1067 | + pop rdx |
| 1068 | + pop rcx |
| 1069 | + |
| 1070 | + mov rsp, rbp |
| 1071 | + pop rbp |
| 1072 | + ret |
| 1073 | + |
| 1074 | + |
| 1075 | + |
934 | 1076 | ;;============================================================================== |
935 | 1077 | ;; num2strWord - convierte un entero en un string null terminated |
936 | 1078 | ;;============================================================================== |
937 | 1079 | ;; Argumentos: |
938 | 1080 | ;; -- placeholder por stack, 1er push. |
939 | | -;; -- el numero entero de 32 bit a convertir, pasado por stack (2so push) |
| 1081 | +;; -- el numero entero de 64 bit a convertir, pasado por stack (2do push) |
940 | 1082 | ;; Retorno: |
941 | 1083 | ;; -- los caracteres ASCII (1 char = word) en rbx puntero al comienzo dentro del |
942 | 1084 | ;; placeholder |
@@ -983,7 +1125,7 @@ num2strWord: |
983 | 1125 | mov rsp, rbp |
984 | 1126 | pop rbp |
985 | 1127 | ret |
986 | | - |
| 1128 | + |
987 | 1129 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
988 | 1130 |
|
989 | 1131 | times 3 * 1024 - ($ - $$) db 0 |
@@ -1079,8 +1221,19 @@ msg_step_mode: dw utf16("Step mode"), 13, 0xA, 0 |
1079 | 1221 | msg_efi_input_device_err: dw utf16("Input device hw error"), 13, 0xA, 0 |
1080 | 1222 | msg_efi_success: dw utf16("EFI success"), 13, 0xA, 0 |
1081 | 1223 | msg_efi_not_ready: dw utf16("EFI not ready"), 13, 0xA, 0 |
| 1224 | +msg_max_txt_mode: dw utf16("Max txt mode = %d"), 0 |
| 1225 | +msg_curr_txt_mode: dw utf16(" | Curr mode = %d"), 13, 0xA, 0 |
| 1226 | + |
| 1227 | +print_placeholder: |
| 1228 | +times 32 dw 0x0000 |
| 1229 | + |
| 1230 | +times 8 * 1024 - ($ - $$) db 0 |
| 1231 | +DATA_RUNTIME_END: |
| 1232 | + |
| 1233 | + |
1082 | 1234 |
|
1083 | | -align 4096 ;; Codigo util de BOOT64.EFI ocupa primeros 4K. Luego, la payload. |
| 1235 | +;;;;;;;;;;;;;;;;;;;;;;align 4096 ;; Codigo util de BOOT64.EFI ocupa primeros 4K. Luego, la payload. |
| 1236 | +align 8 * 1024 ;; Codigo + data de BOOT64.EFI ocupa primeros 8K. Luego, la payload. |
1084 | 1237 | PAYLOAD: |
1085 | 1238 |
|
1086 | 1239 | ;; Esto cambiarlo por 256K para mas payload. |
@@ -1184,7 +1337,7 @@ EFI_OUT_SET_ATTRIBUTE equ 40 |
1184 | 1337 | EFI_OUT_CLEAR_SCREEN equ 48 |
1185 | 1338 | EFI_OUT_SET_CURSOR_POSITION equ 56 |
1186 | 1339 | EFI_OUT_ENABLE_CURSOR equ 64 |
1187 | | -EFI_OUT_MODE equ 70 |
| 1340 | +EFI_OUT_MODE equ 72 |
1188 | 1341 |
|
1189 | 1342 | EFI_BOOT_SERVICES_GETMEMORYMAP equ 56 |
1190 | 1343 | EFI_BOOT_SERVICES_LOCATEHANDLE equ 176 |
|
0 commit comments