david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Merge branch 'master' of /pub/scm/gpxe

This commit is contained in:
Marty Connor 2007-07-06 08:04:55 -04:00
commit 74a1c77820
4 changed files with 75 additions and 14 deletions

View File

@ -54,15 +54,14 @@ To get qemu running is fairly simple:
8. Build Etherboot floppy disk images and pad to 1.44MB 8. Build Etherboot floppy disk images and pad to 1.44MB
pushd ../../src pushd ../../src
make bin/rtl8139.dsk make bin/rtl8139.pdsk
./util/dskpad.pl bin/rtl8139.dsk
popd popd
9. Start qemu 9. Start qemu
export SDL_VIDEO_X11_DGAMOUSE=0 export SDL_VIDEO_X11_DGAMOUSE=0
./qemu/i386-softmmu/qemu -L qemu/pc-bios \ ./qemu/i386-softmmu/qemu -L qemu/pc-bios \
-net nic,model=rtl8139 -net tap,ifname=tap0 \ -net nic,model=rtl8139 -net tap,ifname=tap0 \
-boot a -fda ../../src/bin/rtl8139.dsk -boot a -fda ../../src/bin/rtl8139.pdsk
You should see qemu start up, load up Etherboot and attempt to boot You should see qemu start up, load up Etherboot and attempt to boot
from the network. from the network.

View File

@ -162,7 +162,7 @@ NON_AUTO_SRCS += drivers/net/prism2.c
# "-p 0x1234,0x5678" string to set the PCI IDs. # "-p 0x1234,0x5678" string to set the PCI IDs.
# #
FINALISE_rom = $(MAKEROM) $(MAKEROM_FLAGS) $(TGT_MAKEROM_FLAGS) \ FINALISE_rom = $(MAKEROM) $(MAKEROM_FLAGS) $(TGT_MAKEROM_FLAGS) \
-i$(IDENT) $@ -i$(IDENT) -s 0 $@
# Some ROMs require specific flags to be passed to makerom.pl # Some ROMs require specific flags to be passed to makerom.pl
# #

View File

@ -111,6 +111,12 @@ NON_AUTO_MEDIA += fd0
dd if=$< bs=512 conv=sync of=/dev/fd0 dd if=$< bs=512 conv=sync of=/dev/fd0
sync sync
# rule to create padded disk images
NON_AUTO_MEDIA += pdsk
%pdsk : %dsk
cp $< $@
$(PERL) ./util/dskpad.pl $@
# rule to make a non-emulation ISO boot image # rule to make a non-emulation ISO boot image
NON_AUTO_MEDIA += iso NON_AUTO_MEDIA += iso
%iso: %lkrn util/geniso %iso: %lkrn util/geniso
@ -125,6 +131,7 @@ NON_AUTO_MEDIA += liso
$(BIN)/usbdisk.bin : $(BIN)/usbdisk.o $(BIN)/usbdisk.bin : $(BIN)/usbdisk.o
$(OBJCOPY) -O binary $< $@ $(OBJCOPY) -O binary $< $@
NON_AUTO_MEDIA += usb
%usb: $(BIN)/usbdisk.bin %hd %usb: $(BIN)/usbdisk.bin %hd
cat $^ > $@ cat $^ > $@

View File

@ -23,8 +23,11 @@
* *
*/ */
#include <limits.h>
#include <errno.h>
#include <gpxe/uaccess.h> #include <gpxe/uaccess.h>
#include <gpxe/hidemem.h> #include <gpxe/hidemem.h>
#include <gpxe/memmap.h>
#include <gpxe/umalloc.h> #include <gpxe/umalloc.h>
/** Alignment of external allocated memory */ /** Alignment of external allocated memory */
@ -36,9 +39,6 @@
/** Start of Etherboot text, as defined by the linker */ /** Start of Etherboot text, as defined by the linker */
extern char _text[]; extern char _text[];
/** Top of allocatable memory */
#define TOP ( virt_to_user ( _text ) )
/** An external memory block */ /** An external memory block */
struct external_memory { struct external_memory {
/** Size of this memory block (excluding this header) */ /** Size of this memory block (excluding this header) */
@ -47,11 +47,63 @@ struct external_memory {
int used; int used;
}; };
/** Current lowest allocated block /** Top of heap */
static userptr_t top = UNULL;
/** Bottom of heap (current lowest allocated block) */
static userptr_t bottom = UNULL;
/**
* Initialise external heap
* *
* A value of UNULL indicates that no blocks are currently allocated. * @ret rc Return status code
*/ */
userptr_t bottom = UNULL; static int init_eheap ( void ) {
struct memory_map memmap;
unsigned long heap_size = 0;
unsigned int i;
DBG ( "Allocating external heap\n" );
get_memmap ( &memmap );
for ( i = 0 ; i < memmap.count ; i++ ) {
struct memory_region *region = &memmap.regions[i];
unsigned long r_start, r_end;
unsigned long r_size;
DBG ( "Considering [%llx,%llx)\n", region->start, region->end);
/* Truncate block to 4GB */
if ( region->start > UINT_MAX ) {
DBG ( "...starts after 4GB\n" );
continue;
}
r_start = region->start;
if ( region->end > UINT_MAX ) {
DBG ( "...end truncated to 4GB\n" );
r_end = 0; /* =4GB, given the wraparound */
} else {
r_end = region->end;
}
/* Use largest block */
r_size = ( r_end - r_start );
if ( r_size > heap_size ) {
DBG ( "...new best block found\n" );
top = bottom = phys_to_user ( r_end );
heap_size = r_size;
}
}
if ( ! top ) {
DBG ( "No external heap available\n" );
return -ENOMEM;
}
DBG ( "External heap grows downwards from %lx\n",
user_to_phys ( top, 0 ) );
return 0;
}
/** /**
* Collect free blocks * Collect free blocks
@ -61,7 +113,7 @@ static void ecollect_free ( void ) {
struct external_memory extmem; struct external_memory extmem;
/* Walk the free list and collect empty blocks */ /* Walk the free list and collect empty blocks */
while ( bottom != TOP ) { while ( bottom != top ) {
copy_from_user ( &extmem, bottom, -sizeof ( extmem ), copy_from_user ( &extmem, bottom, -sizeof ( extmem ),
sizeof ( extmem ) ); sizeof ( extmem ) );
if ( extmem.used ) if ( extmem.used )
@ -87,10 +139,13 @@ userptr_t urealloc ( userptr_t ptr, size_t new_size ) {
struct external_memory extmem; struct external_memory extmem;
userptr_t new = ptr; userptr_t new = ptr;
size_t align; size_t align;
int rc;
/* Initialise external memory allocator if necessary */ /* Initialise external memory allocator if necessary */
if ( ! bottom ) if ( ! top ) {
bottom = TOP; if ( ( rc = init_eheap() ) != 0 )
return rc;
}
/* Get block properties into extmem */ /* Get block properties into extmem */
if ( ptr && ( ptr != UNOWHERE ) ) { if ( ptr && ( ptr != UNOWHERE ) ) {
@ -140,7 +195,7 @@ userptr_t urealloc ( userptr_t ptr, size_t new_size ) {
/* Collect any free blocks and update hidden memory region */ /* Collect any free blocks and update hidden memory region */
ecollect_free(); ecollect_free();
hide_region ( EXTMEM, user_to_phys ( bottom, -sizeof ( extmem ) ), hide_region ( EXTMEM, user_to_phys ( bottom, -sizeof ( extmem ) ),
user_to_phys ( TOP, 0 ) ); user_to_phys ( top, 0 ) );
return ( new_size ? new : UNOWHERE ); return ( new_size ? new : UNOWHERE );
} }