david/ipxe
Archived
1
0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/arch/i386/core/load_buffer.c

65 lines
1.4 KiB
C
Raw Normal View History

2005-05-09 20:02:22 +02:00
#include "limits.h"
#include "io.h"
#include "memsizes.h"
#include "init.h"
#include "buffer.h"
/*
* Initialise a buffer in an unused portion of memory, to be used for
* loading an image
*
*/
/* Under KEEP_IT_REAL, always use 07c0:0000 as the buffer. Otherwise,
* use a reset_fn that finds the largest available block of RAM.
*/
struct buffer load_buffer = {
.start = 0x7c00,
.end = 0xa0000,
};
#ifndef KEEP_IT_REAL
extern char _text[];
static void init_load_buffer ( void ) {
unsigned int i;
unsigned long size = 0;
load_buffer.start = 0;
load_buffer.end = 0;
/* Find the largest usable segment in memory */
for ( i = 0 ; i < meminfo.map_count ; i++ ) {
unsigned long r_start, r_end;
if ( meminfo.map[i].type != E820_RAM )
continue;
if ( meminfo.map[i].addr + meminfo.map[i].size > ULONG_MAX )
continue;
r_start = meminfo.map[i].addr;
r_end = meminfo.map[i].size;
/* Avoid overlap with Etherboot. Etherboot will be
* located towards the top of a segment, so we need
* only consider one-sided truncation.
*/
if ( ( r_start <= virt_to_phys ( _text ) ) &&
( virt_to_phys ( _text ) < r_end ) ) {
r_end = virt_to_phys ( _text );
}
if ( r_end - r_start > size ) {
size = r_end - r_start;
load_buffer.start = r_start;
load_buffer.end = r_end;
}
}
}
INIT_FN ( INIT_HEAP, init_load_buffer, init_load_buffer, NULL );
#endif