1
0
Fork 0

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>
utp
Rafal Jaworowski 2009-01-23 13:27:15 +01:00 committed by Wolfgang Denk
parent 86b4bafdfa
commit b84d7d8f1e
3 changed files with 23 additions and 10 deletions

View File

@ -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

View File

@ -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))

View File

@ -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 */
extern void *syscall_ptr;
extern uint32_t search_hint;
int syscall(int, int *, ...);
void * syscall_ptr;
int api_search_sig(struct api_signature **sig);
/*