Finding both the PXENV+ and !PXE structs
This commit is contained in:
parent
87ab2b0295
commit
89bb0903fe
5 changed files with 105 additions and 10 deletions
1
Makefile
1
Makefile
|
|
@ -3,6 +3,7 @@
|
|||
OBJS=\
|
||||
src/nbp.o \
|
||||
src/bios.o \
|
||||
src/pxe.o \
|
||||
src/std.o \
|
||||
src/main.o \
|
||||
# end of object list
|
||||
|
|
|
|||
46
src/main.c
46
src/main.c
|
|
@ -115,22 +115,58 @@ pg_setup()
|
|||
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
|
||||
main()
|
||||
{
|
||||
//blank_screen(0x10);
|
||||
//move_cursor(0, 0);
|
||||
display_string(0x14, "Netboot via fernlader v2 ...\r\n");
|
||||
blank_screen(0x10);
|
||||
move_cursor(0, 0);
|
||||
//display_string(0x14, "Netboot via fernlader v2 ...\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);
|
||||
bootboot.size = 128;
|
||||
bootboot.protocol = PROTOCOL_MINIMAL | LOADER_BIOS;
|
||||
bootboot.numcores = 1;
|
||||
|
||||
display_string(0x0E, "init\r\n");
|
||||
//display_string(0x0E, "init\r\n");
|
||||
struct e820_entry *end = bios_getmap(memmap);
|
||||
display_string(0x0E, "karlos\r\n");
|
||||
//display_string(0x0E, "karlos\r\n");
|
||||
for (int i = 0; ; i++) {
|
||||
if (&memmap[i] >= end) break;
|
||||
char buf[2];
|
||||
|
|
|
|||
29
src/nbp.S
29
src/nbp.S
|
|
@ -9,14 +9,31 @@
|
|||
// _start: entry point
|
||||
_start: cli
|
||||
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
|
||||
xor %ax, %ax
|
||||
mov %ax, %ds
|
||||
mov %ax, %es
|
||||
|
||||
mov %ss, %ax
|
||||
mov %ax, real_ss
|
||||
|
||||
// initialize our own BSS section
|
||||
mov $_bss_start, %di
|
||||
mov $_bss_end, %cx
|
||||
|
|
@ -45,6 +62,12 @@ prot_enter: lgdt GDT_PTR
|
|||
|
||||
.data
|
||||
|
||||
.global PXENV
|
||||
PXENV: .long 0
|
||||
|
||||
.global exPXE
|
||||
exPXE: .long 0
|
||||
|
||||
.global real_ss
|
||||
real_ss: .word 0
|
||||
|
||||
|
|
|
|||
24
src/pxe.S
Normal file
24
src/pxe.S
Normal 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
|
||||
13
src/std.c
13
src/std.c
|
|
@ -7,10 +7,21 @@ memcpy(void *dst, const void *src, size_t n)
|
|||
__asm__ ("rep movsb"
|
||||
: "+D"(di), "+S"(src), "+c"(n)
|
||||
:
|
||||
: "memory");
|
||||
: "cc", "memory");
|
||||
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
|
||||
strlen(const char *s)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue