From 64bcafb057d770705dee945fd7ced55c746c8fed Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Wed, 8 Feb 2017 11:05:46 +0100
Subject: [PATCH] Added checks when adding segments and modules to detect
 overlapping.

---
 memory/include/mem_module.h |  4 ++--
 memory/include/memory.h     |  2 +-
 memory/src/mem_module.c     | 42 +++++++++++++++++++++++++++++++--
 memory/src/memory.c         | 46 ++++++++++++++++++++++++++++++++++++-
 memory/test/memory_test.c   | 31 ++++++++++++++++++-------
 5 files changed, 111 insertions(+), 14 deletions(-)

diff --git a/memory/include/mem_module.h b/memory/include/mem_module.h
index f11445d..50c085e 100644
--- a/memory/include/mem_module.h
+++ b/memory/include/mem_module.h
@@ -20,7 +20,7 @@ typedef struct
 }TMemModule;
 
 void mem_module_init(TMemModule *module);
-void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
-void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
+unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
+unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length);
 
 #endif
diff --git a/memory/include/memory.h b/memory/include/memory.h
index 6bfa887..060e0a1 100644
--- a/memory/include/memory.h
+++ b/memory/include/memory.h
@@ -17,7 +17,7 @@ typedef struct
 
 void mem_init(TMemory *memory);
 void mem_initialize_data(TMemory *memory);
-void mem_add_module(TMemory *memory, TMemModule *module);
+unsigned char mem_add_module(TMemory *memory, TMemModule *module);
 void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data);
 void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data);
 
diff --git a/memory/src/mem_module.c b/memory/src/mem_module.c
index 61d875b..cf158d1 100644
--- a/memory/src/mem_module.c
+++ b/memory/src/mem_module.c
@@ -1,5 +1,7 @@
 #include "mem_module.h"
 
+extern unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short int mem_length,unsigned short int start_address,unsigned short int length);
+
 void mem_module_init(TMemModule *module)
 {
   unsigned char i;
@@ -17,23 +19,59 @@ void mem_module_init(TMemModule *module)
   module->read_cmd=0x00000000;
 }
 
-void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
+unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
 {
+  TMemSegment *current_segment;
+  unsigned char current_seg;
+ 
   if(module->num_ram_segments<MAX_NUM_SEGMENTS-1)
   {
+    for(current_seg=0;current_seg<module->num_ram_segments;current_seg++)
+    {
+      current_segment=&module->ram_segments[current_seg];
+      if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
+        return 0x00;
+    }
+    for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++)
+    {
+      current_segment=&module->eeprom_segments[current_seg];
+      if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
+        return 0x00;
+    }
     module->ram_segments[module->num_ram_segments].start_address=start_address;
     module->ram_segments[module->num_ram_segments].length=length;
     module->num_ram_segments++;
+    return 0x01;
   }
+  else
+    return 0x00;
 }
 
-void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
+unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length)
 {
+  TMemSegment *current_segment;
+  unsigned char current_seg;
+ 
   if(module->num_eeprom_segments<MAX_NUM_SEGMENTS-1)
   {
+    for(current_seg=0;current_seg<module->num_ram_segments;current_seg++)
+    {
+      current_segment=&module->ram_segments[current_seg];
+      if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
+        return 0x00;
+    }
+    for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++)
+    {
+      current_segment=&module->eeprom_segments[current_seg];
+      if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length))
+        return 0x00;
+    }
     module->eeprom_segments[module->num_eeprom_segments].start_address=start_address;
     module->eeprom_segments[module->num_eeprom_segments].length=length;
     module->num_eeprom_segments++;
+    return 0x01;
   }
+  else
+    return 0x00;
 }
 
diff --git a/memory/src/memory.c b/memory/src/memory.c
index 359c276..fa7f1b8 100644
--- a/memory/src/memory.c
+++ b/memory/src/memory.c
@@ -57,13 +57,57 @@ void mem_initialize_data(TMemory *memory)
   }
 }
 
