Skip to content

Commit 7aa4d88

Browse files
BOOTX64.EFI agrandado hasta 8KiB y print implementada.
1 parent 0750eea commit 7aa4d88

File tree

4 files changed

+180
-24
lines changed

4 files changed

+180
-24
lines changed

Makefile

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
ASM = nasm
22
#BMFS_MBR = bmfs_mbr.sys
33
#PXESTART = pxestart.sys
4-
BOOTLOADER = bootloader.sys
54
UEFI = uefi.sys
5+
BOOTLOADER = bootloader.sys
66

77
#all: bmfs_mbr.sys pxestart.sys bootloader.sys
8-
all: bootloader.sys uefi.sys
8+
all: uefi.sys bootloader.sys
99

1010
#$(BMFS_MBR):
1111
# $(ASM) src/bootsectors/bmfs_mbr.asm -o $(BMFS_MBR)
1212

1313
#$(PXESTART):
1414
# $(ASM) src/bootsectors/pxestart.asm -o $(PXESTART)
1515

16-
$(BOOTLOADER):
17-
cd asm; $(ASM) bootloader.asm -o ./../build/$(BOOTLOADER)
18-
19-
$(UEFI):
16+
$(UEFI): build
2017
cd ./asm/boot; nasm uefi.asm -o ./../../build/uefi.sys
2118
cd ./asm/boot; ld -g --oformat elf64-x86-64 --entry 0x400000 ./../../build/uefi.sys -o ./../../build/uefi.elf
2219

20+
$(BOOTLOADER): $(UEFI)
21+
cd asm; $(ASM) bootloader.asm -o ./../build/$(BOOTLOADER)
22+
23+
build:
24+
mkdir build
25+
2326
clean:
24-
rm -rf *.sys
27+
rm -rf build
2528

2629
.PHONY: all clean

asm/boot/uefi.asm

Lines changed: 170 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@
1414
;; luego de agregado el payload queda:
1515
;; +--------------------------+-------------------------+------------+
1616
;; | 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 |
1919
;; +---------+--------+-------+------------+------------+------------+
2020
;; |^ |^ |^ |^ |^ |^ ^|
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+
2324
;;==============================================================================
2425

2526

@@ -226,15 +227,25 @@ EntryPoint: ;; Ubicado en 0x400200 cuando imagen va en 0x400000
226227
call [rcx + EFI_OUT_CLEAR_SCREEN]
227228

228229
;; -- 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.
231232
;; -- Aqui, hlt unicamente no va a haltear. Debe hacer cli, luego hlt.
232233

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.
237241

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.
238249

239250

240251

@@ -317,7 +328,6 @@ nextentry:
317328
lodsq ; Load the address of the ACPI table
318329
mov [ACPI], rax ; Save the address
319330

320-
321331
;; Configurar pantalla. Algunas definiciones:
322332
;; https://www.intel.com/content/dam/doc/guide/uefi-driver-graphics-controll
323333
;; er-guide.pdf
@@ -764,12 +774,13 @@ get_memmap:
764774
jne get_memmap ; Get mem map, then try to exit again.
765775
cli ;; Ya afuera.
766776

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
768778
;; rmamos imagen se deberia revisar que no sea mayor. Un posible payload es
769779
;; uefiBootloader.sys + kernel.bin + modulosUserland.bin
770780
mov rsi, PAYLOAD
771781
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
773784
rep movsb ;; Ultimo byte escrito = 0x8000 + (60 * 1024) - 1
774785

775786
;; Esta info de video la pasamos a la siguiente etapa de bootloader.
@@ -898,6 +909,81 @@ printhex_loop:
898909
;; -----------------------------------------------------------------------------
899910

900911

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+
901987

902988
;;==============================================================================
903989
;; Parada en el modo step.
@@ -931,12 +1017,68 @@ parada_step_mode:
9311017
ret
9321018

9331019

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+
9341076
;;==============================================================================
9351077
;; num2strWord - convierte un entero en un string null terminated
9361078
;;==============================================================================
9371079
;; Argumentos:
9381080
;; -- 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)
9401082
;; Retorno:
9411083
;; -- los caracteres ASCII (1 char = word) en rbx puntero al comienzo dentro del
9421084
;; placeholder
@@ -983,7 +1125,7 @@ num2strWord:
9831125
mov rsp, rbp
9841126
pop rbp
9851127
ret
986-
1128+
9871129
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9881130

9891131
times 3 * 1024 - ($ - $$) db 0
@@ -1079,8 +1221,19 @@ msg_step_mode: dw utf16("Step mode"), 13, 0xA, 0
10791221
msg_efi_input_device_err: dw utf16("Input device hw error"), 13, 0xA, 0
10801222
msg_efi_success: dw utf16("EFI success"), 13, 0xA, 0
10811223
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+
10821234

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.
10841237
PAYLOAD:
10851238

10861239
;; Esto cambiarlo por 256K para mas payload.
@@ -1184,7 +1337,7 @@ EFI_OUT_SET_ATTRIBUTE equ 40
11841337
EFI_OUT_CLEAR_SCREEN equ 48
11851338
EFI_OUT_SET_CURSOR_POSITION equ 56
11861339
EFI_OUT_ENABLE_CURSOR equ 64
1187-
EFI_OUT_MODE equ 70
1340+
EFI_OUT_MODE equ 72
11881341

11891342
EFI_BOOT_SERVICES_GETMEMORYMAP equ 56
11901343
EFI_BOOT_SERVICES_LOCATEHANDLE equ 176

build/uefi.elf

0 Bytes
Binary file not shown.

build/uefi.sys

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)