diff options
author | Rafal Jaworowski <raj@semihalf.com> | 2009-01-23 13:27:15 +0100 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2009-02-18 00:39:34 +0100 |
commit | b84d7d8f1e1066f810866304a16a3583f88e7c98 (patch) | |
tree | 78ce8c7adbc218545cd2d94185c54a593767fc58 /api_examples | |
parent | 86b4bafdfaf669ede8fd99044abc7e27ea29b4f5 (diff) |
API: Use stack pointer as API signature search hint in the glue layer.
De-hardcode range in RAM we search for the API signature. Instead use the stack
pointer as a hint to narrow down the range in which the signature could reside
(it is malloc'ed on the U-Boot heap, and is hoped to remain in some proximity
from stack area). Adjust PowerPC code in API demo to the new scheme.
Signed-off-by: Rafal Czubak <rcz@semihalf.com>
Signed-off-by: Rafal Jaworowski <raj@semihalf.com>
Diffstat (limited to 'api_examples')
-rw-r--r-- | api_examples/crt0.S | 14 | ||||
-rw-r--r-- | api_examples/glue.c | 11 | ||||
-rw-r--r-- | api_examples/glue.h | 8 |
3 files changed, 23 insertions, 10 deletions
diff --git a/api_examples/crt0.S b/api_examples/crt0.S index 8d4f7064eb9..3129a07bcba 100644 --- a/api_examples/crt0.S +++ b/api_examples/crt0.S @@ -29,6 +29,9 @@ .globl _start _start: + lis %r11, search_hint@ha + addi %r11, %r11, search_hint@l + stw %r1, 0(%r11) b main @@ -39,12 +42,15 @@ syscall: lwz %r11, 0(%r11) mtctr %r11 bctr - +#else +#error No support for this arch! +#endif .globl syscall_ptr syscall_ptr: .align 4 .long 0 -#else -#error No support for this arch! -#endif + + .globl search_hint +search_hint: + .long 0 diff --git a/api_examples/glue.c b/api_examples/glue.c index 2bf47ae3d21..200b1637396 100644 --- a/api_examples/glue.c +++ b/api_examples/glue.c @@ -60,13 +60,20 @@ static int valid_sig(struct api_signature *sig) int api_search_sig(struct api_signature **sig) { unsigned char *sp; + uint32_t search_start = 0; + uint32_t search_end = 0; if (sig == NULL) return 0; - sp = (unsigned char *)API_SEARCH_START; + if (search_hint == 0) + search_hint = 255 * 1024 * 1024; - while ((sp + (int)API_SIG_MAGLEN) < (unsigned char *)API_SEARCH_END) { + search_start = search_hint & ~0x000fffff; + search_end = search_start + API_SEARCH_LEN - API_SIG_MAGLEN; + + sp = (unsigned char *)search_start; + while ((sp + API_SIG_MAGLEN) < (unsigned char *)search_end) { if (!memcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN)) { *sig = (struct api_signature *)sp; if (valid_sig(*sig)) diff --git a/api_examples/glue.h b/api_examples/glue.h index a82f783cbe0..0adb8b388aa 100644 --- a/api_examples/glue.h +++ b/api_examples/glue.h @@ -30,12 +30,12 @@ #ifndef _API_GLUE_H_ #define _API_GLUE_H_ -#define API_SEARCH_START (255 * 1024 * 1024) /* start at 1MB below top RAM */ -#define API_SEARCH_END (256 * 1024 * 1024 - 1) /* ...and search to the end */ +#define API_SEARCH_LEN (3 * 1024 * 1024) /* 3MB search range */ -int syscall(int, int *, ...); -void * syscall_ptr; +extern void *syscall_ptr; +extern uint32_t search_hint; +int syscall(int, int *, ...); int api_search_sig(struct api_signature **sig); /* |