-void mem_add_module(TMemory *memory, TMemModule *module)
+unsigned char mem_add_module(TMemory *memory, TMemModule *module)
 {
+  TMemModule *current_module;
+  TMemSegment *current_segment,*new_segment;
+  unsigned char current_mod,current_seg,new_seg;
+
   if(memory->num_mem_modules<MAX_NUM_MEM_MODULES-1)
   {
+    /* check segments do not intersect */
+    for(current_mod=0;current_mod<memory->num_mem_modules;current_mod++)
+    {
+      current_module=memory->mem_modules[current_mod];
+      for(current_seg=0;current_seg<current_module->num_ram_segments;current_seg++)
+      {
+        current_segment=&current_module->ram_segments[current_seg];
+        for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
+        {
+          new_segment=&module->ram_segments[new_seg];
+          if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
+            return 0x00;
+        }
+        for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
+        {
+          new_segment=&module->eeprom_segments[new_seg];
+          if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
+            return 0x00;
+        }
+      }
+      for(current_seg=0;current_seg<current_module->num_eeprom_segments;current_seg++)
+      {
+        current_segment=&current_module->eeprom_segments[current_seg];
+        for(new_seg=0;new_seg<module->num_ram_segments;new_seg++)
+        {
+          new_segment=&module->ram_segments[new_seg];
+          if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
+            return 0x00;
+        }
+        for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++)
+        {
+          new_segment=&module->eeprom_segments[new_seg];
+          if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length))
+            return 0x00;
+        }
+      }
+    }
     memory->mem_modules[memory->num_mem_modules]=module;
     memory->num_mem_modules++;
+    return 0x01;
   }
+  else
+    return 0x00;
 }
 
 void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data)
diff --git a/memory/test/memory_test.c b/memory/test/memory_test.c
index 20d7efc..8e43860 100644
--- a/memory/test/memory_test.c
+++ b/memory/test/memory_test.c
@@ -1,5 +1,6 @@
 #include "mem_module.h"
 #include "memory.h"
+#include <stdio.h>
 
 void module1_init_mem(unsigned char init_eeprom)
 {
@@ -45,12 +46,26 @@ int main(void)
   module2.read_cmd=module2_read_cmd;
   mem_init(&memory);
   
-  mem_module_add_ram_segment(&module1,0x0000,0x0005);
-  mem_module_add_ram_segment(&module1,0x0055,0x000A);
-  mem_module_add_eeprom_segment(&module1,0x0100,0x0020);
-  mem_add_module(&memory,&module1);
-
-  mem_module_add_ram_segment(&module2,0x0200,0x0005);
-  mem_module_add_eeprom_segment(&module2,0x0180,0x0020);
-  mem_add_module(&memory,&module2);
+  if(!mem_module_add_ram_segment(&module1,0x0000,0x0005))
+    printf("Impossible to add segment\n");
+  if(!mem_module_add_ram_segment(&module1,0x0055,0x000A))
+    printf("Impossible to add segment\n");
+  if(!mem_module_add_eeprom_segment(&module1,0x0100,0x0020))
+    printf("Impossible to add segment\n");
+  if(!mem_add_module(&memory,&module1))
+    printf("Impossible to add module\n");
+
+  if(!mem_module_add_ram_segment(&module2,0x0200,0x0005))
+    printf("Impossible to add segment\n");
+  if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0020))
+    printf("Impossible to add segment\n");
+  if(!mem_add_module(&memory,&module2))
+    printf("Impossible to add module\n");
+
+  if(!mem_module_add_ram_segment(&module2,0x050,0x000A))
+    printf("Impossible to add segment\n");
+  if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0030))
+    printf("Impossible to add segment\n");
+  if(!mem_add_module(&memory,&module2))
+    printf("Impossible to add module\n");
 }
-- 
GitLab