[git commit nptl] Blackfin: add support for automatic loading of L2 SRAM regions

Jie Zhang jie.zhang at analog.com
Wed Aug 19 11:29:41 UTC 2009


commit: http://git.uclibc.org/uClibc/commit/?id=44a5ee0b92e8bd10a27ccd8cb13d7fba06ac901e
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/nptl

These match the kernel/etc... pieces already merged.

Signed-off-by: Jie Zhang <jie.zhang at analog.com>
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
Signed-off-by: Austin Foxley <austinf at cetoncorp.com>
---
 ldso/ldso/bfin/dl-inlines.h |   53 +++++++++++++++++++++++++++++-------------
 1 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/ldso/ldso/bfin/dl-inlines.h b/ldso/ldso/bfin/dl-inlines.h
index 5b37fd0..6524f5e 100644
--- a/ldso/ldso/bfin/dl-inlines.h
+++ b/ldso/ldso/bfin/dl-inlines.h
@@ -504,12 +504,15 @@ __dl_is_special_segment (Elf32_Ehdr *epnt,
       && !(ppnt->p_flags & PF_X))
     return 1;
 
-  /* 0xff700000, 0xff800000, 0xff900000 and 0xffa00000 are also used in
-     GNU ld and linux kernel. They need to be keep synchronized.  */
+  /* 0xfeb00000, 0xfec00000, 0xff700000, 0xff800000, 0xff900000,
+     and 0xffa00000 are also used in GNU ld and linux kernel.
+     They need to be kept synchronized.  */
   if (ppnt->p_vaddr == 0xff700000
       || ppnt->p_vaddr == 0xff800000
       || ppnt->p_vaddr == 0xff900000
-      || ppnt->p_vaddr == 0xffa00000)
+      || ppnt->p_vaddr == 0xffa00000
+      || ppnt->p_vaddr == 0xfeb00000
+      || ppnt->p_vaddr == 0xfec00000)
     return 1;
 
   return 0;
@@ -521,7 +524,7 @@ __dl_map_segment (Elf32_Ehdr *epnt,
 		  int infile,
 		  int flags)
 {
-  char *status, *tryaddr, *l1addr;
+  char *status, *tryaddr, *addr;
   size_t size;
 
   if (((epnt->e_flags & EF_BFIN_CODE_IN_L1) || ppnt->p_vaddr == 0xffa00000)
@@ -536,13 +539,13 @@ __dl_map_segment (Elf32_Ehdr *epnt,
     if (_dl_mmap_check_error(status)
 	|| (tryaddr && tryaddr != status))
       return NULL;
-    l1addr = (char *) _dl_sram_alloc (ppnt->p_filesz, L1_INST_SRAM);
-    if (l1addr != NULL)
-      _dl_dma_memcpy (l1addr, status + (ppnt->p_vaddr & ADDR_ALIGN), ppnt->p_filesz);
+    addr = (char *) _dl_sram_alloc (ppnt->p_filesz, L1_INST_SRAM);
+    if (addr != NULL)
+      _dl_dma_memcpy (addr, status + (ppnt->p_vaddr & ADDR_ALIGN), ppnt->p_filesz);
     _dl_munmap (status, size);
-    if (l1addr == NULL)
+    if (addr == NULL)
       _dl_dprintf(2, "%s:%i: L1 allocation failed\n", _dl_progname, __LINE__);
-    return l1addr;
+    return addr;
   }
 
   if (((epnt->e_flags & EF_BFIN_DATA_IN_L1)
@@ -552,22 +555,38 @@ __dl_map_segment (Elf32_Ehdr *epnt,
       && (ppnt->p_flags & PF_W)
       && !(ppnt->p_flags & PF_X)) {
     if (ppnt->p_vaddr == 0xff800000)
-      l1addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_A_SRAM);
+      addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_A_SRAM);
     else if (ppnt->p_vaddr == 0xff900000)
-      l1addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_B_SRAM);
+      addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_B_SRAM);
     else
-      l1addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_SRAM);
-    if (l1addr == NULL) {
+      addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_SRAM);
+    if (addr == NULL) {
       _dl_dprintf(2, "%s:%i: L1 allocation failed\n", _dl_progname, __LINE__);
     } else {
-      if (_DL_PREAD (infile, l1addr, ppnt->p_filesz, ppnt->p_offset) != ppnt->p_filesz) {
-        _dl_sram_free (l1addr);
+      if (_DL_PREAD (infile, addr, ppnt->p_filesz, ppnt->p_offset) != ppnt->p_filesz) {
+        _dl_sram_free (addr);
         return NULL;
       }
       if (ppnt->p_filesz < ppnt->p_memsz)
-       _dl_memset (l1addr + ppnt->p_filesz, 0, ppnt->p_memsz - ppnt->p_filesz);
+       _dl_memset (addr + ppnt->p_filesz, 0, ppnt->p_memsz - ppnt->p_filesz);
     }
-    return l1addr;
+    return addr;
+  }
+
+  if (ppnt->p_vaddr == 0xfeb00000
+      || ppnt->p_vaddr == 0xfec00000) {
+    addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L2_SRAM);
+    if (addr == NULL) {
+      _dl_dprintf(2, "%s:%i: L2 allocation failed\n", _dl_progname, __LINE__);
+    } else {
+      if (_DL_PREAD (infile, addr, ppnt->p_filesz, ppnt->p_offset) != ppnt->p_filesz) {
+        _dl_sram_free (addr);
+        return NULL;
+      }
+      if (ppnt->p_filesz < ppnt->p_memsz)
+       _dl_memset (addr + ppnt->p_filesz, 0, ppnt->p_memsz - ppnt->p_filesz);
+    }
+    return addr;
   }
 
   return 0;
-- 
1.6.3.3



More information about the uClibc-cvs mailing list