mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-12 05:25:11 -04:00
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>
This commit is contained in:
parent
86b4bafdfa
commit
b84d7d8f1e
@ -29,6 +29,9 @@
|
|||||||
|
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
|
lis %r11, search_hint@ha
|
||||||
|
addi %r11, %r11, search_hint@l
|
||||||
|
stw %r1, 0(%r11)
|
||||||
b main
|
b main
|
||||||
|
|
||||||
|
|
||||||
@ -39,12 +42,15 @@ syscall:
|
|||||||
lwz %r11, 0(%r11)
|
lwz %r11, 0(%r11)
|
||||||
mtctr %r11
|
mtctr %r11
|
||||||
bctr
|
bctr
|
||||||
|
#else
|
||||||
|
#error No support for this arch!
|
||||||
|
#endif
|
||||||
|
|
||||||
.globl syscall_ptr
|
.globl syscall_ptr
|
||||||
syscall_ptr:
|
syscall_ptr:
|
||||||
.align 4
|
.align 4
|
||||||
.long 0
|
.long 0
|
||||||
#else
|
|
||||||
#error No support for this arch!
|
.globl search_hint
|
||||||
#endif
|
search_hint:
|
||||||
|
.long 0
|
||||||
|
@ -60,13 +60,20 @@ static int valid_sig(struct api_signature *sig)
|
|||||||
int api_search_sig(struct api_signature **sig) {
|
int api_search_sig(struct api_signature **sig) {
|
||||||
|
|
||||||
unsigned char *sp;
|
unsigned char *sp;
|
||||||
|
uint32_t search_start = 0;
|
||||||
|
uint32_t search_end = 0;
|
||||||
|
|
||||||
if (sig == NULL)
|
if (sig == NULL)
|
||||||
return 0;
|
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)) {
|
if (!memcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN)) {
|
||||||
*sig = (struct api_signature *)sp;
|
*sig = (struct api_signature *)sp;
|
||||||
if (valid_sig(*sig))
|
if (valid_sig(*sig))
|
||||||
|
@ -30,12 +30,12 @@
|
|||||||
#ifndef _API_GLUE_H_
|
#ifndef _API_GLUE_H_
|
||||||
#define _API_GLUE_H_
|
#define _API_GLUE_H_
|
||||||
|
|
||||||
#define API_SEARCH_START (255 * 1024 * 1024) /* start at 1MB below top RAM */
|
#define API_SEARCH_LEN (3 * 1024 * 1024) /* 3MB search range */
|
||||||
#define API_SEARCH_END (256 * 1024 * 1024 - 1) /* ...and search to the end */
|
|
||||||
|
extern void *syscall_ptr;
|
||||||
|
extern uint32_t search_hint;
|
||||||
|
|
||||||
int syscall(int, int *, ...);
|
int syscall(int, int *, ...);
|
||||||
void * syscall_ptr;
|
|
||||||
|
|
||||||
int api_search_sig(struct api_signature **sig);
|
int api_search_sig(struct api_signature **sig);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user