Opening a TFTP file stream

This commit is contained in:
Thomas Oltmann 2025-07-07 02:10:02 +02:00
parent 04f6352b77
commit 94919ad0c7
2 changed files with 99 additions and 3 deletions

1
fernlader.cfg Normal file
View file

@ -0,0 +1 @@
kernel=sys/core

97
lboot.S
View file

@ -4,9 +4,22 @@
.text .text
.code16 .code16
.macro pxe_call, opcode
mov %sp, %bx
push %ss
push %bx
push $\opcode
lcall *pxe_api
add $6, %sp
mov %sp, %bx
or %ss:(%bx), %ax
jnz _pcerr
.endm
// _start: entry point // _start: entry point
_start: cli _start: cli
cld cld
mov %sp, %bp
// we keep our text and data close to each other // we keep our text and data close to each other
xor %ax, %ax xor %ax, %ax
@ -17,6 +30,18 @@ _start: cli
mov $msg_start, %si mov $msg_start, %si
call print call print
mov %ss:4(%bp), %si
mov %ss:6(%bp), %ax
mov %ax, %es
.set PXE_MAGIC, 0x45585021
cmpl $PXE_MAGIC, %es:(%si)
je 1f
mov $msg_pserr, %si
call print
jmp hang
1: mov %es:16(%si), %eax
mov %eax, pxe_api
mov $msg_a20, %si mov $msg_a20, %si
call print call print
call enable_a20 call enable_a20
@ -37,6 +62,22 @@ _start: cli
call print call print
call paging call paging
.set PXE_GET_CACHED_INFO, 0x0071
push $0
push %cs
push $tx_buf
push $1024
push $2
push $0
pxe_call PXE_GET_CACHED_INFO
add $12, %sp
mov tx_buf+20, %eax
mov %eax, server_ip
mov $msg_read, %si
call print
call read_file
mov $msg_long, %si mov $msg_long, %si
call print call print
call long call long
@ -211,6 +252,39 @@ _aerr: mov $msg_aerr, %si
call print call print
jmp hang jmp hang
read_file:
.set PXE_TFTP_OPEN, 0x0020
push $1024
push $0x4500
sub $128, %sp
mov $fn_config, %esi
mov %ss, %ax
mov %ax, %es
mov %esp, %edi
mov $fn_config_l, %ecx
rep movsb
push $0
push $0
sub $4, %sp
mov %sp, %di
mov server_ip+0, %al
mov %al, %ss:0(%di)
mov server_ip+1, %al
mov %al, %ss:1(%di)
mov server_ip+2, %al
mov %al, %ss:2(%di)
mov server_ip+3, %al
mov %al, %ss:3(%di)
push $0
pxe_call PXE_TFTP_OPEN
add $14+128, %sp
ret
// print: print NUL-terminated string pointed to by SI // print: print NUL-terminated string pointed to by SI
print: xor %bx, %bx print: xor %bx, %bx
@ -269,6 +343,10 @@ long:
hang: hlt hang: hlt
jmp hang jmp hang
_pcerr: mov $msg_pcerr, %si
call print
jmp hang
// gdt16: Protected mode / Unreal mode 16-bit GDT // gdt16: Protected mode / Unreal mode 16-bit GDT
gdt16: // entry 0: null descriptor gdt16: // entry 0: null descriptor
.word 0 .word 0
@ -323,9 +401,18 @@ msg_unreal: .asciz " * Unreal Mode\r\n"
msg_getmap: .asciz " * Memory Map\r\n" msg_getmap: .asciz " * Memory Map\r\n"
msg_mkheap: .asciz " * Making Space\r\n" msg_mkheap: .asciz " * Making Space\r\n"
msg_paging: .asciz " * Paging\r\n" msg_paging: .asciz " * Paging\r\n"
msg_read: .asciz " * Retrieving\r\n"
msg_long: .asciz " * Long Mode\r\n" msg_long: .asciz " * Long Mode\r\n"
msg_pserr: .asciz "panic: Missing !PXE structure.\r\n"
msg_pcerr: .asciz "panic: PXE call failed.\r\n"
msg_aerr: .asciz "panic: Out of heap space.\r\n" msg_aerr: .asciz "panic: Out of heap space.\r\n"
fn_config: .asciz "fernlader.cfg"
.set fn_config_l, .-fn_config
pxe_api: .long 0
server_ip: .space 4
heap_start: .long 0 heap_start: .long 0
heap_size: .long 0 heap_size: .long 0
@ -337,6 +424,8 @@ pml4_ptr: .long 0
// Points to the end of the memory map // Points to the end of the memory map
memmap_end: .word 0 memmap_end: .word 0
tx_buf: .space 1024
.code64 .code64
// trampo64: Trampoline function to load long-mode segments // trampo64: Trampoline function to load long-mode segments
// before entering the loader. // before entering the loader.
@ -346,5 +435,11 @@ trampo64:
mov %eax, %es mov %eax, %es
mov %eax, %fs mov %eax, %fs
mov %eax, %gs mov %eax, %gs
mov %eax, %ss // FIXME why does this crash? mov %eax, %ss
jmp loader_main jmp loader_main
// ToDo List:
// - Sorting the memmap
// - Sanitizing the memmap
// - Translating the memmap to bootboot format
// - Parsing a config file