svn commit: trunk/uClibc/ldso/ldso/bfin
bernds at uclibc.org
bernds at uclibc.org
Fri Jan 18 05:46:59 PST 2008
Author: bernds
Date: 2008-01-18 05:46:58 -0800 (Fri, 18 Jan 2008)
New Revision: 20872
Log:
Update dl-inlines.h from Blackfin repository.
Modified:
trunk/uClibc/ldso/ldso/bfin/dl-inlines.h
Changeset:
Modified: trunk/uClibc/ldso/ldso/bfin/dl-inlines.h
===================================================================
--- trunk/uClibc/ldso/ldso/bfin/dl-inlines.h 2008-01-18 13:14:19 UTC (rev 20871)
+++ trunk/uClibc/ldso/ldso/bfin/dl-inlines.h 2008-01-18 13:46:58 UTC (rev 20872)
@@ -18,7 +18,7 @@
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
USA. */
-#include <bits/bfin_sram.h>
+#include <bfin_sram.h>
#ifndef _dl_assert
# define _dl_assert(expr)
@@ -463,6 +463,17 @@
struct elf32_fdpic_loadseg *segdata;
ssize_t offs;
segdata = loadaddr.map->segs + i;
+
+ /* FIXME:
+ A more cleaner way is to add type for struct elf32_fdpic_loadseg,
+ and release the memory according to the type.
+ Currently, we hardcode the memory address of L1 SRAM. */
+ if ((segdata->addr & 0xff800000) == 0xff800000)
+ {
+ _dl_sram_free ((void *)segdata->addr);
+ continue;
+ }
+
offs = (segdata->p_vaddr & ADDR_ALIGN);
_dl_munmap ((void*)segdata->addr - offs,
segdata->p_memsz + offs);
@@ -493,7 +504,15 @@
&& !(ppnt->p_flags & PF_X))
return 1;
- return 0;
+ /* 0xff700000, 0xff800000, 0xff900000 and 0xffa00000 are also used in
+ GNU ld and linux kernel. They need to be keep synchronized. */
+ if (ppnt->p_vaddr == 0xff700000
+ || ppnt->p_vaddr == 0xff800000
+ || ppnt->p_vaddr == 0xff900000
+ || ppnt->p_vaddr == 0xffa00000)
+ return 1;
+
+ return 0;
}
inline static char *
@@ -505,7 +524,7 @@
char *status, *tryaddr, *l1addr;
size_t size;
- if ((epnt->e_flags & EF_BFIN_CODE_IN_L1)
+ if (((epnt->e_flags & EF_BFIN_CODE_IN_L1) || ppnt->p_vaddr == 0xffa00000)
&& !(ppnt->p_flags & PF_W)
&& (ppnt->p_flags & PF_X)) {
status = (char *) _dl_mmap
@@ -522,20 +541,32 @@
_dl_dma_memcpy (l1addr, status + (ppnt->p_vaddr & ADDR_ALIGN), ppnt->p_filesz);
_dl_munmap (status, size);
if (l1addr == NULL)
- return NULL;
+ _dl_dprintf(2, "%s:%i: L1 allocation failed\n", _dl_progname, __LINE__);
return l1addr;
}
- if ((epnt->e_flags & EF_BFIN_DATA_IN_L1)
+ if (((epnt->e_flags & EF_BFIN_DATA_IN_L1)
+ || ppnt->p_vaddr == 0xff700000
+ || ppnt->p_vaddr == 0xff800000
+ || ppnt->p_vaddr == 0xff900000)
&& (ppnt->p_flags & PF_W)
&& !(ppnt->p_flags & PF_X)) {
- l1addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_SRAM);
- if (l1addr == NULL
- || (_DL_PREAD (infile, l1addr, ppnt->p_filesz, ppnt->p_offset)
- != ppnt->p_filesz))
- return NULL;
- if (ppnt->p_filesz < ppnt->p_memsz)
- _dl_memset (l1addr + ppnt->p_filesz, 0, ppnt->p_memsz - ppnt->p_filesz);
+ if (ppnt->p_vaddr == 0xff800000)
+ l1addr = (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);
+ else
+ l1addr = (char *) _dl_sram_alloc (ppnt->p_memsz, L1_DATA_SRAM);
+ if (l1addr == 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);
+ return NULL;
+ }
+ if (ppnt->p_filesz < ppnt->p_memsz)
+ _dl_memset (l1addr + ppnt->p_filesz, 0, ppnt->p_memsz - ppnt->p_filesz);
+ }
return l1addr;
}
More information about the uClibc-cvs
mailing list