From 59f06d06f05abf20092617fcfa34438c77d92bdd Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sat, 10 Jan 2015 04:42:42 +0300 Subject: xtensa: ldso: coalesce dl_mprotect address ranges This noticeably lowers the number of mprotect calls at program startup, e.g. for busybox: 7 calls vs 1835 calls. Signed-off-by: Max Filippov Signed-off-by: Bernhard Reutner-Fischer --- ldso/ldso/xtensa/dl-startup.h | 20 +++++++++++++++++++- ldso/ldso/xtensa/dl-sysdep.h | 24 +++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) (limited to 'ldso') diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h index b135a4cb8..0c28d5e44 100644 --- a/ldso/ldso/xtensa/dl-startup.h +++ b/ldso/ldso/xtensa/dl-startup.h @@ -83,6 +83,7 @@ do { \ unsigned long l_addr = tpnt->loadaddr; \ Elf32_Word relative_count; \ unsigned long rel_addr; \ + Elf32_Addr prev_got_start = 0, prev_got_end = 0; \ int x; \ \ got_loc = (xtensa_got_location *) \ @@ -93,7 +94,24 @@ do { \ got_start = got_loc[x].offset & ~(PAGE_SIZE - 1); \ got_end = ((got_loc[x].offset + got_loc[x].length + PAGE_SIZE - 1) \ & ~(PAGE_SIZE - 1)); \ - _dl_mprotect ((void *)(got_start + l_addr), got_end - got_start, \ + if (got_end >= prev_got_start && got_start <= prev_got_end) { \ + if (got_end > prev_got_end) \ + prev_got_end = got_end; \ + if (got_start < prev_got_start) \ + prev_got_start = got_start; \ + continue; \ + } else if (prev_got_start != prev_got_end) { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ + PROT_READ | PROT_WRITE | PROT_EXEC); \ + } \ + prev_got_start = got_start; \ + prev_got_end = got_end; \ + } \ +\ + if (prev_got_start != prev_got_end) { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ PROT_READ | PROT_WRITE | PROT_EXEC); \ } \ \ diff --git a/ldso/ldso/xtensa/dl-sysdep.h b/ldso/ldso/xtensa/dl-sysdep.h index a0ed4e5f2..5f8bcb0a8 100644 --- a/ldso/ldso/xtensa/dl-sysdep.h +++ b/ldso/ldso/xtensa/dl-sysdep.h @@ -36,6 +36,7 @@ typedef struct xtensa_got_location_struct { do { \ xtensa_got_location *got_loc; \ Elf32_Addr l_addr = MODULE->loadaddr; \ + Elf32_Addr prev_got_start = 0, prev_got_end = 0; \ int x; \ \ got_loc = (xtensa_got_location *) \ @@ -47,7 +48,28 @@ typedef struct xtensa_got_location_struct { got_start = got_loc[x].offset & ~(PAGE_SIZE - 1); \ got_end = ((got_loc[x].offset + got_loc[x].length + PAGE_SIZE - 1) \ & ~(PAGE_SIZE - 1)); \ - _dl_mprotect ((void *)(got_start + l_addr) , got_end - got_start, \ + if (got_end >= prev_got_start && got_start <= prev_got_end) \ + { \ + if (got_end > prev_got_end) \ + prev_got_end = got_end; \ + if (got_start < prev_got_start) \ + prev_got_start = got_start; \ + continue; \ + } \ + else if (prev_got_start != prev_got_end) \ + { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ + PROT_READ | PROT_WRITE | PROT_EXEC); \ + } \ + prev_got_start = got_start; \ + prev_got_end = got_end; \ + } \ + \ + if (prev_got_start != prev_got_end) \ + { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ PROT_READ | PROT_WRITE | PROT_EXEC); \ } \ \ -- cgit v1.2.3 From 4449e47c2bf51beebaa0b163f4445057b221ad4e Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Sat, 10 Jan 2015 06:48:37 +0300 Subject: xtensa: ldso: drop unused address calculation from _dl_linux_resolve The result of the calculation in register a12 is never used as the function _dl_linux_resolver only accepts 2 arguments. Drop it. Signed-off-by: Max Filippov Signed-off-by: Bernhard Reutner-Fischer --- ldso/ldso/xtensa/resolve.S | 7 ------- 1 file changed, 7 deletions(-) (limited to 'ldso') diff --git a/ldso/ldso/xtensa/resolve.S b/ldso/ldso/xtensa/resolve.S index d1ae8aa04..8061af247 100644 --- a/ldso/ldso/xtensa/resolve.S +++ b/ldso/ldso/xtensa/resolve.S @@ -31,13 +31,6 @@ .global _dl_linux_resolve .type _dl_linux_resolve, @function _dl_linux_resolve: - /* Fix up the high 2 bits of the return address. */ - movi a13, 0f - slli a12, a0, 2 -0: extui a13, a13, 30, 2 - ssai 2 - src a12, a13, a12 - /* Call the fixup function. */ movi a8, _dl_linux_resolver callx8 a8 -- cgit v1.2.3