Finding both the PXENV+ and !PXE structs

This commit is contained in:
Thomas Oltmann 2026-02-28 15:57:51 +01:00
parent 87ab2b0295
commit 89bb0903fe
5 changed files with 105 additions and 10 deletions

View file

@ -3,6 +3,7 @@
OBJS=\ OBJS=\
src/nbp.o \ src/nbp.o \
src/bios.o \ src/bios.o \
src/pxe.o \
src/std.o \ src/std.o \
src/main.o \ src/main.o \
# end of object list # end of object list

View file

@ -115,22 +115,58 @@ pg_setup()
return cr3; return cr3;
} }
struct PXENV {
uint8_t signature[6];
uint16_t version;
uint8_t length;
uint8_t checksum;
uint32_t rmentry;
uint32_t pmoffset;
};
struct exPXE {
uint8_t signature[4];
uint8_t length;
uint8_t checksum;
uint8_t revision;
uint8_t reserved;
uint32_t undiromid;
uint32_t bcromid;
uint32_t rmentry;
uint32_t pmentry;
};
//extern uint32_t pxe_call(uint16_t func, offset, segment);
extern struct PXENV *PXENV;
extern struct exPXE *exPXE;
void void
main() main()
{ {
//blank_screen(0x10); blank_screen(0x10);
//move_cursor(0, 0); move_cursor(0, 0);
display_string(0x14, "Netboot via fernlader v2 ...\r\n"); //display_string(0x14, "Netboot via fernlader v2 ...\r\n");
bios_write("Going well ...\r\n"); bios_write("Going well ...\r\n");
if (memcmp(PXENV->signature, "PXENV+", 6) != 0) {
bios_write("missing PXENV+ signature\r\n");
}
if (PXENV->version >= 0x0201) {
bios_write("!PXE version\r\n");
if (memcmp(exPXE->signature, "!PXE", 4) != 0) {
bios_write("missing !PXE signature\r\n");
}
}
memcpy(bootboot.magic, BOOTBOOT_MAGIC, sizeof bootboot.magic); memcpy(bootboot.magic, BOOTBOOT_MAGIC, sizeof bootboot.magic);
bootboot.size = 128; bootboot.size = 128;
bootboot.protocol = PROTOCOL_MINIMAL | LOADER_BIOS; bootboot.protocol = PROTOCOL_MINIMAL | LOADER_BIOS;
bootboot.numcores = 1; bootboot.numcores = 1;
display_string(0x0E, "init\r\n"); //display_string(0x0E, "init\r\n");
struct e820_entry *end = bios_getmap(memmap); struct e820_entry *end = bios_getmap(memmap);
display_string(0x0E, "karlos\r\n"); //display_string(0x0E, "karlos\r\n");
for (int i = 0; ; i++) { for (int i = 0; ; i++) {
if (&memmap[i] >= end) break; if (&memmap[i] >= end) break;
char buf[2]; char buf[2];

View file

@ -9,14 +9,31 @@
// _start: entry point // _start: entry point
_start: cli _start: cli
cld cld
mov %ss, %ax
mov %ax, %cs:real_ss
xor %eax, %eax
mov %es, %ax
shl $4, %eax
movzwl %bx, %ebx
add %eax, %ebx
mov %ebx, %cs:PXENV
xor %eax, %eax
xor %ebx, %ebx
mov %sp, %bx
mov %ss:6(%bx), %ax
mov %ss:4(%bx), %bx
shl $4, %eax
add %eax, %ebx
mov %ebx, %cs:exPXE
mov %sp, %bp mov %sp, %bp
xor %ax, %ax xor %ax, %ax
mov %ax, %ds mov %ax, %ds
mov %ax, %es mov %ax, %es
mov %ss, %ax
mov %ax, real_ss
// initialize our own BSS section // initialize our own BSS section
mov $_bss_start, %di mov $_bss_start, %di
mov $_bss_end, %cx mov $_bss_end, %cx
@ -45,6 +62,12 @@ prot_enter: lgdt GDT_PTR
.data .data
.global PXENV
PXENV: .long 0
.global exPXE
exPXE: .long 0
.global real_ss .global real_ss
real_ss: .word 0 real_ss: .word 0

24
src/pxe.S Normal file
View file

@ -0,0 +1,24 @@
// vim: ft=gas:et:sw=12:ts=12:sts=12
.include "src/mode.S"
.data
pxe_entry: .word 0
.text
.global pxe_call
.code32
pxe_call: push %ebp
mov %esp, %ebp
PROT16
call (pxe_entry)
push %eax
PROT32
pop %eax
leave
ret

View file

@ -7,10 +7,21 @@ memcpy(void *dst, const void *src, size_t n)
__asm__ ("rep movsb" __asm__ ("rep movsb"
: "+D"(di), "+S"(src), "+c"(n) : "+D"(di), "+S"(src), "+c"(n)
: :
: "memory"); : "cc", "memory");
return dst; return dst;
} }
int
memcmp(const void *src1, const void *src2, size_t n)
{
__asm__ ("repe cmpsb"
: "+D"(src2), "+S"(src1), "+c"(n)
:
: "cc", "memory");
if (n == 0) return 0;
return src1 < src2 ? -1 : 1;
}
size_t size_t
strlen(const char *s) strlen(const char *s)
{ {