/* SPDX-License-Identifier: BSD-2-Clause */ // Written by SASANO Takayoshi #include #include #include "crc32.h" #include "uboot_glue.h" extern uint32_t search_hint; extern void *syscall_ptr; static int check_signature(struct api_signature *signature) { uint32_t crc; struct api_signature s; if (signature != NULL) { s = *signature; s.checksum = 0; crc = crc32((uint8_t *)&s, sizeof(s)); if (crc == signature->checksum) return 1; } return 0; } static struct api_signature *find_signature(void) { void *search_top, *search_end, *sp; /* search range: default stack pointer ~ 3MBytes */ search_top = (void *)(search_hint & 0xfff00000); search_end = (void *) (search_top + 0x00300000 - sizeof(struct api_signature)); for (sp = search_top; sp < search_end; sp += API_SIG_MAGLEN) { if (!memcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN) && check_signature(sp)) return sp; } return NULL; } int init_uboot_syscall(void) { struct api_signature *s; s = find_signature(); if (s != NULL) { syscall_ptr = s->syscall; return 0; } else { syscall_ptr = NULL; return -1; } }