summaryrefslogtreecommitdiff
path: root/api_examples
diff options
context:
space:
mode:
authorRafal Jaworowski <raj@semihalf.com>2009-01-23 13:27:15 +0100
committerWolfgang Denk <wd@denx.de>2009-02-18 00:39:34 +0100
commitb84d7d8f1e1066f810866304a16a3583f88e7c98 (patch)
tree78ce8c7adbc218545cd2d94185c54a593767fc58 /api_examples
parent86b4bafdfaf669ede8fd99044abc7e27ea29b4f5 (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.S14
-rw-r--r--api_examples/glue.c11
-rw-r--r--api_examples/glue.h8
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);
/*