[syslinux:firmware] zonelist: allow syslinux_memmap_type() to demote SMT_FREE to SMT_TERMINAL

syslinux-bot for H. Peter Anvin hpa at zytor.com
Thu Jul 18 05:00:14 PDT 2013


Commit-ID:  d59bc9bd3ea1a10bcace54ed2c4125f3dc1ef3f8
Gitweb:     http://www.syslinux.org/commit/d59bc9bd3ea1a10bcace54ed2c4125f3dc1ef3f8
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Wed, 17 Jul 2013 17:14:09 -0700
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Wed, 17 Jul 2013 17:34:24 -0700

zonelist: allow syslinux_memmap_type() to demote SMT_FREE to SMT_TERMINAL

Allow syslinux_memmap_type() to report any combination of SMT_FREE and
SMT_TERMINAL as SMT_TERMINAL.

Signed-off-by: H. Peter Anvin <hpa at zytor.com>

---
 com32/lib/syslinux/zonelist.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/com32/lib/syslinux/zonelist.c b/com32/lib/syslinux/zonelist.c
index a6de1d8..f869bc6 100644
--- a/com32/lib/syslinux/zonelist.c
+++ b/com32/lib/syslinux/zonelist.c
@@ -156,7 +156,8 @@ int syslinux_add_memmap(struct syslinux_memmap **list,
 
 /*
  * Verify what type a certain memory region is.  This function returns
- * SMT_ERROR if the memory region has multiple types.
+ * SMT_ERROR if the memory region has multiple types, except that
+ * SMT_FREE can be demoted to SMT_TERMINAL.
  */
 enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list,
 						addr_t start, addr_t len)
@@ -168,10 +169,18 @@ enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list,
     while (list->type != SMT_END) {
 	llast = list->next->start - 1;
 	if (list->start <= start) {
-	    if (llast >= last)
+	    if (llast >= last) {
 		return list->type;	/* Region has a well-defined type */
-	    else if (llast >= start)
-		return SMT_ERROR;	/* Crosses region boundary */
+	    } else if (llast >= start) {
+		/* Crosses region boundary */
+		while (valid_terminal_type(list->type)) {
+		    list = list->next;
+		    llast = list->next->start - 1;
+		    if (llast >= last)
+			return SMT_TERMINAL;
+		}
+		return SMT_ERROR;
+	    }
 	}
 	list = list->next;
     }
@@ -300,7 +309,9 @@ int syslinux_memmap_find(struct syslinux_memmap *mmap,
 	return 0;
 
     type = syslinux_memmap_type(mmap, *base, size);
-    if (type == SMT_FREE || type == SMT_TERMINAL)
+
+    /* This assumes SMT_TERMINAL is OK if we can get the exact address */
+    if (valid_terminal_type(type))
 	return 0;
 
     if (!relocate) {


More information about the Syslinux-commits mailing list