aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2013-07-24 15:07:38 +0100
committerMatt Fleming <matt.fleming@intel.com>2013-07-24 15:13:44 +0100
commit03dda0f1e8eebffc001e3f7708aa7cee4ec9650c (patch)
tree8fbbc02dd790089b05c3012415139ea22b9baa9c
parentb088a237ca2de823f5272a7b542daeb4d676142e (diff)
downloadsyslinux-03dda0f1e8eebffc001e3f7708aa7cee4ec9650c.tar.gz
syslinux-03dda0f1e8eebffc001e3f7708aa7cee4ec9650c.tar.xz
syslinux-03dda0f1e8eebffc001e3f7708aa7cee4ec9650c.zip
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.c66
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);