diff options
author | Matt Fleming <matt.fleming@intel.com> | 2013-07-24 15:07:38 +0100 |
---|---|---|
committer | Matt Fleming <matt.fleming@intel.com> | 2013-07-24 15:13:44 +0100 |
commit | 03dda0f1e8eebffc001e3f7708aa7cee4ec9650c (patch) | |
tree | 8fbbc02dd790089b05c3012415139ea22b9baa9c | |
parent | b088a237ca2de823f5272a7b542daeb4d676142e (diff) | |
download | syslinux-03dda0f1e8eebffc001e3f7708aa7cee4ec9650c.tar.gz |
pxe: mark all PXE regions as SMT_TERMINALsyslinux-6.02-pre11
There are more than just the UNDI code and data regions. Mark all of the
regions as SMT_TERMINAL if the start address and size are non-zero.
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
-rw-r--r-- | core/fs/pxe/bios.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/core/fs/pxe/bios.c b/core/fs/pxe/bios.c index 5f618248..c0102b31 100644 --- a/core/fs/pxe/bios.c +++ b/core/fs/pxe/bios.c @@ -11,8 +11,12 @@ static uint16_t real_base_mem; /* Amount of DOS memory after freeing */ static bool has_gpxe; static uint32_t gpxe_funcs; -static addr_t pxe_code_start, pxe_code_size; -static addr_t pxe_data_start, pxe_data_size; +struct pxe_region { + addr_t start; + addr_t size; +}; + +static struct pxe_region __pxe_regions[PXE_Seg_BC_CodeWrite + 1]; /* * Validity check on possible !PXE structure in buf @@ -94,7 +98,11 @@ static const struct pxenv_t *memory_scan_for_pxenv_struct(void) static int pxelinux_scan_memory(scan_memory_callback_t callback, void *data) { - int rv = 0; + addr_t start, end, size; + int i, rv = 0; + + if (KeepPXE) + return 0; /* * If we are planning on calling unload_pxe() and unmapping the PXE @@ -102,19 +110,46 @@ static int pxelinux_scan_memory(scan_memory_callback_t callback, void *data) * that region as SMT_TERMINAL to indicate that the region will * become free at some point in the future. */ - if (!KeepPXE) { - dprintf("Marking PXE code region 0x%x - 0x%x as SMT_TERMINAL\n", - pxe_code_start, pxe_code_start + pxe_code_size); - rv = callback(data, pxe_code_start, pxe_code_size, SMT_TERMINAL); - - dprintf("Marking PXE data region 0x%x - 0x%x as SMT_TERMINAL\n", - pxe_data_start, pxe_data_start + pxe_data_size); - rv = callback(data, pxe_data_start, pxe_data_size, SMT_TERMINAL); + for (i = PXE_Seg_Stack; i <= PXE_Seg_BC_CodeWrite; i++) { + start = __pxe_regions[i].start; + size = __pxe_regions[i].size; + end = start + size; + + if (!start || !size) + continue; + + dprintf("Marking PXE region (%d) 0x%x - 0x%x as SMT_TERMINAL\n", + i, start, end); + rv = callback(data, start, size, SMT_TERMINAL); } return rv; } +static void setup_pxenv_regions(const struct pxenv_t *pxenv) +{ + __pxe_regions[PXE_Seg_Stack].start = pxenv->stackseg << 4; + __pxe_regions[PXE_Seg_Stack].size = pxenv->stacksize; + __pxe_regions[PXE_Seg_UNDIData].start = pxenv->undidataseg << 4; + __pxe_regions[PXE_Seg_UNDIData].size = pxenv->undidatasize; + __pxe_regions[PXE_Seg_UNDICode].start = pxenv->undicodeseg << 4; + __pxe_regions[PXE_Seg_UNDICode].size = pxenv->undicodesize; + __pxe_regions[PXE_Seg_BC_Data].start = pxenv->bc_dataseg << 4; + __pxe_regions[PXE_Seg_BC_Data].size = pxenv->bc_datasize; + __pxe_regions[PXE_Seg_BC_Code].start = pxenv->bc_codeseg << 4; + __pxe_regions[PXE_Seg_BC_Code].size = pxenv->bc_codesize; +} + +static void setup_pxe_regions(const pxe_segdesc_t *seg) +{ + int i; + + for (i = PXE_Seg_Stack; i <= PXE_Seg_BC_CodeWrite; i++) { + __pxe_regions[i].start = seg[i].sel << 4; + __pxe_regions[i].size = seg[i].size; + } +} + /* * Find the !PXE structure; we search for the following, in order: * @@ -213,6 +248,8 @@ int pxe_init(bool quiet) code_seg = pxenv->undicodeseg; PXEEntry = pxenv->rmentry; type = "PXENV+"; + + setup_pxenv_regions(pxenv); goto have_entrypoint; have_pxe: @@ -223,6 +260,7 @@ int pxe_init(bool quiet) PXEEntry = pxe->entrypointsp; type = "!PXE"; + setup_pxe_regions(pxe->seg); have_entrypoint: if (!quiet) { printf("%s entry point found (we hope) at %04X:%04X via plan %c\n", @@ -231,12 +269,6 @@ int pxe_init(bool quiet) printf("UNDI data segment at %04X len %04X\n", data_seg, data_len); } - pxe_code_start = code_seg << 4; - pxe_code_size = code_len; - - pxe_data_start = data_seg << 4; - pxe_data_size = data_len; - syslinux_memscan_new(pxelinux_scan_memory); code_seg = code_seg + ((code_len + 15) >> 4); |