Skip to content


[pxe] Add memtest.0 target which can be loaded as a PXE NBP
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <>
  • Loading branch information
mcb30 committed Apr 20, 2015
1 parent ac60212 commit fac651c
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 2 deletions.
11 changes: 9 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \
smp.o vmem.o random.o

all: memtest.bin memtest
all: memtest.bin memtest memtest.0

# Link it statically once so I know I don't have undefined
# symbols and then link it dynamically so I have full
Expand All @@ -45,10 +45,17 @@ bootsect.s: bootsect.S config.h defs.h
setup.s: setup.S config.h defs.h
$(CC) -E -traditional $< -o $@

pxe.s: pxe.S config.h defs.h
$(CC) -E -traditional $< -o $@

memtest.bin: memtest_shared.bin bootsect.o setup.o
$(LD) -T bootsect.o setup.o -b binary \
memtest_shared.bin -o memtest.bin

memtest.0: memtest_shared.bin pxe.o setup.o
$(LD) -T pxe.o setup.o -b binary \
memtest_shared.bin -o memtest.0

reloc.o: reloc.c
$(CC) -c $(CFLAGS) -fno-strict-aliasing reloc.c

Expand All @@ -64,7 +71,7 @@ build_number:

rm -f *.o *.s *.iso memtest.bin memtest memtest_shared \
memtest_shared.bin memtest.iso
memtest_shared.bin memtest.iso memtest.0

make all
Expand Down
77 changes: 77 additions & 0 deletions pxe.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
* pxe.S Copyright (C) 2012 Michael Brown <>
* pxe.S is loaded at 0x7c00 by the PXE ROM. It copies the 32-bit
* portion to 0x10000 and jumps into setup.S.

#include "defs.h"

#define RMSIZE (0x200 + 0x200*SETUPSECS)

#define PXENV_ENTRY 0x0a
#define PXENV_UNDI_SHUTDOWN 0x0005

.section ".bootsect", "ax", @progbits
.org 0

.globl _main
/* Canonicalise addresses */
ljmp $BOOTSEG, $pxe_start

/* Store PXENV+ entry point */
movl %es:PXENV_ENTRY(%bx), %eax
movl %eax, %cs:pxenv_vector

/* Copy 32-bit portion to TSTLOAD:0000. Perform copy in
* reverse in 1kB blocks, since regions will overlap and we
* need to copy more than the 64kB real-mode segment limit.
movw $_syssize, %bx /* Length is _syssize (paragraphs) */
addw $63, %bx
andw $~63, %bx /* Round up to nearest kB */
movw $(BOOTSEG + (RMSIZE >> 4)), %ax
addw %bx, %ax
movw %ax, %ds
movw $TSTLOAD, %ax
addw %bx, %ax
movw %ax, %es
1: movw %ds, %ax /* Decrement %ds and %es by 1kB */
subw $64, %ax
movw %ax, %ds
movw %es, %ax
subw $64, %ax
movw %ax, %es
movw $256, %cx /* Copy 1kB block */
xorw %si, %si
xorw %di, %di
rep movsl
subw $64, %bx
jnz 1b

/* Set up %ds and %es for access to local variables */
movw %cs, %ax
movw %ax, %ds
movw %ax, %es

/* Shutdown NIC */
movw $pxenv_undi_shutdown, %di
lcall *pxenv_vector

/* Jump to setup.S */
ljmp $(BOOTSEG + 0x20), $0

.word 0,0

.word 0 /* Status */

.org 512

0 comments on commit fac651c

Please sign in to comment.