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=\
|
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
|
||||||
|
|
|
||||||
46
src/main.c
46
src/main.c
|
|
@ -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];
|
||||||
|
|
|
||||||
29
src/nbp.S
29
src/nbp.S
|
|
@ -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
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"
|
__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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue