[syslinux:firmware] pxe: mark all PXE regions as SMT_TERMINAL

syslinux-bot for Matt Fleming matt.fleming at intel.com
Wed Jul 24 07:24:10 PDT 2013


Commit-ID:  03dda0f1e8eebffc001e3f7708aa7cee4ec9650c
Gitweb:     http://www.syslinux.org/commit/03dda0f1e8eebffc001e3f7708aa7cee4ec9650c
Author:     Matt Fleming <matt.fleming at intel.com>
AuthorDate: Wed, 24 Jul 2013 15:07:38 +0100
Committer:  Matt Fleming <matt.fleming at intel.com>
CommitDate: Wed, 24 Jul 2013 15:13:44 +0100

pxe: mark all PXE regions as SMT_TERMINAL

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 at intel.com>

---
 core/fs/pxe/bios.c | 66 ++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 49 insertions(+), 17 deletions(-)

diff --git a/core/fs/pxe/bios.c b/core/fs/pxe/bios.c
index 5f61824..c0102b3 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);


More information about the Syslinux-commits mailing list